]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_8_1_1/main/classes/core/src/com/ibm/icu/impl/locale/BaseLocale.java
Added flags.
[Dictionary.git] / jars / icu4j-4_8_1_1 / main / classes / core / src / com / ibm / icu / impl / locale / BaseLocale.java
1 /*
2  *******************************************************************************
3  * Copyright (C) 2009-2010, International Business Machines Corporation and    *
4  * others. All Rights Reserved.                                                *
5  *******************************************************************************
6  */
7
8 package com.ibm.icu.impl.locale;
9
10
11 public final class BaseLocale {
12
13     private static final boolean JDKIMPL = false;
14
15     public static final String SEP = "_";
16
17     private static final Cache CACHE = new Cache();
18     public static final BaseLocale ROOT = BaseLocale.getInstance("", "", "", "");
19
20     private String _language = "";
21     private String _script = "";
22     private String _region = "";
23     private String _variant = "";
24
25     private transient volatile int _hash = 0;
26
27     private BaseLocale(String language, String script, String region, String variant) {
28         if (language != null) {
29             _language = AsciiUtil.toLowerString(language).intern();
30         }
31         if (script != null) {
32             _script = AsciiUtil.toTitleString(script).intern();
33         }
34         if (region != null) {
35             _region = AsciiUtil.toUpperString(region).intern();
36         }
37         if (variant != null) {
38             if (JDKIMPL) {
39                 // preserve upper/lower cases
40                 _variant = variant.intern();
41             } else {
42                 _variant = AsciiUtil.toUpperString(variant).intern();
43             }
44         }
45     }
46
47     public static BaseLocale getInstance(String language, String script, String region, String variant) {
48         if (JDKIMPL) {
49             // JDK uses deprecated ISO639.1 language codes for he, yi and id
50             if (AsciiUtil.caseIgnoreMatch(language, "he")) {
51                 language = "iw";
52             } else if (AsciiUtil.caseIgnoreMatch(language, "yi")) {
53                 language = "ji";
54             } else if (AsciiUtil.caseIgnoreMatch(language, "id")) {
55                 language = "in";
56             }
57         }
58         Key key = new Key(language, script, region, variant);
59         BaseLocale baseLocale = CACHE.get(key);
60         return baseLocale;
61     }
62
63     public String getLanguage() {
64         return _language;
65     }
66
67     public String getScript() {
68         return _script;
69     }
70
71     public String getRegion() {
72         return _region;
73     }
74
75     public String getVariant() {
76         return _variant;
77     }
78
79     public boolean equals(Object obj) {
80         if (this == obj) {
81             return true;
82         }
83         if (!(obj instanceof BaseLocale)) {
84             return false;
85         }
86         BaseLocale other = (BaseLocale)obj;
87         return hashCode() == other.hashCode()
88                 && _language.equals(other._language)
89                 && _script.equals(other._script)
90                 && _region.equals(other._region)
91                 && _variant.equals(other._variant);
92     }
93
94     public String toString() {
95         StringBuilder buf = new StringBuilder();
96         if (_language.length() > 0) {
97             buf.append("language=");
98             buf.append(_language);
99         }
100         if (_script.length() > 0) {
101             if (buf.length() > 0) {
102                 buf.append(", ");
103             }
104             buf.append("script=");
105             buf.append(_script);
106         }
107         if (_region.length() > 0) {
108             if (buf.length() > 0) {
109                 buf.append(", ");
110             }
111             buf.append("region=");
112             buf.append(_region);
113         }
114         if (_variant.length() > 0) {
115             if (buf.length() > 0) {
116                 buf.append(", ");
117             }
118             buf.append("variant=");
119             buf.append(_variant);
120         }
121         return buf.toString();
122     }
123
124     public int hashCode() {
125         int h = _hash;
126         if (h == 0) {
127             // Generating a hash value from language, script, region and variant
128             for (int i = 0; i < _language.length(); i++) {
129                 h = 31*h + _language.charAt(i);
130             }
131             for (int i = 0; i < _script.length(); i++) {
132                 h = 31*h + _script.charAt(i);
133             }
134             for (int i = 0; i < _region.length(); i++) {
135                 h = 31*h + _region.charAt(i);
136             }
137             for (int i = 0; i < _variant.length(); i++) {
138                 h = 31*h + _variant.charAt(i);
139             }
140             _hash = h;
141         }
142         return h;
143     }
144
145     private static class Key implements Comparable<Key> {
146         private String _lang = "";
147         private String _scrt = "";
148         private String _regn = "";
149         private String _vart = "";
150
151         private volatile int _hash; // Default to 0
152
153         public Key(String language, String script, String region, String variant) {
154             if (language != null) {
155                 _lang = language;
156             }
157             if (script != null) {
158                 _scrt = script;
159             }
160             if (region != null) {
161                 _regn = region;
162             }
163             if (variant != null) {
164                 _vart = variant;
165             }
166         }
167
168         public boolean equals(Object obj) {
169             if (JDKIMPL) {
170                 return (this == obj) ||
171                         (obj instanceof Key)
172                         && AsciiUtil.caseIgnoreMatch(((Key)obj)._lang, this._lang)
173                         && AsciiUtil.caseIgnoreMatch(((Key)obj)._scrt, this._scrt)
174                         && AsciiUtil.caseIgnoreMatch(((Key)obj)._regn, this._regn)
175                         && ((Key)obj)._vart.equals(_vart); // variant is case sensitive in JDK!
176             }
177             return (this == obj) ||
178                     (obj instanceof Key)
179                     && AsciiUtil.caseIgnoreMatch(((Key)obj)._lang, this._lang)
180                     && AsciiUtil.caseIgnoreMatch(((Key)obj)._scrt, this._scrt)
181                     && AsciiUtil.caseIgnoreMatch(((Key)obj)._regn, this._regn)
182                     && AsciiUtil.caseIgnoreMatch(((Key)obj)._vart, this._vart);
183         }
184
185         public int compareTo(Key other) {
186             int res = AsciiUtil.caseIgnoreCompare(this._lang, other._lang);
187             if (res == 0) {
188                 res = AsciiUtil.caseIgnoreCompare(this._scrt, other._scrt);
189                 if (res == 0) {
190                     res = AsciiUtil.caseIgnoreCompare(this._regn, other._regn);
191                     if (res == 0) {
192                         if (JDKIMPL) {
193                             res = this._vart.compareTo(other._vart);
194                         } else {
195                             res = AsciiUtil.caseIgnoreCompare(this._vart, other._vart);
196                         }
197                     }
198                 }
199             }
200             return res;
201         }
202
203         public int hashCode() {
204             int h = _hash;
205             if (h == 0) {
206                 // Generating a hash value from language, script, region and variant
207                 for (int i = 0; i < _lang.length(); i++) {
208                     h = 31*h + AsciiUtil.toLower(_lang.charAt(i));
209                 }
210                 for (int i = 0; i < _scrt.length(); i++) {
211                     h = 31*h + AsciiUtil.toLower(_scrt.charAt(i));
212                 }
213                 for (int i = 0; i < _regn.length(); i++) {
214                     h = 31*h + AsciiUtil.toLower(_regn.charAt(i));
215                 }
216                 for (int i = 0; i < _vart.length(); i++) {
217                     if (JDKIMPL) {
218                         h = 31*h + _vart.charAt(i);
219                     } else {
220                         h = 31*h + AsciiUtil.toLower(_vart.charAt(i));
221                     }
222                 }
223                 _hash = h;
224             }
225             return h;
226         }
227
228         public static Key normalize(Key key) {
229             String lang = AsciiUtil.toLowerString(key._lang).intern();
230             String scrt = AsciiUtil.toTitleString(key._scrt).intern();
231             String regn = AsciiUtil.toUpperString(key._regn).intern();
232             String vart;
233             if (JDKIMPL) {
234                 // preserve upper/lower cases
235                 vart = key._vart.intern();
236             } else {
237                 vart = AsciiUtil.toUpperString(key._vart).intern();
238             }
239             return new Key(lang, scrt, regn, vart);
240         }
241     }
242
243     private static class Cache extends LocaleObjectCache<Key, BaseLocale> {
244
245         public Cache() {
246         }
247
248         protected Key normalizeKey(Key key) {
249             return Key.normalize(key);
250         }
251
252         protected BaseLocale createObject(Key key) {
253             return new BaseLocale(key._lang, key._scrt, key._regn, key._vart);
254         }
255
256     }
257 }