17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
3f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert* Copyright (C) 1996-2015, International Business Machines Corporation and
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* others. All Rights Reserved.
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.text;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Comparator;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Enumeration;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Iterator;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.LinkedList;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.MissingResourceException;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Set;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.ICUDebug;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.ICUResourceBundle;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.coll.CollationData;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.coll.CollationRoot;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UCharacter;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UProperty;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UScript;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Freezable;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ICUException;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale.Category;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.UResourceBundle;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.VersionInfo;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* {@icuenhanced java.text.Collator}.{@icu _usage_}
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>Collator performs locale-sensitive string comparison. A concrete
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* subclass, RuleBasedCollator, allows customization of the collation
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* ordering by the use of rule sets.</p>
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>A Collator is thread-safe only when frozen. See {{@link #isFrozen()} and {@link Freezable}.
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>Following the <a href=http://www.unicode.org>Unicode
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Consortium</a>'s specifications for the
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <a href="http://www.unicode.org/unicode/reports/tr10/">Unicode Collation
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Algorithm (UCA)</a>, there are 5 different levels of strength used
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* in comparisons:
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <ul>
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <li>PRIMARY strength: Typically, this is used to denote differences between
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     base characters (for example, "a" &lt; "b").
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     It is the strongest difference. For example, dictionaries are divided
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     into different sections by base character.
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <li>SECONDARY strength: Accents in the characters are considered secondary
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     differences (for example, "as" &lt; "&agrave;s" &lt; "at"). Other
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     differences
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     between letters can also be considered secondary differences, depending
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     on the language. A secondary difference is ignored when there is a
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     primary difference anywhere in the strings.
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <li>TERTIARY strength: Upper and lower case differences in characters are
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     distinguished at tertiary strength (for example, "ao" &lt; "Ao" &lt;
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     "a&ograve;"). In addition, a variant of a letter differs from the base
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     form on the tertiary strength (such as "A" and "&#9398;"). Another
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     example is the
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     difference between large and small Kana. A tertiary difference is ignored
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     when there is a primary or secondary difference anywhere in the strings.
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <li>QUATERNARY strength: When punctuation is ignored
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     (see <a href="http://userguide.icu-project.org/collation/concepts#TOC-Ignoring-Punctuation">
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     Ignoring Punctuations in the User Guide</a>) at PRIMARY to TERTIARY
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     strength, an additional strength level can
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     be used to distinguish words with and without punctuation (for example,
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     "ab" &lt; "a-b" &lt; "aB").
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     This difference is ignored when there is a PRIMARY, SECONDARY or TERTIARY
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     difference. The QUATERNARY strength should only be used if ignoring
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     punctuation is required.
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <li>IDENTICAL strength:
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     When all other strengths are equal, the IDENTICAL strength is used as a
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     tiebreaker. The Unicode code point values of the NFD form of each string
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     are compared, just in case there is no difference.
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     For example, Hebrew cantellation marks are only distinguished at this
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     strength. This strength should be used sparingly, as only code point
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     value differences between two strings is an extremely rare occurrence.
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     Using this strength substantially decreases the performance for both
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     comparison and collation key generation APIs. This strength also
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     increases the size of the collation key.
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* </ul>
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Unlike the JDK, ICU4J's Collator deals only with 2 decomposition modes,
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* the canonical decomposition mode and one that does not use any decomposition.
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* The compatibility decomposition mode, java.text.Collator.FULL_DECOMPOSITION
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* is not supported here. If the canonical
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* decomposition mode is set, the Collator handles un-normalized text properly,
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* producing the same results as if the text were normalized in NFD. If
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* canonical decomposition is turned off, it is the user's responsibility to
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* ensure that all text is already in the appropriate form before performing
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* a comparison or before getting a CollationKey.</p>
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>For more information about the collation service see the
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <a href="http://userguide.icu-project.org/collation">User Guide</a>.</p>
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>Examples of use
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <pre>
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* // Get the Collator for US English and set its strength to PRIMARY
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Collator usCollator = Collator.getInstance(Locale.US);
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* usCollator.setStrength(Collator.PRIMARY);
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* if (usCollator.compare("abc", "ABC") == 0) {
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     System.out.println("Strings are equivalent");
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* }
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* The following example shows how to compare two strings using the
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Collator for the default locale.
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* // Compare two strings in the default locale
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Collator myCollator = Collator.getInstance();
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* myCollator.setDecomposition(NO_DECOMPOSITION);
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* if (myCollator.compare("&agrave;&#92;u0325", "a&#92;u0325&#768;") != 0) {
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     System.out.println("&agrave;&#92;u0325 is not equals to a&#92;u0325&#768; without decomposition");
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     myCollator.setDecomposition(CANONICAL_DECOMPOSITION);
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     if (myCollator.compare("&agrave;&#92;u0325", "a&#92;u0325&#768;") != 0) {
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*         System.out.println("Error: &agrave;&#92;u0325 should be equals to a&#92;u0325&#768; with decomposition");
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     }
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     else {
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*         System.out.println("&agrave;&#92;u0325 is equals to a&#92;u0325&#768; with decomposition");
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     }
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* }
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* else {
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*     System.out.println("Error: &agrave;&#92;u0325 should be not equals to a&#92;u0325&#768; without decomposition");
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* }
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* </pre>
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* </p>
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @see RuleBasedCollator
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @see CollationKey
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @author Syn Wee Quek
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @stable ICU 2.8
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic abstract class Collator implements Comparator<Object>, Freezable<Collator>, Cloneable
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // public data members ---------------------------------------------------
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Strongest collator strength value. Typically used to denote differences
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * between base characters. See class documentation for more explanation.
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setStrength
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getStrength
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public final static int PRIMARY = 0;
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Second level collator strength value.
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Accents in the characters are considered secondary differences.
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Other differences between letters can also be considered secondary
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * differences, depending on the language.
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * See class documentation for more explanation.
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setStrength
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getStrength
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public final static int SECONDARY = 1;
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Third level collator strength value.
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Upper and lower case differences in characters are distinguished at this
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * strength level. In addition, a variant of a letter differs from the base
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * form on the tertiary level.
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * See class documentation for more explanation.
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setStrength
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getStrength
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public final static int TERTIARY = 2;
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Fourth level collator strength value.
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * When punctuation is ignored
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * (see <a href="http://userguide.icu-project.org/collation/concepts#TOC-Ignoring-Punctuation">
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Ignoring Punctuation in the User Guide</a>) at PRIMARY to TERTIARY
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * strength, an additional strength level can
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * be used to distinguish words with and without punctuation.
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * See class documentation for more explanation.
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setStrength
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getStrength
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public final static int QUATERNARY = 3;
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Smallest Collator strength value. When all other strengths are equal,
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the IDENTICAL strength is used as a tiebreaker. The Unicode code point
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * values of the NFD form of each string are compared, just in case there
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * is no difference.
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * See class documentation for more explanation.
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * </p>
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Note this value is different from JDK's
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * </p>
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public final static int IDENTICAL = 15;
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icunote} This is for backwards compatibility with Java APIs only.  It
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * should not be used, IDENTICAL should be used instead.  ICU's
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * collation does not support Java's FULL_DECOMPOSITION mode.
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.4
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public final static int FULL_DECOMPOSITION = IDENTICAL;
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Decomposition mode value. With NO_DECOMPOSITION set, Strings
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * will not be decomposed for collation. This is the default
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * decomposition setting unless otherwise specified by the locale
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * used to create the Collator.</p>
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p><strong>Note</strong> this value is different from the JDK's.</p>
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #CANONICAL_DECOMPOSITION
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getDecomposition
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setDecomposition
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public final static int NO_DECOMPOSITION = 16;
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Decomposition mode value. With CANONICAL_DECOMPOSITION set,
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * characters that are canonical variants according to the Unicode standard
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * will be decomposed for collation.</p>
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>CANONICAL_DECOMPOSITION corresponds to Normalization Form D as
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * described in <a href="http://www.unicode.org/unicode/reports/tr15/">
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Unicode Technical Report #15</a>.
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * </p>
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #NO_DECOMPOSITION
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getDecomposition
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setDecomposition
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public final static int CANONICAL_DECOMPOSITION = 17;
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Reordering codes for non-script groups that can be reordered under collation.
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getReorderCodes
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setReorderCodes
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getEquivalentReorderCodes
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.8
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static interface ReorderCodes {
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * A special reordering code that is used to specify the default reordering codes for a locale.
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 4.8
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public final static int DEFAULT          = -1;  // == UScript.INVALID_CODE
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * A special reordering code that is used to specify no reordering codes.
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 4.8
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public final static int NONE          = UScript.UNKNOWN;
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * A special reordering code that is used to specify all other codes used for reordering except
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * for the codes listed as ReorderingCodes and those listed explicitly in a reordering.
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 4.8
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public final static int OTHERS          = UScript.UNKNOWN;
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Characters with the space property.
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * This is equivalent to the rule value "space".
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 4.8
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public final static int SPACE          = 0x1000;
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * The first entry in the enumeration of reordering groups. This is intended for use in
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * range checking and enumeration of the reorder codes.
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 4.8
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public final static int FIRST          = SPACE;
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Characters with the punctuation property.
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * This is equivalent to the rule value "punct".
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 4.8
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public final static int PUNCTUATION    = 0x1001;
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Characters with the symbol property.
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * This is equivalent to the rule value "symbol".
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 4.8
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public final static int SYMBOL         = 0x1002;
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Characters with the currency property.
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * This is equivalent to the rule value "currency".
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 4.8
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public final static int CURRENCY       = 0x1003;
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Characters with the digit property.
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * This is equivalent to the rule value "digit".
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 4.8
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public final static int DIGIT          = 0x1004;
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * The limit of the reorder codes. This is intended for use in range checking
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * and enumeration of the reorder codes.
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 4.8
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public final static int LIMIT          = 0x1005;
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // public methods --------------------------------------------------------
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Compares the equality of two Collator objects. Collator objects are equal if they have the same
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * collation (sorting & searching) behavior.
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>The base class checks for null and for equal types.
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Subclasses should override.
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param obj the Collator to compare to.
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return true if this Collator has exactly the same collation behavior as obj, false otherwise.
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Override
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public boolean equals(Object obj) {
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Subclasses: Call this method and then add more specific checks.
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return this == obj || (obj != null && getClass() == obj.getClass());
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // public setters --------------------------------------------------------
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void checkNotFrozen() {
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (isFrozen()) {
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new UnsupportedOperationException("Attempt to modify frozen Collator");
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Sets this Collator's strength attribute. The strength attribute
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * determines the minimum level of difference considered significant
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * during comparison.</p>
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>The base class method does nothing. Subclasses should override it if appropriate.
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>See the Collator class description for an example of use.</p>
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param newStrength the new strength value.
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getStrength
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #PRIMARY
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #SECONDARY
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #TERTIARY
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #QUATERNARY
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #IDENTICAL
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @throws IllegalArgumentException if the new strength value is not valid.
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void setStrength(int newStrength)
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkNotFrozen();
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return this, for chaining
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal Used in UnicodeTools
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public Collator setStrength2(int newStrength)
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        setStrength(newStrength);
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return this;
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Sets the decomposition mode of this Collator.  Setting this
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * decomposition attribute with CANONICAL_DECOMPOSITION allows the
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Collator to handle un-normalized text properly, producing the
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * same results as if the text were normalized. If
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * NO_DECOMPOSITION is set, it is the user's responsibility to
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * insure that all text is already in the appropriate form before
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * a comparison or before getting a CollationKey. Adjusting
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * decomposition mode allows the user to select between faster and
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * more complete collation behavior.</p>
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>Since a great many of the world's languages do not require
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * text normalization, most locales set NO_DECOMPOSITION as the
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * default decomposition mode.</p>
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>The base class method does nothing. Subclasses should override it if appropriate.
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>See getDecomposition for a description of decomposition
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * mode.</p>
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param decomposition the new decomposition mode
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getDecomposition
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #NO_DECOMPOSITION
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #CANONICAL_DECOMPOSITION
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @throws IllegalArgumentException If the given value is not a valid
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *            decomposition mode.
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void setDecomposition(int decomposition)
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkNotFrozen();
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Sets the reordering codes for this collator.
402f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * Collation reordering allows scripts and some other groups of characters
403f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * to be moved relative to each other. This reordering is done on top of
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the DUCET/CLDR standard collation order. Reordering can specify groups to be placed
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * at the start and/or the end of the collation order. These groups are specified using
406f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * UScript codes and {@link Collator.ReorderCodes} entries.
407f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     *
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>By default, reordering codes specified for the start of the order are placed in the
409f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * order given after several special non-script blocks. These special groups of characters
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * are space, punctuation, symbol, currency, and digit. These special groups are represented with
411f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * {@link Collator.ReorderCodes} entries. Script groups can be intermingled with
412f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * these special non-script groups if those special groups are explicitly specified in the reordering.
413f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     *
414f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * <p>The special code {@link Collator.ReorderCodes#OTHERS OTHERS}
415f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * stands for any script that is not explicitly
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * mentioned in the list of reordering codes given. Anything that is after OTHERS
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * will go at the very end of the reordering in the order given.
418f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     *
419f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * <p>The special reorder code {@link Collator.ReorderCodes#DEFAULT DEFAULT}
420f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * will reset the reordering for this collator
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * to the default for this collator. The default reordering may be the DUCET/CLDR order or may be a reordering that
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * was specified when this collator was created from resource data or from rules. The
423f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * DEFAULT code <b>must</b> be the sole code supplied when it is used.
424f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * If not, then an {@link IllegalArgumentException} will be thrown.
425f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     *
426f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * <p>The special reorder code {@link Collator.ReorderCodes#NONE NONE}
427f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * will remove any reordering for this collator.
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The result of setting no reordering will be to have the DUCET/CLDR ordering used. The
429f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * NONE code <b>must</b> be the sole code supplied when it is used.
430f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     *
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param order the reordering codes to apply to this collator; if this is null or an empty array
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * then this clears any existing reordering
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getReorderCodes
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getEquivalentReorderCodes
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see Collator.ReorderCodes
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see UScript
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.8
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void setReorderCodes(int... order)
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        throw new UnsupportedOperationException("Needs to be implemented by the subclass.");
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // public getters --------------------------------------------------------
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns the Collator for the current default locale.
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The default locale is determined by java.util.Locale.getDefault().
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the Collator for the default locale (for example, en_US) if it
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         is created successfully. Otherwise if there is no Collator
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         associated with the current locale, the root collator
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         will be returned.
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see java.util.Locale#getDefault()
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getInstance(Locale)
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final Collator getInstance()
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getInstance(ULocale.getDefault());
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Clones the collator.
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.6
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return a clone of this collator.
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public Object clone() throws CloneNotSupportedException {
4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return super.clone();
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // begin registry stuff
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * A factory used with registerFactory to register multiple collators and provide
4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * display names for them.  If standard locale display names are sufficient,
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Collator instances may be registered instead.
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p><b>Note:</b> as of ICU4J 3.2, the default API for CollatorFactory uses
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * ULocale instead of Locale.  Instead of overriding createCollator(Locale),
4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * new implementations should override createCollator(ULocale).  Note that
4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * one of these two methods <b>MUST</b> be overridden or else an infinite
4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * loop will occur.
4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.6
4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static abstract class CollatorFactory {
4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Return true if this factory will be visible.  Default is true.
4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * If not visible, the locales supported by this factory will not
4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * be listed by getAvailableLocales.
4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         *
4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @return true if this factory is visible
4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 2.6
4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public boolean visible() {
4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return true;
4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Return an instance of the appropriate collator.  If the locale
4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * is not supported, return null.
5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * <b>Note:</b> as of ICU4J 3.2, implementations should override
5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * this method instead of createCollator(Locale).
5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @param loc the locale for which this collator is to be created.
5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @return the newly created collator.
5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 3.2
5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public Collator createCollator(ULocale loc) {
5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return createCollator(loc.toLocale());
5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Return an instance of the appropriate collator.  If the locale
5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * is not supported, return null.
5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * <p><b>Note:</b> as of ICU4J 3.2, implementations should override
5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * createCollator(ULocale) instead of this method, and inherit this
5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * method's implementation.  This method is no longer abstract
5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * and instead delegates to createCollator(ULocale).
5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @param loc the locale for which this collator is to be created.
5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @return the newly created collator.
5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 2.6
5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         public Collator createCollator(Locale loc) {
5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return createCollator(ULocale.forLocale(loc));
5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Return the name of the collator for the objectLocale, localized for the displayLocale.
5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * If objectLocale is not visible or not defined by the factory, return null.
5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @param objectLocale the locale identifying the collator
5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @param displayLocale the locale for which the display name of the collator should be localized
5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @return the display name
5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 2.6
5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public String getDisplayName(Locale objectLocale, Locale displayLocale) {
5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return getDisplayName(ULocale.forLocale(objectLocale), ULocale.forLocale(displayLocale));
5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Return the name of the collator for the objectLocale, localized for the displayLocale.
5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * If objectLocale is not visible or not defined by the factory, return null.
5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @param objectLocale the locale identifying the collator
5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @param displayLocale the locale for which the display name of the collator should be localized
5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @return the display name
5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 3.2
5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public String getDisplayName(ULocale objectLocale, ULocale displayLocale) {
5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (visible()) {
5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Set<String> supported = getSupportedLocaleIDs();
5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String name = objectLocale.getBaseName();
5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (supported.contains(name)) {
5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return objectLocale.getDisplayName(displayLocale);
5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return null;
5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Return an unmodifiable collection of the locale names directly
5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * supported by this factory.
5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         *
5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @return the set of supported locale IDs.
5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 2.6
5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public abstract Set<String> getSupportedLocaleIDs();
5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /**
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Empty default constructor.
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * @stable ICU 2.6
5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        protected CollatorFactory() {
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static abstract class ServiceShim {
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        abstract Collator getInstance(ULocale l);
5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        abstract Object registerInstance(Collator c, ULocale l);
5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        abstract Object registerFactory(CollatorFactory f);
5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        abstract boolean unregister(Object k);
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        abstract Locale[] getAvailableLocales(); // TODO remove
5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        abstract ULocale[] getAvailableULocales();
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        abstract String getDisplayName(ULocale ol, ULocale dl);
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static ServiceShim shim;
5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static ServiceShim getShim() {
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Note: this instantiation is safe on loose-memory-model configurations
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // despite lack of synchronization, since the shim instance has no state--
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // it's all in the class init.  The worst problem is we might instantiate
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // two shim instances, but they'll share the same state so that's ok.
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (shim == null) {
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Class<?> cls = Class.forName("com.ibm.icu.text.CollatorServiceShim");
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                shim = (ServiceShim)cls.newInstance();
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            catch (MissingResourceException e)
5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ///CLOVER:OFF
5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw e;
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ///CLOVER:ON
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            catch (Exception e) {
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ///CLOVER:OFF
6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(DEBUG){
6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    e.printStackTrace();
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw new ICUException(e);
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ///CLOVER:ON
6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return shim;
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Simpler/faster methods for ASCII than ones based on Unicode data.
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * TODO: There should be code like this somewhere already??
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final class ASCII {
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        static boolean equalIgnoreCase(CharSequence left, CharSequence right) {
6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int length = left.length();
6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (length != right.length()) { return false; }
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < length; ++i) {
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                char lc = left.charAt(i);
6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                char rc = right.charAt(i);
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (lc == rc) { continue; }
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ('A' <= lc && lc <= 'Z') {
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if ((lc + 0x20) == rc) { continue; }
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else if ('A' <= rc && rc <= 'Z') {
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if ((rc + 0x20) == lc) { continue; }
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return false;
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return true;
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final boolean getYesOrNo(String keyword, String s) {
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (ASCII.equalIgnoreCase(s, "yes")) {
6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return true;
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (ASCII.equalIgnoreCase(s, "no")) {
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return false;
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        throw new IllegalArgumentException("illegal locale keyword=value: " + keyword + "=" + s);
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final int getIntValue(String keyword, String s, String... values) {
6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < values.length; ++i) {
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (ASCII.equalIgnoreCase(s, values[i])) {
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                return i;
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        throw new IllegalArgumentException("illegal locale keyword=value: " + keyword + "=" + s);
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final int getReorderCode(String keyword, String s) {
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return Collator.ReorderCodes.FIRST +
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                getIntValue(keyword, s, "space", "punct", "symbol", "currency", "digit");
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Not supporting "others" = UCOL_REORDER_CODE_OTHERS
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // as a synonym for Zzzz = USCRIPT_UNKNOWN for now:
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Avoid introducing synonyms/aliases.
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Sets collation attributes according to locale keywords. See
6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * http://www.unicode.org/reports/tr35/tr35-collation.html#Collation_Settings
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Using "alias" keywords and values where defined:
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * http://www.unicode.org/reports/tr35/tr35.html#Old_Locale_Extension_Syntax
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * http://unicode.org/repos/cldr/trunk/common/bcp47/collation.xml
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static void setAttributesFromKeywords(ULocale loc, Collator coll, RuleBasedCollator rbc) {
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Check for collation keywords that were already deprecated
6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // before any were supported in createInstance() (except for "collation").
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String value = loc.getKeywordValue("colHiraganaQuaternary");
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (value != null) {
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new UnsupportedOperationException("locale keyword kh/colHiraganaQuaternary");
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        value = loc.getKeywordValue("variableTop");
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (value != null) {
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new UnsupportedOperationException("locale keyword vt/variableTop");
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Parse known collation keywords, ignore others.
6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        value = loc.getKeywordValue("colStrength");
6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (value != null) {
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Note: Not supporting typo "quarternary" because it was never supported in locale IDs.
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int strength = getIntValue("colStrength", value,
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "primary", "secondary", "tertiary", "quaternary", "identical");
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            coll.setStrength(strength <= Collator.QUATERNARY ? strength : Collator.IDENTICAL);
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        value = loc.getKeywordValue("colBackwards");
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (value != null) {
6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (rbc != null) {
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                rbc.setFrenchCollation(getYesOrNo("colBackwards", value));
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw new UnsupportedOperationException(
6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "locale keyword kb/colBackwards only settable for RuleBasedCollator");
6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        value = loc.getKeywordValue("colCaseLevel");
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (value != null) {
7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (rbc != null) {
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                rbc.setCaseLevel(getYesOrNo("colCaseLevel", value));
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw new UnsupportedOperationException(
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "locale keyword kb/colBackwards only settable for RuleBasedCollator");
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        value = loc.getKeywordValue("colCaseFirst");
7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (value != null) {
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (rbc != null) {
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int cf = getIntValue("colCaseFirst", value, "no", "lower", "upper");
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (cf == 0) {
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    rbc.setLowerCaseFirst(false);
7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    rbc.setUpperCaseFirst(false);
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else if (cf == 1) {
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    rbc.setLowerCaseFirst(true);
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else /* cf == 2 */ {
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    rbc.setUpperCaseFirst(true);
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw new UnsupportedOperationException(
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "locale keyword kf/colCaseFirst only settable for RuleBasedCollator");
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        value = loc.getKeywordValue("colAlternate");
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (value != null) {
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (rbc != null) {
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                rbc.setAlternateHandlingShifted(
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        getIntValue("colAlternate", value, "non-ignorable", "shifted") != 0);
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw new UnsupportedOperationException(
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "locale keyword ka/colAlternate only settable for RuleBasedCollator");
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        value = loc.getKeywordValue("colNormalization");
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (value != null) {
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            coll.setDecomposition(getYesOrNo("colNormalization", value) ?
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Collator.CANONICAL_DECOMPOSITION : Collator.NO_DECOMPOSITION);
7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        value = loc.getKeywordValue("colNumeric");
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (value != null) {
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (rbc != null) {
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                rbc.setNumericCollation(getYesOrNo("colNumeric", value));
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw new UnsupportedOperationException(
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "locale keyword kn/colNumeric only settable for RuleBasedCollator");
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        value = loc.getKeywordValue("colReorder");
7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (value != null) {
7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int[] codes = new int[UScript.CODE_LIMIT + Collator.ReorderCodes.LIMIT - Collator.ReorderCodes.FIRST];
7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int codesLength = 0;
7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int scriptNameStart = 0;
7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (;;) {
7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (codesLength == codes.length) {
7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    throw new IllegalArgumentException(
7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "too many script codes for colReorder locale keyword: " + value);
7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int limit = scriptNameStart;
7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                while (limit < value.length() && value.charAt(limit) != '-') { ++limit; }
7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String scriptName = value.substring(scriptNameStart, limit);
7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int code;
7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (scriptName.length() == 4) {
7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // Strict parsing, accept only 4-letter script codes, not long names.
7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    code = UCharacter.getPropertyValueEnum(UProperty.SCRIPT, scriptName);
7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    code = getReorderCode("colReorder", scriptName);
7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                codes[codesLength++] = code;
7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (limit == value.length()) { break; }
7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                scriptNameStart = limit + 1;
7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (codesLength == 0) {
7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw new IllegalArgumentException("no script codes for colReorder locale keyword");
7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int[] args = new int[codesLength];
7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.arraycopy(codes, 0, args, 0, codesLength);
7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            coll.setReorderCodes(args);
7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        value = loc.getKeywordValue("kv");
7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (value != null) {
7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            coll.setMaxVariable(getReorderCode("kv", value));
7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the Collator for the desired locale.
7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>For some languages, multiple collation types are available;
7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * for example, "de@collation=phonebook".
7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Starting with ICU 54, collation attributes can be specified via locale keywords as well,
7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * in the old locale extension syntax ("el@colCaseFirst=upper")
7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * or in language tag syntax ("el-u-kf-upper").
7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * See <a href="http://userguide.icu-project.org/collation/api">User Guide: Collation API</a>.
7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locale the desired locale.
7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return Collator for the desired locale if it is created successfully.
7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         Otherwise if there is no Collator
7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         associated with the current locale, the root collator will
7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         be returned.
8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see java.util.Locale
8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see java.util.ResourceBundle
8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getInstance(Locale)
8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getInstance()
8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.0
8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final Collator getInstance(ULocale locale) {
8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // fetching from service cache is faster than instantiation
8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (locale == null) {
8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            locale = ULocale.getDefault();
8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Collator coll = getShim().getInstance(locale);
8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!locale.getName().equals(locale.getBaseName())) {  // any keywords?
8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            setAttributesFromKeywords(locale, coll,
8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    (coll instanceof RuleBasedCollator) ? (RuleBasedCollator)coll : null);
8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return coll;
8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns the Collator for the desired locale.
8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>For some languages, multiple collation types are available;
8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * for example, "de-u-co-phonebk".
8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Starting with ICU 54, collation attributes can be specified via locale keywords as well,
8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * in the old locale extension syntax ("el@colCaseFirst=upper", only with {@link ULocale})
8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * or in language tag syntax ("el-u-kf-upper").
8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * See <a href="http://userguide.icu-project.org/collation/api">User Guide: Collation API</a>.
8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locale the desired locale.
8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return Collator for the desired locale if it is created successfully.
8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         Otherwise if there is no Collator
8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         associated with the current locale, the root collator will
8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         be returned.
8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see java.util.Locale
8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see java.util.ResourceBundle
8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getInstance(ULocale)
8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getInstance()
8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final Collator getInstance(Locale locale) {
8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getInstance(ULocale.forLocale(locale));
8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Registers a collator as the default collator for the provided locale.  The
8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * collator should not be modified after it is registered.
8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>Because ICU may choose to cache Collator objects internally, this must
8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * be called at application startup, prior to any calls to
8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Collator.getInstance to avoid undefined behavior.
8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param collator the collator to register
8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locale the locale for which this is the default collator
8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return an object that can be used to unregister the registered collator.
8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.2
8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final Object registerInstance(Collator collator, ULocale locale) {
8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getShim().registerInstance(collator, locale);
8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Registers a collator factory.
8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>Because ICU may choose to cache Collator objects internally, this must
8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * be called at application startup, prior to any calls to
8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Collator.getInstance to avoid undefined behavior.
8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param factory the factory to register
8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return an object that can be used to unregister the registered factory.
8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.6
8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final Object registerFactory(CollatorFactory factory) {
8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getShim().registerFactory(factory);
8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Unregisters a collator previously registered using registerInstance.
8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param registryKey the object previously returned by registerInstance.
8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return true if the collator was successfully unregistered.
8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.6
8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final boolean unregister(Object registryKey) {
8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (shim == null) {
8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return false;
8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return shim.unregister(registryKey);
8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns the set of locales, as Locale objects, for which collators
8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * are installed.  Note that Locale objects do not support RFC 3066.
8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the list of locales in which collators are installed.
8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * This list includes any that have been registered, in addition to
8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * those that are installed with ICU4J.
8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.4
8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static Locale[] getAvailableLocales() {
9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO make this wrap getAvailableULocales later
9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (shim == null) {
9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return ICUResourceBundle.getAvailableLocales(
9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ICUResourceBundle.ICU_COLLATION_BASE_NAME, ICUResourceBundle.ICU_DATA_CLASS_LOADER);
9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return shim.getAvailableLocales();
9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the set of locales, as ULocale objects, for which collators
9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * are installed.  ULocale objects support RFC 3066.
9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the list of locales in which collators are installed.
9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * This list includes any that have been registered, in addition to
9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * those that are installed with ICU4J.
9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.0
9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
9167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final ULocale[] getAvailableULocales() {
9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (shim == null) {
9187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return ICUResourceBundle.getAvailableULocales(
9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ICUResourceBundle.ICU_COLLATION_BASE_NAME, ICUResourceBundle.ICU_DATA_CLASS_LOADER);
9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return shim.getAvailableULocales();
9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The list of keywords for this service.  This must be kept in sync with
9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the resource data.
9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @since ICU 3.0
9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String[] KEYWORDS = { "collation" };
9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The resource name for this service.  Note that this is not the same as
9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the keyword for this service.
9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @since ICU 3.0
9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String RESOURCE = "collations";
9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The resource bundle base name for this service.
9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * *since ICU 3.0
9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
9427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String BASE = ICUResourceBundle.ICU_COLLATION_BASE_NAME;
9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns an array of all possible keywords that are relevant to
9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * collation. At this point, the only recognized keyword for this
9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * service is "collation".
9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return an array of valid collation keywords.
9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getKeywordValues
9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.0
9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final String[] getKeywords() {
9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return KEYWORDS;
9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Given a keyword, returns an array of all values for
9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * that keyword that are currently in use.
9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param keyword one of the keywords returned by getKeywords.
9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getKeywords
9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.0
9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final String[] getKeywordValues(String keyword) {
9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!keyword.equals(KEYWORDS[0])) {
9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new IllegalArgumentException("Invalid keyword: " + keyword);
9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return ICUResourceBundle.getKeywordValues(BASE, RESOURCE);
9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Given a key and a locale, returns an array of string values in a preferred
9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * order that would make a difference. These are all and only those values where
9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the open (creation) of the service with the locale formed from the input locale
9757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * plus input keyword and that value has different behavior than creation with the
9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * input locale alone.
9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param key           one of the keys supported by this service.  For now, only
9787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                      "collation" is supported.
9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locale        the locale
9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param commonlyUsed  if set to true it will return only commonly used values
9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                      with the given locale in preferred order.  Otherwise,
9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                      it will return all the available values for the locale.
9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return an array of string values for the given key and the locale.
9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.2
9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final String[] getKeywordValuesForLocale(String key, ULocale locale,
9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                           boolean commonlyUsed) {
9887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Note: The parameter commonlyUsed is actually not used.
9897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The switch is in the method signature for consistency
9907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // with other locale services.
9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Read available collation values from collation bundles
9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String baseLoc = locale.getBaseName();
9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        LinkedList<String> values = new LinkedList<String>();
9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UResourceBundle bundle = UResourceBundle.getBundleInstance(
9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ICUResourceBundle.ICU_COLLATION_BASE_NAME, baseLoc);
9987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String defcoll = null;
10007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (bundle != null) {
10017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UResourceBundle collations = bundle.get("collations");
10027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Enumeration<String> collEnum = collations.getKeys();
10037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (collEnum.hasMoreElements()) {
10047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String collkey = collEnum.nextElement();
10057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (collkey.equals("default")) {
10067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (defcoll == null) {
10077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // Keep the default
10087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        defcoll = collations.getString("default");
10097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
10107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else if (!collkey.startsWith("private-") && !values.contains(collkey)) {
10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    values.add(collkey);
10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            bundle = ((ICUResourceBundle)bundle).getParent();
10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Reordering
10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Iterator<String> itr = values.iterator();
10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] result = new String[values.size()];
10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        result[0] = defcoll;
10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int idx = 1;
10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (itr.hasNext()) {
10227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String collKey = itr.next();
10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!collKey.equals(defcoll)) {
10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result[idx++] = collKey;
10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return result;
10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the functionally equivalent locale for the given
10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * requested locale, with respect to given keyword, for the
10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * collation service.  If two locales return the same result, then
10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * collators instantiated for these locales will behave
10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * equivalently.  The converse is not always true; two collators
10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * may in fact be equivalent, but return different results, due to
10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * internal details.  The return result has no other meaning than
10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * that stated above, and implies nothing as to the relationship
10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * between the two locales.  This is intended for use by
10407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * applications who wish to cache collators, or otherwise reuse
10417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * collators when possible.  The functional equivalent may change
10427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * over time.  For more information, please see the <a
10437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * href="http://userguide.icu-project.org/locale#TOC-Locales-and-Services">
10447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Locales and Services</a> section of the ICU User Guide.
10457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param keyword a particular keyword as enumerated by
10467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * getKeywords.
10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locID The requested locale
10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param isAvailable If non-null, isAvailable[0] will receive and
10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * output boolean that indicates whether the requested locale was
10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * 'available' to the collation service. If non-null, isAvailable
10517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * must have length >= 1.
10527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the locale
10537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.0
10547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
10557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final ULocale getFunctionalEquivalent(String keyword,
10567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                        ULocale locID,
10577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                        boolean isAvailable[]) {
10587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return ICUResourceBundle.getFunctionalEquivalent(BASE, ICUResourceBundle.ICU_DATA_CLASS_LOADER, RESOURCE,
10597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                         keyword, locID, isAvailable, true);
10607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
10637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the functionally equivalent locale for the given
10647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * requested locale, with respect to given keyword, for the
10657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * collation service.
10667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param keyword a particular keyword as enumerated by
10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * getKeywords.
10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locID The requested locale
10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the locale
10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getFunctionalEquivalent(String,ULocale,boolean[])
10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.0
10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static final ULocale getFunctionalEquivalent(String keyword,
10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                        ULocale locID) {
10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getFunctionalEquivalent(keyword, locID, null);
10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the name of the collator for the objectLocale, localized for the
10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * displayLocale.
10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param objectLocale the locale of the collator
10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param displayLocale the locale for the collator's display name
10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the display name
10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.6
10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static public String getDisplayName(Locale objectLocale, Locale displayLocale) {
10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getShim().getDisplayName(ULocale.forLocale(objectLocale),
10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        ULocale.forLocale(displayLocale));
10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the name of the collator for the objectLocale, localized for the
10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * displayLocale.
10947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param objectLocale the locale of the collator
10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param displayLocale the locale for the collator's display name
10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the display name
10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.2
10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static public String getDisplayName(ULocale objectLocale, ULocale displayLocale) {
11007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getShim().getDisplayName(objectLocale, displayLocale);
11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the name of the collator for the objectLocale, localized for the
11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * default <code>DISPLAY</code> locale.
11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param objectLocale the locale of the collator
11077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the display name
11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale.Category#DISPLAY
11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.6
11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static public String getDisplayName(Locale objectLocale) {
11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getShim().getDisplayName(ULocale.forLocale(objectLocale), ULocale.getDefault(Category.DISPLAY));
11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
11167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the name of the collator for the objectLocale, localized for the
11177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * default <code>DISPLAY</code> locale.
11187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param objectLocale the locale of the collator
11197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the display name
11207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale.Category#DISPLAY
11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 3.2
11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static public String getDisplayName(ULocale objectLocale) {
11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getShim().getDisplayName(objectLocale, ULocale.getDefault(Category.DISPLAY));
11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns this Collator's strength attribute. The strength attribute
11297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * determines the minimum level of difference considered significant.
11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * </p>
11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icunote} This can return QUATERNARY strength, which is not supported by the
11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * JDK version.
11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>
11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * See the Collator class description for more details.
11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * </p>
11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>The base class method always returns {@link #TERTIARY}.
11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Subclasses should override it if appropriate.
11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return this Collator's current strength attribute.
11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setStrength
11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #PRIMARY
11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #SECONDARY
11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #TERTIARY
11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #QUATERNARY
11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #IDENTICAL
11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int getStrength()
11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
11507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return TERTIARY;
11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns the decomposition mode of this Collator. The decomposition mode
11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * determines how Unicode composed characters are handled.
11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * </p>
11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>
11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * See the Collator class description for more details.
11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * </p>
11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>The base class method always returns {@link #NO_DECOMPOSITION}.
11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Subclasses should override it if appropriate.
11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the decomposition mode
11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setDecomposition
11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #NO_DECOMPOSITION
11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #CANONICAL_DECOMPOSITION
11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int getDecomposition()
11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return NO_DECOMPOSITION;
11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // public other methods -------------------------------------------------
11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Compares the equality of two text Strings using
11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * this Collator's rules, strength and decomposition mode.  Convenience method.
11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param source the source string to be compared.
11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param target the target string to be compared.
11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return true if the strings are equal according to the collation
11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         rules, otherwise false.
11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #compare
11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @throws NullPointerException thrown if either arguments is null.
11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public boolean equals(String source, String target)
11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return (compare(source, target) == 0);
11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns a UnicodeSet that contains all the characters and sequences tailored
11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * in this collator.
11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return a pointer to a UnicodeSet object containing all the
11967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         code points and sequences that may sort differently than
11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         in the root collator.
11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.4
11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public UnicodeSet getTailoredSet()
12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return new UnicodeSet(0, 0x10FFFF);
12037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Compares the source text String to the target text String according to
12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * this Collator's rules, strength and decomposition mode.
12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Returns an integer less than,
12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * equal to or greater than zero depending on whether the source String is
12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * less than, equal to or greater than the target String. See the Collator
12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * class description for an example of use.
12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * </p>
12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param source the source String.
12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param target the target String.
12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return Returns an integer value. Value is less than zero if source is
12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         less than target, value is zero if source and target are equal,
12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         value is greater than zero if source is greater than target.
12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see CollationKey
12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getCollationKey
12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @throws NullPointerException thrown if either argument is null.
12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public abstract int compare(String source, String target);
12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Compares the source Object to the target Object.
12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * </p>
12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param source the source Object.
12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param target the target Object.
12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return Returns an integer value. Value is less than zero if source is
12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         less than target, value is zero if source and target are equal,
12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         value is greater than zero if source is greater than target.
12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @throws ClassCastException thrown if either arguments cannot be cast to CharSequence.
12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.2
12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
12367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int compare(Object source, Object target) {
12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return doCompare((CharSequence)source, (CharSequence)target);
12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Compares two CharSequences.
12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The base class just calls compare(left.toString(), right.toString()).
12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Subclasses should instead implement this method and have the String API call this method.
12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
12477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
12487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    protected int doCompare(CharSequence left, CharSequence right) {
12497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return compare(left.toString(), right.toString());
12507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
12537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>
12547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Transforms the String into a CollationKey suitable for efficient
12557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * repeated comparison.  The resulting key depends on the collator's
12567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * rules, strength and decomposition mode.
12577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
12587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>Note that collation keys are often less efficient than simply doing comparison.
12597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * For more details, see the ICU User Guide.
12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>See the CollationKey class documentation for more information.</p>
12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param source the string to be transformed into a CollationKey.
12637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the CollationKey for the given String based on this Collator's
12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         collation rules. If the source String is null, a null
12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         CollationKey is returned.
12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see CollationKey
12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #compare(String, String)
12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getRawCollationKey
12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public abstract CollationKey getCollationKey(String source);
12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the simpler form of a CollationKey for the String source following
12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the rules of this Collator and stores the result into the user provided argument
12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * key.  If key has a internal byte array of length that's too small for the result,
12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the internal byte array will be grown to the exact required size.
12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>Note that collation keys are often less efficient than simply doing comparison.
12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * For more details, see the ICU User Guide.
12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param source the text String to be transformed into a RawCollationKey
12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return If key is null, a new instance of RawCollationKey will be
12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         created and returned, otherwise the user provided key will be
12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *         returned.
12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #compare(String, String)
12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getCollationKey
12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see RawCollationKey
12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public abstract RawCollationKey getRawCollationKey(String source,
12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                       RawCollationKey key);
12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Sets the variable top to the top of the specified reordering group.
12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The variable top determines the highest-sorting character
12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * which is affected by the alternate handling behavior.
12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * If that attribute is set to UCOL_NON_IGNORABLE, then the variable top has no effect.
12997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>The base class implementation throws an UnsupportedOperationException.
13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param group one of Collator.ReorderCodes.SPACE, Collator.ReorderCodes.PUNCTUATION,
13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *              Collator.ReorderCodes.SYMBOL, Collator.ReorderCodes.CURRENCY;
13037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *              or Collator.ReorderCodes.DEFAULT to restore the default max variable group
13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return this
13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getMaxVariable
1306f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * @stable ICU 53
13077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public Collator setMaxVariable(int group) {
13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        throw new UnsupportedOperationException("Needs to be implemented by the subclass.");
13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the maximum reordering group whose characters are affected by
13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the alternate handling behavior.
13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
13167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>The base class implementation returns Collator.ReorderCodes.PUNCTUATION.
13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the maximum variable reordering group.
13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setMaxVariable
1319f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * @stable ICU 53
13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int getMaxVariable() {
13227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return Collator.ReorderCodes.PUNCTUATION;
13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Sets the variable top to the primary weight of the specified string.
13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>Beginning with ICU 53, the variable top is pinned to
13297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the top of one of the supported reordering groups,
13307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * and it must not be beyond the last of those groups.
13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * See {@link #setMaxVariable(int)}.
13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param varTop one or more (if contraction) characters to which the
13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *               variable top should be set
13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return variable top primary weight
13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @exception IllegalArgumentException
13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                is thrown if varTop argument is not a valid variable top element. A variable top element is
13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                invalid when
13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                <ul>
13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                <li>it is a contraction that does not exist in the Collation order
13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                <li>the variable top is beyond
13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                    the last reordering group supported by setMaxVariable()
13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                <li>when the varTop argument is null or zero in length.
13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *                </ul>
13457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getVariableTop
13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see RuleBasedCollator#setAlternateHandlingShifted
13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated ICU 53 Call {@link #setMaxVariable(int)} instead.
13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public abstract int setVariableTop(String varTop);
13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Gets the variable top value of a Collator.
13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the variable top primary weight
13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getMaxVariable
13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.6
13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public abstract int getVariableTop();
13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Sets the variable top to the specified primary weight.
13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>Beginning with ICU 53, the variable top is pinned to
13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the top of one of the supported reordering groups,
13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * and it must not be beyond the last of those groups.
13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * See {@link #setMaxVariable(int)}.
13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param varTop primary weight, as returned by setVariableTop or getVariableTop
13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getVariableTop
13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setVariableTop(String)
13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated ICU 53 Call setMaxVariable() instead.
13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public abstract void setVariableTop(int varTop);
13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the version of this collator object.
13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the version object associated with this collator
13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public abstract VersionInfo getVersion();
13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the UCA version of this collator object.
13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the version object associated with this collator
13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.8
13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
13897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public abstract VersionInfo getUCAVersion();
13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Retrieves the reordering codes for this collator.
13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * These reordering codes are a combination of UScript codes and ReorderCodes.
13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return a copy of the reordering codes for this collator;
13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * if none are set then returns an empty array
13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setReorderCodes
13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getEquivalentReorderCodes
13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see Collator.ReorderCodes
13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see UScript
14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.8
14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int[] getReorderCodes()
14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        throw new UnsupportedOperationException("Needs to be implemented by the subclass.");
14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Retrieves all the reorder codes that are grouped with the given reorder code. Some reorder
14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * codes are grouped and must reorder together.
1410f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * Beginning with ICU 55, scripts only reorder together if they are primary-equal,
1411f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     * for example Hiragana and Katakana.
1412f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert     *
14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param reorderCode The reorder code to determine equivalence for.
14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the set of all reorder codes in the same group as the given reorder code.
14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #setReorderCodes
14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see #getReorderCodes
14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see Collator.ReorderCodes
14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see UScript
14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.8
14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static int[] getEquivalentReorderCodes(int reorderCode) {
14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CollationData baseData = CollationRoot.getData();
14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return baseData.getEquivalentScripts(reorderCode);
14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Freezable interface implementation -------------------------------------------------
14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Determines whether the object has been frozen or not.
14317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
14327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>An unfrozen Collator is mutable and not thread-safe.
14337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * A frozen Collator is immutable and thread-safe.
14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.8
14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public boolean isFrozen() {
14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return false;
14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Freezes the collator.
14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the collator itself.
14447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.8
14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public Collator freeze() {
14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        throw new UnsupportedOperationException("Needs to be implemented by the subclass.");
14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Provides for the clone operation. Any clone is initially unfrozen.
14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 4.8
14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public Collator cloneAsThawed() {
14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        throw new UnsupportedOperationException("Needs to be implemented by the subclass.");
14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Empty default constructor to make javadocs happy
14607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @stable ICU 2.4
14617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    protected Collator()
14637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
14647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final boolean DEBUG = ICUDebug.enabled("collator");
14677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // -------- BEGIN ULocale boilerplate --------
14697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@icu} Returns the locale that was used to create this object, or null.
14727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * This may may differ from the locale requested at the time of
14737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * this object's creation.  For example, if an object is created
14747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * for locale <tt>en_US_CALIFORNIA</tt>, the actual data may be
14757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * drawn from <tt>en</tt> (the <i>actual</i> locale), and
14767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <tt>en_US</tt> may be the most specific locale that exists (the
14777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <i>valid</i> locale).
14787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
14797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>Note: This method will be implemented in ICU 3.0; ICU 2.8
14807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * contains a partial preview implementation.  The * <i>actual</i>
14817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * locale is returned correctly, but the <i>valid</i> locale is
14827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * not, in most cases.
14837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
14847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>The base class method always returns {@link ULocale#ROOT}.
14857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Subclasses should override it if appropriate.
14867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
14877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param type type of information requested, either {@link
14887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * com.ibm.icu.util.ULocale#VALID_LOCALE} or {@link
14897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * com.ibm.icu.util.ULocale#ACTUAL_LOCALE}.
14907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return the information specified by <i>type</i>, or null if
14917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * this object was not constructed from locale data.
14927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale
14937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale#VALID_LOCALE
14947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale#ACTUAL_LOCALE
14957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @draft ICU 2.8 (retain)
14967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @provisional This API might change or be removed in a future release.
14977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public ULocale getLocale(ULocale.Type type) {
14997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return ULocale.ROOT;
15007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
15017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
15037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Set information about the locales that were used to create this
15047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * object.  If the object was not constructed from locale data,
15057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * both arguments should be set to null.  Otherwise, neither
15067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * should be null.  The actual locale must be at the same level or
15077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * less specific than the valid locale.  This method is intended
15087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * for use by factories or other entities that create objects of
15097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * this class.
15107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
15117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>The base class method does nothing. Subclasses should override it if appropriate.
15127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
15137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param valid the most specific locale containing any resource
15147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * data, or null
15157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param actual the locale containing data used to construct this
15167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * object, or null
15177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale
15187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale#VALID_LOCALE
15197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see com.ibm.icu.util.ULocale#ACTUAL_LOCALE
15207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
15217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    void setLocale(ULocale valid, ULocale actual) {}
15227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // -------- END ULocale boilerplate --------
15247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
1525