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