RuleBasedCollator.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*******************************************************************************
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* Copyright (C) 1996-2007, International Business Machines Corporation and    *
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* others. All Rights Reserved.                                                *
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*******************************************************************************
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BEGIN android-note
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// The class javadoc and some of the method descriptions are copied from ICU4J
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// source files. Changes have been made to the copied descriptions.
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// The icu license header was added to this file.
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// The icu implementation used was changed from icu4j to icu4jni.
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// END android-note
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.text;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.text.internal.nls.Messages;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A concrete implementation class for {@code Collation}.
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code RuleBasedCollator} has the following restrictions for efficiency
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (other subclasses may be used for more complex languages):
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ol>
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> If a French secondary ordering is specified it applies to the whole
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * collator object.</li>
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> All non-mentioned Unicode characters are at the end of the collation
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * order.</li>
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li> If a character is not located in the {@code RuleBasedCollator}, the
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * default Unicode Collation Algorithm (UCA) rulebased table is automatically
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * searched as a backup.</li>
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ol>
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The collation table is composed of a list of collation rules, where each rule
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is of three forms:
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <modifier>
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <relation> <text-argument>
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <reset> <text-argument>
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The rule elements are defined as follows:
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul type="disc">
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><strong>Text-Argument</strong>: A text-argument is any sequence of
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters, excluding special characters (that is, common whitespace
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters [0009-000D, 0020] and rule syntax characters [0021-002F,
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 003A-0040, 005B-0060, 007B-007E]). If those characters are desired, you can
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * put them in single quotes (for example, use '&' for ampersand). Note that
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * unquoted white space characters are ignored; for example, {@code b c} is
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * treated as {@code bc}.</li>
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><strong>Modifier</strong>: There is a single modifier which is used to
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specify that all accents (secondary differences) are backwards.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * '@' : Indicates that accents are sorted backwards, as in French.
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </li>
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><strong>Relation</strong>: The relations are the following:
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul type=square>
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>'<' : Greater, as a letter difference (primary)
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>';' : Greater, as an accent difference (secondary)
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>',' : Greater, as a case difference (tertiary)
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>'=' : Equal
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </li>
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li><strong>Reset</strong>: There is a single reset which is used primarily
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for contractions and expansions, but which can also be used to add a
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * modification at the end of a set of rules.
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * '&' : Indicates that the next rule follows the position to where the reset
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * text-argument would be sorted.
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </li>
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This sounds more complicated than it is in practice. For example, the
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * following are equivalent ways of expressing the same thing:
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a < b < c
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a < b & b < c
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a < c & a < b
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Notice that the order is important, as the subsequent item goes immediately
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * after the text-argument. The following are not equivalent:
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a < b & a < c
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a < c & a < b
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Either the text-argument must already be present in the sequence, or some
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * initial substring of the text-argument must be present. For example
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "a < b & ae < e"} is valid since "a" is present in the sequence before
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "ae" is reset. In this latter case, "ae" is not entered and treated as a
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * single character; instead, "e" is sorted as if it were expanded to two
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * characters: "a" followed by an "e". This difference appears in natural
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * languages: in traditional Spanish "ch" is treated as if it contracts to a
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * single character (expressed as {@code "c < ch < d"}), while in traditional
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * German a-umlaut is treated as if it expands to two characters (expressed as
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "a,A < b,B  ... & ae;\u00e3 & AE;\u00c3"}, where \u00e3 and \u00c3
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are the escape sequences for a-umlaut).
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Ignorable Characters</h4>
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For ignorable characters, the first rule must start with a relation (the
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * examples we have used above are really fragments; {@code "a < b"} really
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * should be {@code "< a < b"}). If, however, the first relation is not
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "<"}, then all text-arguments up to the first {@code "<"} are
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ignorable. For example, {@code ", - < a < b"} makes {@code "-"} an ignorable
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * character.
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Normalization and Accents</h4>
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code RuleBasedCollator} automatically processes its rule table to include
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * both pre-composed and combining-character versions of accented characters.
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Even if the provided rule string contains only base characters and separate
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * combining accent characters, the pre-composed accented characters matching
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * all canonical combinations of characters from the rule string will be entered
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the table.
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This allows you to use a RuleBasedCollator to compare accented strings even
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when the collator is set to NO_DECOMPOSITION. However, if the strings to be
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * collated contain combining sequences that may not be in canonical order, you
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * should set the collator to CANONICAL_DECOMPOSITION to enable sorting of
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * combining sequences. For more information, see <a
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * href="http://www.aw.com/devpress">The Unicode Standard, Version 3.0</a>.
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Errors</h4>
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The following rules are not valid:
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul type="disc">
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A text-argument contains unquoted punctuation symbols, for example
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code "a < b-c < d"}.</li>
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A relation or reset character is not followed by a text-argument, for
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * example {@code "a < , b"}.</li>
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A reset where the text-argument (or an initial substring of the
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * text-argument) is not already in the sequence or allocated in the default UCA
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * table, for example {@code "a < b & e < f"}.</li>
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If you produce one of these errors, {@code RuleBasedCollator} throws a
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ParseException}.
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <h4>Examples</h4>
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Normally, to create a rule-based collator object, you will use
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Collator}'s factory method {@code getInstance}. However, to create a
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * rule-based collator object with specialized rules tailored to your needs, you
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * construct the {@code RuleBasedCollator} with the rules contained in a
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code String} object. For example:
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String Simple = "< a < b < c < d";
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator mySimple = new RuleBasedCollator(Simple);
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Or:
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String Norwegian = "< a,A< b,B< c,C< d,D< e,E< f,F< g,G< h,H< i,I"
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         + "< j,J< k,K< l,L< m,M< n,N< o,O< p,P< q,Q< r,R"
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         + "< s,S< t,T< u,U< v,V< w,W< x,X< y,Y< z,Z"
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         + "< \u00E5=a\u030A,\u00C5=A\u030A"
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         + ";aa,AA< \u00E6,\u00C6< \u00F8,\u00D8";
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator myNorwegian = new RuleBasedCollator(Norwegian);
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Combining {@code Collator}s is as simple as concatenating strings. Here is
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an example that combines two {@code Collator}s from two different locales:
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // Create an en_US Collator object
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator en_USCollator = (RuleBasedCollator)Collator
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         .getInstance(new Locale("en", "US", ""));
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // Create a da_DK Collator object
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator da_DKCollator = (RuleBasedCollator)Collator
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         .getInstance(new Locale("da", "DK", ""));
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // Combine the two collators
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // First, get the collation rules from en_USCollator
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String en_USRules = en_USCollator.getRules();
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // Second, get the collation rules from da_DKCollator
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String da_DKRules = da_DKCollator.getRules();
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator newCollator = new RuleBasedCollator(en_USRules + da_DKRules);
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // newCollator has the combined rules
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The next example shows to make changes on an existing table to create a new
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Collator} object. For example, add {@code "& C < ch, cH, Ch, CH"} to
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code en_USCollator} object to create your own:
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // Create a new Collator object with additional rules
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String addRules = "& C < ch, cH, Ch, CH";
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator myCollator = new RuleBasedCollator(en_USCollator + addRules);
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // myCollator contains the new rules
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The following example demonstrates how to change the order of non-spacing
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * accents:
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // old rule
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String oldRules = "= \u00a8 ; \u00af ; \u00bf" + "< a , A ; ae, AE ; \u00e6 , \u00c6"
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *         + "< b , B < c, C < e, E & C < d, D";
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // change the order of accent characters
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String addOn = "& \u00bf ; \u00af ; \u00a8;";
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator myCollator = new RuleBasedCollator(oldRules + addOn);
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The last example shows how to put new primary ordering in before the default
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * setting. For example, in the Japanese {@code Collator}, you can either sort
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * English characters before or after Japanese characters:
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <blockquote>
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <pre>
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // get en_US Collator rules
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator en_USCollator = (RuleBasedCollator)
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     Collator.getInstance(Locale.US);
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // add a few Japanese character to sort before English characters
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // suppose the last character before the first base letter 'a' in
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * // the English collation rule is \u30A2
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * String jaString = "& \u30A2 , \u30FC < \u30C8";
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * RuleBasedCollator myJapaneseCollator =
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     new RuleBasedCollator(en_USCollator.getRules() + jaString);
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </pre>
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </blockquote>
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class RuleBasedCollator extends Collator {
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    RuleBasedCollator(com.ibm.icu4jni.text.Collator wrapper) {
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(wrapper);
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of {@code RuleBasedCollator} using the
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified {@code rules}. The {@code rules} are usually either
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * hand-written based on the {@link RuleBasedCollator class description} or
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the result of a former {@link #getRules()} call.
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Note that the {@code rules} are actually interpreted as a delta to the
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * standard Unicode Collation Algorithm (UCA). Hence, an empty {@code rules}
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * string results in the default UCA rules being applied. This differs
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * slightly from other implementations which work with full {@code rules}
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specifications and may result in different behavior.
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param rules
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the collation rules.
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code rules} is {@code null}.
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ParseException
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code rules} contains rules with invalid collation rule
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             syntax.
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public RuleBasedCollator(String rules) throws ParseException {
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (rules == null) {
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-removed
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if (rules.length() == 0) {
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     // text.06=Build rules empty
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     throw new ParseException(Messages.getString("text.06"), 0); //$NON-NLS-1$
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // }
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END andriod-removed
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.icuColl = new com.ibm.icu4jni.text.RuleBasedCollator(rules);
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-added
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.icuColl.setDecomposition(
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    com.ibm.icu4jni.text.Collator.CANONICAL_DECOMPOSITION);
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-added
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (e instanceof ParseException) {
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw (ParseException) e;
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            /*
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * -1 means it's not a ParseException. Maybe IOException thrown when
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * an error occured while reading internal data.
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             */
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new ParseException(e.getMessage(), -1);
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Obtains a {@code CollationElementIterator} for the given
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code CharacterIterator}. The source iterator's integrity will be
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * preserved since a new copy will be created for use.
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param source
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source character iterator.
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code CollationElementIterator} for {@code source}.
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CollationElementIterator getCollationElementIterator(
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            CharacterIterator source) {
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (source == null) {
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new CollationElementIterator(
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ((com.ibm.icu4jni.text.RuleBasedCollator) this.icuColl)
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        .getCollationElementIterator(source));
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Obtains a {@code CollationElementIterator} for the given string.
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param source
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source string.
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code CollationElementIterator} for {@code source}.
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CollationElementIterator getCollationElementIterator(String source) {
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (source == null) {
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException();
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new CollationElementIterator(
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ((com.ibm.icu4jni.text.RuleBasedCollator) this.icuColl)
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        .getCollationElementIterator(source));
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the collation rules of this collator. These {@code rules} can be
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * fed into the {@link #RuleBasedCollator(String)} constructor.
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Note that the {@code rules} are actually interpreted as a delta to the
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * standard Unicode Collation Algorithm (UCA). Hence, an empty {@code rules}
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * string results in the default UCA rules being applied. This differs
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * slightly from other implementations which work with full {@code rules}
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specifications and may result in different behavior.
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the collation rules.
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getRules() {
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((com.ibm.icu4jni.text.RuleBasedCollator) this.icuColl).getRules();
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new collator with the same collation rules, decomposition mode and
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * strength value as this collator.
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a shallow copy of this collator.
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Cloneable
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        RuleBasedCollator clone = (RuleBasedCollator) super.clone();
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return clone;
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the {@code source} text to the {@code target} text according to
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the collation rules, strength and decomposition mode for this
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code RuleBasedCollator}. See the {@code Collator} class description
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * for an example of use.
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * General recommendation: If comparisons are to be done with the same strings
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * multiple times, it is more efficient to generate {@code CollationKey}
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * objects for the strings and use
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code CollationKey.compareTo(CollationKey)} for the comparisons. If each
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * string is compared to only once, using
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code RuleBasedCollator.compare(String, String)} has better performance.
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </p>
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param source
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source text.
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param target
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target text.
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an integer which may be a negative value, zero, or else a
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         positive value depending on whether {@code source} is less than,
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         equivalent to, or greater than {@code target}.
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int compare(String source, String target) {
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (source == null || target == null) {
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // text.08=one of arguments is null
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException(Messages.getString("text.08")); //$NON-NLS-1$
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this.icuColl.compare(source, target);
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code CollationKey} for the given source text.
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param source
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified source text.
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code CollationKey} for the given source text.
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CollationKey getCollationKey(String source) {
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        com.ibm.icu4jni.text.CollationKey icuKey = this.icuColl
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .getCollationKey(source);
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (icuKey == null) {
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new CollationKey(source, icuKey);
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((com.ibm.icu4jni.text.RuleBasedCollator) this.icuColl).getRules()
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .hashCode();
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified object with this {@code RuleBasedCollator} and
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indicates if they are equal. In order to be equal, {@code object} must be
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * an instance of {@code Collator} with the same collation rules and the
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * same attributes.
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare with this object.
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code RuleBasedCollator}; {@code false} otherwise.
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #hashCode
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object obj) {
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(obj instanceof Collator)) {
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return super.equals(obj);
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
499