12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2003-2014, International Business Machines Corporation and    *
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.text;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParseException;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * Exception that signals an error has occurred while parsing the
152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * input to StringPrep or IDNA.
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author Ram Viswanadha
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 2.8
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class StringPrepParseException extends ParseException {
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Generated by serialver from JDK 1.4.1_01
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static final long serialVersionUID = 7160264827701651255L;
232d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int INVALID_CHAR_FOUND      = 0;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int ILLEGAL_CHAR_FOUND      = 1;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int PROHIBITED_ERROR        = 2;
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int UNASSIGNED_ERROR        = 3;
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int CHECK_BIDI_ERROR        = 4;
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int STD3_ASCII_RULES_ERROR  = 5;
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int ACE_PREFIX_ERROR        = 6;
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int VERIFICATION_ERROR      = 7;
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int LABEL_TOO_LONG_ERROR    = 8;
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int BUFFER_OVERFLOW_ERROR   = 9;
642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int ZERO_LENGTH_LABEL   = 10;
692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.8
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final int DOMAIN_NAME_TOO_LONG_ERROR   = 11;
742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Construct a ParseException object with the given message
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * and error code
782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     *
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param message A string describing the type of error that occurred
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param error   The error that has occurred
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public StringPrepParseException(String message,int error){
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        super(message, -1);
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.error = error;
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.line = 0;
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Construct a ParseException object with the given message and
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * error code
922d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     *
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param message A string describing the type of error that occurred
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param error   The error that has occurred
952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * @param rules   The input rules string
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param pos     The position of error in the rules string
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public StringPrepParseException(String message,int error, String rules, int pos){
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        super(message, -1);
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.error = error;
1022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        setContext(rules,pos);
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.line = 0;
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Construct  a ParseException object with the given message and error code
1072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     *
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param message    A string describing the type of error that occurred
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param error      The error that has occurred
1102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * @param rules      The input rules string
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param pos        The position of error in the rules string
1122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * @param lineNumber The line number at which the error has occurred.
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                   If the parse engine is not using this field, it should set it to zero.  Otherwise
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                   it should be a positive integer. The default value of this field
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                   is -1. It will be set to 0 if the code populating this struct is not
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                   using line numbers.
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public StringPrepParseException(String message, int error, String rules, int pos, int lineNumber){
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        super(message, -1);
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.error = error;
1222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        setContext(rules,pos);
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.line = lineNumber;
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Compare this ParseException to another and evaluate if they are equal.
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The comparison works only on the type of error and does not compare
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the rules strings, if any, for equality.
1292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     *
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param other The exception that this object should be compared to
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return true if the objects are equal, false if unequal
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Override
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public boolean equals(Object other){
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(!(other instanceof StringPrepParseException)){
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return false;
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return ((StringPrepParseException)other).error == this.error;
1402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Mock implementation of hashCode(). This implementation always returns a constant
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * value. When Java assertion is enabled, this method triggers an assertion failure.
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Override
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int hashCode() {
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assert false : "hashCode not designed";
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return 42;
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns the position of error in the rules string
1582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     *
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return String
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Override
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public String toString(){
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuilder buf = new StringBuilder();
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append(super.getMessage());
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append(". line:  ");
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append(line);
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append(". preContext:  ");
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append(preContext);
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append(". postContext: ");
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append(postContext);
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        buf.append("\n");
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return buf.toString();
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private int error;
1772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The line on which the error occurred.  If the parse engine
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * is not using this field, it should set it to zero.  Otherwise
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * it should be a positive integer. The default value of this field
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * is -1. It will be set to 0 if the code populating this struct is not
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * using line numbers.
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private int line;
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Textual context before the error.  Null-terminated.
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * May be the empty string if not implemented by parser.
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private StringBuffer preContext = new StringBuffer();
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Textual context after the error.  Null-terminated.
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * May be the empty string if not implemented by parser.
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private StringBuffer postContext =  new StringBuffer();
1992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final int PARSE_CONTEXT_LEN = 16;
2012d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void setPreContext(String str, int pos){
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        setPreContext(str.toCharArray(),pos);
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void setPreContext(char[] str, int pos){
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int start = (pos <= PARSE_CONTEXT_LEN)? 0 : (pos - (PARSE_CONTEXT_LEN-1));
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int len = (start <= PARSE_CONTEXT_LEN)? start : PARSE_CONTEXT_LEN;
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        preContext.append(str,start,len);
2102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void setPostContext(String str, int pos){
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        setPostContext(str.toCharArray(),pos);
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void setPostContext(char[] str, int pos){
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int start = pos;
2192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        int len  = str.length - start;
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        postContext.append(str,start,len);
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2232d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void setContext(String str,int pos){
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        setPreContext(str,pos);
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        setPostContext(str,pos);
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2282d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert     * Returns the error code of this exception.
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * This method is only used for testing to verify the error.
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return The error code
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.8
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int getError(){
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return error;
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
239