1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*******************************************************************************
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Copyright (C) 1996-2005, International Business Machines Corporation and    *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* others. All Rights Reserved.                                                *
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*******************************************************************************
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*******************************************************************************
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.ibm.icu4jni.text;
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Locale;
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.text.CharacterIterator;
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.text.ParseException;
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.ibm.icu4jni.common.ErrorCode;
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Concrete implementation class for Collation.
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* The collation table is composed of a list of collation rules, where each
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* rule is of three forms:
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre>
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*    < modifier >
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*    < relation > < text-argument >
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*    < reset > < text-argument >
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre>
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <code>RuleBasedCollator</code> has the following restrictions for efficiency
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* (other subclasses may be used for more complex languages) :
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <ol>
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <li> If a French secondary ordering is specified it applies to the whole
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*      collator object.
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <li> All non-mentioned Unicode characters are at the end of the collation
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*      order.
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <li> If a character is not located in the RuleBasedCollator, the default
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*      Unicode Collation Algorithm (UCA) rulebased table is automatically
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*      searched as a backup.
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </ol>
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* The following demonstrates how to create your own collation rules:
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <UL Type=disc>
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*    <LI><strong>Text-Argument</strong>: A text-argument is any sequence of
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        characters, excluding special characters (that is, common whitespace
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        characters [0009-000D, 0020] and rule syntax characters [0021-002F,
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        003A-0040, 005B-0060, 007B-007E]). If those characters are desired,
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        you can put them in single quotes (e.g. ampersand => '&'). Note that
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        unquoted white space characters are ignored; e.g. <code>b c</code> is
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        treated as <code>bc</code>.
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*    <LI><strong>Modifier</strong>: There is a single modifier which is used
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        to specify that all accents (secondary differences) are backwards.
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        <p>'@' : Indicates that accents are sorted backwards, as in French.
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*    <LI><strong>Relation</strong>: The relations are the following:
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        <UL Type=square>
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*            <LI>'<' : Greater, as a letter difference (primary)
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*            <LI>';' : Greater, as an accent difference (secondary)
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*            <LI>',' : Greater, as a case difference (tertiary)
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*            <LI>'=' : Equal
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        </UL>
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*    <LI><strong>Reset</strong>: There is a single reset which is used
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        primarily for contractions and expansions, but which can also be used
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        to add a modification at the end of a set of rules.
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        <p>'&' : Indicates that the next rule follows the position to where
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*            the reset text-argument would be sorted.
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </UL>
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* This sounds more complicated than it is in practice. For example, the
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* following are equivalent ways of expressing the same thing:
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote>
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre>
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a < b < c
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a < b & b < c
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a < c & a < b
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre>
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote>
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Notice that the order is important, as the subsequent item goes immediately
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* after the text-argument. The following are not equivalent:
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote>
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre>
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a < b & a < c
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a < c & a < b
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre>
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote>
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Either the text-argument must already be present in the sequence, or some
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* initial substring of the text-argument must be present. (e.g. "a < b & ae <
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* e" is valid since "a" is present in the sequence before "ae" is reset). In
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* this latter case, "ae" is not entered and treated as a single character;
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* instead, "e" is sorted as if it were expanded to two characters: "a"
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* followed by an "e". This difference appears in natural languages: in
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* traditional Spanish "ch" is treated as though it contracts to a single
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* character (expressed as "c < ch < d"), while in traditional German a-umlaut
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* is treated as though it expanded to two characters (expressed as "a,A < b,B
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* ... & ae;? & AE;?"). [? and ? are, of course, the escape sequences for
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a-umlaut.]
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <strong>Ignorable Characters</strong>
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* For ignorable characters, the first rule must start with a relation (the
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* examples we have used above are really fragments; "a < b" really should be
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* "< a < b"). If, however, the first relation is not "<", then all the all
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* text-arguments up to the first "<" are ignorable. For example, ", - < a < b"
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* makes "-" an ignorable character, as we saw earlier in the word
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* "black-birds". In the samples for different languages, you see that most
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* accents are ignorable.
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p><strong>Normalization and Accents</strong>
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <code>RuleBasedCollator</code> automatically processes its rule table to
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* include both pre-composed and combining-character versions of accented
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* characters. Even if the provided rule string contains only base characters
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* and separate combining accent characters, the pre-composed accented
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* characters matching all canonical combinations of characters from the rule
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* string will be entered in the table.
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* This allows you to use a RuleBasedCollator to compare accented strings even
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* when the collator is set to NO_DECOMPOSITION. However, if the strings to be
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* collated contain combining sequences that may not be in canonical order, you
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* should set the collator to CANONICAL_DECOMPOSITION to enable sorting of
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* combining sequences.
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* For more information, see
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <A HREF="http://www.aw.com/devpress">The Unicode Standard, Version 3.0</A>.)
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p><strong>Errors</strong>
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* The following are errors:
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <UL Type=disc>
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*     <LI>A text-argument contains unquoted punctuation symbols
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        (e.g. "a < b-c < d").
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*     <LI>A relation or reset character not followed by a text-argument
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*        (e.g. "a < , b").
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*     <LI>A reset where the text-argument (or an initial substring of the
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*         text-argument) is not already in the sequence or allocated in the
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*         default UCA table.
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*         (e.g. "a < b & e < f")
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </UL>
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* If you produce one of these errors, a <code>RuleBasedCollator</code> throws
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* a <code>ParseException</code>.
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p><strong>Examples</strong>
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>Simple:     "< a < b < c < d"
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>Norwegian:  "< a,A< b,B< c,C< d,D< e,E< f,F< g,G< h,H< i,I< j,J
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                 < k,K< l,L< m,M< n,N< o,O< p,P< q,Q< r,R< s,S< t,T
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                < u,U< v,V< w,W< x,X< y,Y< z,Z
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                 < ?=a?,?=A?
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                 ;aa,AA< ?,?< ?,?"
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Normally, to create a rule-based Collator object, you will use
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <code>Collator</code>'s factory method <code>getInstance</code>.
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* However, to create a rule-based Collator object with specialized rules
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* tailored to your needs, you construct the <code>RuleBasedCollator</code>
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* with the rules contained in a <code>String</code> object. For example:
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote>
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre>
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String Simple = "< a < b < c < d";
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator mySimple = new RuleBasedCollator(Simple);
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre>
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote>
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Or:
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote>
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre>
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String Norwegian = "< a,A< b,B< c,C< d,D< e,E< f,F< g,G< h,H< i,I< j,J" +
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                 "< k,K< l,L< m,M< n,N< o,O< p,P< q,Q< r,R< s,S< t,T" +
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                 "< u,U< v,V< w,W< x,X< y,Y< z,Z" +
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                 "< ?=a?,?=A?" +
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                 ";aa,AA< ?,?< ?,?";
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator myNorwegian = new RuleBasedCollator(Norwegian);
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre>
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote>
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Combining <code>Collator</code>s is as simple as concatenating strings.
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Here's an example that combines two <code>Collator</code>s from two
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* different locales:
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote>
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre>
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // Create an en_US Collator object
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator en_USCollator = (RuleBasedCollator)
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*     Collator.getInstance(new Locale("en", "US", ""));
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // Create a da_DK Collator object
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator da_DKCollator = (RuleBasedCollator)
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*     Collator.getInstance(new Locale("da", "DK", ""));
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // Combine the two
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // First, get the collation rules from en_USCollator
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String en_USRules = en_USCollator.getRules();
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // Second, get the collation rules from da_DKCollator
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String da_DKRules = da_DKCollator.getRules();
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator newCollator =
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*     new RuleBasedCollator(en_USRules + da_DKRules);
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // newCollator has the combined rules
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre>
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote>
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* Another more interesting example would be to make changes on an existing
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* table to create a new <code>Collator</code> object.  For example, add
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* "& C < ch, cH, Ch, CH" to the <code>en_USCollator</code> object to create
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* your own:
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote>
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre>
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // Create a new Collator object with additional rules
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String addRules = "& C < ch, cH, Ch, CH";
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator myCollator =
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*     new RuleBasedCollator(en_USCollator + addRules);
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // myCollator contains the new rules
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre>
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote>
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* The following example demonstrates how to change the order of
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* non-spacing accents,
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote>
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre>
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // old rule
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String oldRules = "=?;?;?"    // main accents Diaeresis 00A8, Macron 00AF
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                               // Acute 00BF
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                 + "< a , A ; ae, AE ; ? , ?"
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                 + "< b , B < c, C < e, E & C < d, D";
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // change the order of accent characters
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String addOn = "& ?;?;?;"; // Acute 00BF, Macron 00AF, Diaeresis 00A8
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator myCollator = new RuleBasedCollator(oldRules + addOn);
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre>
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote>
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <p>
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* The last example shows how to put new primary ordering in before the
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* default setting. For example, in Japanese <code>Collator</code>, you
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* can either sort English characters before or after Japanese characters,
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <blockquote>
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <pre>
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // get en_US Collator rules
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator en_USCollator =
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*                      (RuleBasedCollator)Collator.getInstance(Locale.US);
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // add a few Japanese character to sort before English characters
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // suppose the last character before the first base letter 'a' in
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* // the English collation rule is ?
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* String jaString = "& \\u30A2 , \\u30FC < \\u30C8";
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* RuleBasedCollator myJapaneseCollator = new
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*     RuleBasedCollator(en_USCollator.getRules() + jaString);
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </pre>
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* </blockquote>
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* <P>
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* @author syn wee quek
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* @stable ICU 2.4
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class RuleBasedCollator extends Collator
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  // public constructors ------------------------------------------
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * RuleBasedCollator constructor. This takes the table rules and builds a
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * collation table out of them. Please see RuleBasedCollator class
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * description for more details on the collation rule syntax.
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param rules the collation rules to build the collation table from.
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @exception ParseException thrown if rules are empty or a Runtime error
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *            if collator can not be created.
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public RuleBasedCollator(String rules) throws ParseException
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // BEGIN android-changed
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (rules == null) {
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw new NullPointerException();
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // if (rules.length() == 0)
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //   throw new ParseException("Build rules empty.", 0);
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // END android-changed
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    m_collator_ = NativeCollation.openCollatorFromRules(rules,
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                              CollationAttribute.VALUE_OFF,
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                              CollationAttribute.VALUE_DEFAULT_STRENGTH);
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * RuleBasedCollator constructor. This takes the table rules and builds a
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * collation table out of them. Please see RuleBasedCollator class
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * description for more details on the collation rule syntax.
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param rules the collation rules to build the collation table from.
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param strength collation strength
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @exception ParseException thrown if rules are empty or a Runtime error
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *            if collator can not be created.
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #PRIMARY
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #SECONDARY
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #TERTIARY
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #QUATERNARY
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #IDENTICAL
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public RuleBasedCollator(String rules, int strength) throws ParseException
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // BEGIN android-changed
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (rules == null) {
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw new NullPointerException();
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // if (rules.length() == 0)
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //   throw new ParseException("Build rules empty.", 0);
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // END android-changed
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!CollationAttribute.checkStrength(strength))
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR);
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    m_collator_ = NativeCollation.openCollatorFromRules(rules,
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                CollationAttribute.VALUE_OFF,
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                strength);
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * RuleBasedCollator constructor. This takes the table rules and builds a
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * collation table out of them. Please see RuleBasedCollator class
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * description for more details on the collation rule syntax.
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <p>Note API change starting from release 2.4. Prior to release 2.4, the
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * normalizationmode argument values are from the class
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * com.ibm.icu4jni.text.Normalization. In 2.4,
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * the valid normalizationmode arguments for this API are
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * CollationAttribute.VALUE_ON and CollationAttribute.VALUE_OFF.
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * </p>
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param rules the collation rules to build the collation table from.
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param strength collation strength
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param normalizationmode normalization mode
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @exception IllegalArgumentException thrown when constructor error occurs
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #PRIMARY
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #SECONDARY
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #TERTIARY
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #QUATERNARY
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #IDENTICAL
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #CANONICAL_DECOMPOSITION
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #NO_DECOMPOSITION
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public RuleBasedCollator(String rules, int normalizationmode, int strength)
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // BEGIN android-added
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (rules == null) {
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw new NullPointerException();
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // END android-added
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!CollationAttribute.checkStrength(strength) ||
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        !CollationAttribute.checkNormalization(normalizationmode)) {
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR);
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    m_collator_ = NativeCollation.openCollatorFromRules(rules,
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                          normalizationmode, strength);
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  // public methods -----------------------------------------------
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Makes a complete copy of the current object.
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @return a copy of this object if data clone is a success, otherwise null
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public Object clone()
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RuleBasedCollator result = null;
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int collatoraddress = NativeCollation.safeClone(m_collator_);
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    result = new RuleBasedCollator(collatoraddress);
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (Collator)result;
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * The comparison function compares the character data stored in two
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * different strings. Returns information about whether a string is less
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * than, greater than or equal to another string.
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <p>Example of use:
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <br>
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <code>
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *   Collator myCollation = Collator.createInstance(Locale::US);
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *   myCollation.setStrength(CollationAttribute.VALUE_PRIMARY);
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *   // result would be Collator.RESULT_EQUAL ("abc" == "ABC")
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *   // (no primary difference between "abc" and "ABC")
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *   int result = myCollation.compare("abc", "ABC",3);
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *   myCollation.setStrength(CollationAttribute.VALUE_TERTIARY);
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *   // result would be Collation::LESS (abc" &lt;&lt;&lt; "ABC")
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *   // (with tertiary difference between "abc" and "ABC")
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *   int result = myCollation.compare("abc", "ABC",3);
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * </code>
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param source The source string.
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param target The target string.
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @return result of the comparison, Collator.RESULT_EQUAL,
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *         Collator.RESULT_GREATER or Collator.RESULT_LESS
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public int compare(String source, String target)
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return NativeCollation.compare(m_collator_, source, target);
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Get the normalization mode for this object.
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * The normalization mode influences how strings are compared.
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #CANONICAL_DECOMPOSITION
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #NO_DECOMPOSITION
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public int getDecomposition()
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return NativeCollation.getNormalization(m_collator_);
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <p>Sets the decomposition mode of the Collator object on or off.
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * If the decomposition mode is set to on, string would be decomposed into
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * NFD format where necessary before sorting.</p>
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * </p>
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param decompositionmode the new decomposition mode
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #CANONICAL_DECOMPOSITION
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #NO_DECOMPOSITION
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public void setDecomposition(int decompositionmode)
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!CollationAttribute.checkNormalization(decompositionmode))
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR);
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    NativeCollation.setAttribute(m_collator_,
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                 CollationAttribute.NORMALIZATION_MODE,
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                 decompositionmode);
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Determines the minimum strength that will be use in comparison or
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * transformation.
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <p>
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * E.g. with strength == CollationAttribute.VALUE_SECONDARY, the tertiary difference
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * is ignored
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * </p>
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <p>
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * E.g. with strength == PRIMARY, the secondary and tertiary difference are
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * ignored.
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * </p>
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @return the current comparison level.
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #PRIMARY
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #SECONDARY
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #TERTIARY
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #QUATERNARY
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #IDENTICAL
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public int getStrength()
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return NativeCollation.getAttribute(m_collator_,
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                        CollationAttribute.STRENGTH);
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Sets the minimum strength to be used in comparison or transformation.
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <p>Example of use:
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <br>
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <code>
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Collator myCollation = Collator.createInstance(Locale::US);
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * myCollation.setStrength(PRIMARY);
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * // result will be "abc" == "ABC"
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * // tertiary differences will be ignored
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * int result = myCollation->compare("abc", "ABC");
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * </code>
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param strength the new comparison level.
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @exception IllegalArgumentException when argument does not belong to any collation strength
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *            mode or error occurs while setting data.
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #PRIMARY
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #SECONDARY
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #TERTIARY
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #QUATERNARY
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @see #IDENTICAL
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public void setStrength(int strength)
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!CollationAttribute.checkStrength(strength))
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR);
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    NativeCollation.setAttribute(m_collator_, CollationAttribute.STRENGTH,
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                 strength);
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Sets the attribute to be used in comparison or transformation.
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <p>Example of use:
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <br>
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <code>
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *  Collator myCollation = Collator.createInstance(Locale::US);
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *  myCollation.setAttribute(CollationAttribute.CASE_LEVEL,
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *                           CollationAttribute.VALUE_ON);
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *  int result = myCollation->compare("\\u30C3\\u30CF",
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *                                    "\\u30C4\\u30CF");
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * // result will be Collator.RESULT_LESS.
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * </code>
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param type the attribute to be set from CollationAttribute
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param value attribute value from CollationAttribute
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public void setAttribute(int type, int value)
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!CollationAttribute.checkAttribute(type, value))
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR);
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    NativeCollation.setAttribute(m_collator_, type, value);
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Gets the attribute to be used in comparison or transformation.
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param type the attribute to be set from CollationAttribute
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @return value attribute value from CollationAttribute
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public int getAttribute(int type)
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!CollationAttribute.checkType(type))
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      throw ErrorCode.getException(ErrorCode.U_ILLEGAL_ARGUMENT_ERROR);
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return NativeCollation.getAttribute(m_collator_, type);
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Get the sort key as an CollationKey object from the argument string.
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * To retrieve sort key in terms of byte arrays, use the method as below<br>
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <br>
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <code>
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Collator collator = Collator.getInstance();
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * byte[] array = collator.getSortKey(source);
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * </code><br>
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Byte array result are zero-terminated and can be compared using
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * java.util.Arrays.equals();
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param source string to be processed.
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @return the sort key
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public CollationKey getCollationKey(String source)
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // BEGIN android-removed
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // return new CollationKey(NativeCollation.getSortKey(m_collator_, source));
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // END android-removed
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // BEGIN android-added
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if(source == null) {
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    byte[] key = NativeCollation.getSortKey(m_collator_, source);
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if(key == null) {
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      return null;
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return new CollationKey(key);
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // END android-added
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Get a sort key for the argument string
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Sort keys may be compared using java.util.Arrays.equals
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param source string for key to be generated
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @return sort key
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public byte[] getSortKey(String source)
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return NativeCollation.getSortKey(m_collator_, source);
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Get the collation rules of this Collation object
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * The rules will follow the rule syntax.
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @return collation rules.
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public String getRules()
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return NativeCollation.getRules(m_collator_);
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Create a CollationElementIterator object that will iterator over the
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * elements in a string, using the collation rules defined in this
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * RuleBasedCollator
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param source string to iterate over
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @return address of C collationelement
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @exception IllegalArgumentException thrown when error occurs
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public CollationElementIterator getCollationElementIterator(String source)
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    CollationElementIterator result = new CollationElementIterator(
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         NativeCollation.getCollationElementIterator(m_collator_, source));
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // result.setOwnCollationElementIterator(true);
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return result;
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  // BEGIN android-added
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Create a CollationElementIterator object that will iterator over the
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * elements in a string, using the collation rules defined in this
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * RuleBasedCollator
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param source string to iterate over
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @return address of C collationelement
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @exception IllegalArgumentException thrown when error occurs
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public CollationElementIterator getCollationElementIterator(
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project          CharacterIterator source)
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    CollationElementIterator result = new CollationElementIterator(
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         NativeCollation.getCollationElementIterator(m_collator_,
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                 source.toString()));
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // result.setOwnCollationElementIterator(true);
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return result;
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  // END android-added
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Returns a hash of this collation object
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Note this method is not complete, it only returns 0 at the moment.
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @return hash of this collation object
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public int hashCode()
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // since rules do not change once it is created, we can cache the hash
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (m_hashcode_ == 0) {
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      m_hashcode_ = NativeCollation.hashCode(m_collator_);
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      if (m_hashcode_ == 0)
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        m_hashcode_ = 1;
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return m_hashcode_;
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Checks if argument object is equals to this object.
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param target object
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @return true if source is equivalent to target, false otherwise
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @stable ICU 2.4
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  public boolean equals(Object target)
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (this == target)
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      return true;
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (target == null)
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      return false;
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (getClass() != target.getClass())
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      return false;
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RuleBasedCollator tgtcoll = (RuleBasedCollator)target;
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return getRules().equals(tgtcoll.getRules()) &&
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project           getStrength() == tgtcoll.getStrength() &&
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project           getDecomposition() == tgtcoll.getDecomposition();
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  // package constructor ----------------------------------------
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * RuleBasedCollator default constructor. This constructor takes the default
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * locale. The only caller of this class should be Collator.getInstance().
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Current implementation createInstance() returns a RuleBasedCollator(Locale)
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * instance. The RuleBasedCollator will be created in the following order,
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <ul>
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <li> Data from argument locale resource bundle if found, otherwise
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <li> Data from parent locale resource bundle of arguemtn locale if found,
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *      otherwise
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <li> Data from built-in default collation rules if found, other
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <li> null is returned
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * </ul>
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  RuleBasedCollator()
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    m_collator_ = NativeCollation.openCollator();
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * RuleBasedCollator constructor. This constructor takes a locale. The
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * only caller of this class should be Collator.createInstance().
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Current implementation createInstance() returns a RuleBasedCollator(Locale)
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * instance. The RuleBasedCollator will be created in the following order,
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <ul>
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <li> Data from argument locale resource bundle if found, otherwise
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <li> Data from parent locale resource bundle of arguemtn locale if found,
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  *      otherwise
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <li> Data from built-in default collation rules if found, other
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * <li> null is returned
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * </ul>
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param locale locale used
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  RuleBasedCollator(Locale locale)
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (locale == null) {
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      m_collator_ = NativeCollation.openCollator();
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    else {
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project      m_collator_ = NativeCollation.openCollator(locale.toString());
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  // protected methods --------------------------------------------
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Garbage collection.
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Close C collator and reclaim memory.
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  protected void finalize()
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    NativeCollation.closeCollator(m_collator_);
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  // private data members -----------------------------------------
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * C collator
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  private int m_collator_;
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Hash code for rules
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  private int m_hashcode_ = 0;
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  // private constructor -----------------------------------------
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  /**
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Private use constructor.
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * Does not create any instance of the C collator. Accepts argument as the
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * C collator for new instance.
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  * @param collatoraddress address of C collator
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  */
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  private RuleBasedCollator(int collatoraddress)
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  {
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    m_collator_ = collatoraddress;
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  }
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
720