]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/util/ICUServiceTest.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / util / ICUServiceTest.java
1 /**\r
2  *******************************************************************************\r
3  * Copyright (C) 2001-2010, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.dev.test.util;\r
8 \r
9 import java.text.Collator;\r
10 import java.util.Arrays;\r
11 import java.util.Collections;\r
12 import java.util.Comparator;\r
13 import java.util.EventListener;\r
14 import java.util.HashMap;\r
15 import java.util.HashSet;\r
16 import java.util.Iterator;\r
17 import java.util.List;\r
18 import java.util.Map;\r
19 import java.util.Set;\r
20 import java.util.SortedMap;\r
21 import java.util.Map.Entry;\r
22 \r
23 import com.ibm.icu.dev.test.TestFmwk;\r
24 import com.ibm.icu.impl.ICULocaleService;\r
25 import com.ibm.icu.impl.ICUNotifier;\r
26 import com.ibm.icu.impl.ICURWLock;\r
27 import com.ibm.icu.impl.ICUResourceBundle;\r
28 import com.ibm.icu.impl.ICUService;\r
29 import com.ibm.icu.impl.LocaleUtility;\r
30 import com.ibm.icu.impl.ICULocaleService.ICUResourceBundleFactory;\r
31 import com.ibm.icu.impl.ICULocaleService.LocaleKey;\r
32 import com.ibm.icu.impl.ICULocaleService.LocaleKeyFactory;\r
33 import com.ibm.icu.impl.ICUService.Factory;\r
34 import com.ibm.icu.impl.ICUService.Key;\r
35 import com.ibm.icu.impl.ICUService.ServiceListener;\r
36 import com.ibm.icu.impl.ICUService.SimpleFactory;\r
37 import com.ibm.icu.util.ULocale;\r
38 \r
39 public class ICUServiceTest extends TestFmwk\r
40 {\r
41     public static void main(String[] args) throws Exception {\r
42     ICUServiceTest test = new ICUServiceTest();\r
43     test.run(args);\r
44     }\r
45 \r
46     private String lrmsg(String message, Object lhs, Object rhs) {\r
47     return message + " lhs: " + lhs + " rhs: " + rhs;\r
48     }\r
49 \r
50     public void confirmBoolean(String message, boolean val) {\r
51     msg(message, val ? LOG : ERR, !val, true);\r
52     }\r
53 \r
54     public void confirmEqual(String message, Object lhs, Object rhs) {\r
55         msg(lrmsg(message, lhs, rhs), (lhs == null ? rhs == null : lhs.equals(rhs)) ? LOG : ERR, true, true);\r
56     }\r
57 \r
58     public void confirmIdentical(String message, Object lhs, Object rhs) {\r
59     msg(lrmsg(message, lhs, rhs), lhs == rhs ? LOG : ERR, true, true);\r
60     }\r
61 \r
62     public void confirmIdentical(String message, int lhs, int rhs) {\r
63     msg(message + " lhs: " + lhs + " rhs: " + rhs, lhs == rhs ? LOG : ERR, true, true);\r
64     }\r
65 \r
66     /**\r
67      * Convenience override of getDisplayNames(ULocale, Comparator, String) that\r
68      * uses the current default ULocale as the locale, the default collator for\r
69      * the locale as the comparator to sort the display names, and null for\r
70      * the matchID.\r
71      */\r
72     public SortedMap getDisplayNames(ICUService service) {\r
73         ULocale locale = ULocale.getDefault();\r
74         Collator col = Collator.getInstance(locale.toLocale());\r
75         return service.getDisplayNames(locale, col, null);\r
76     }\r
77 \r
78     /**\r
79      * Convenience override of getDisplayNames(ULocale, Comparator, String) that\r
80      * uses the default collator for the locale as the comparator to\r
81      * sort the display names, and null for the matchID.\r
82      */\r
83     public SortedMap getDisplayNames(ICUService service, ULocale locale) {\r
84         Collator col = Collator.getInstance(locale.toLocale());\r
85         return service.getDisplayNames(locale, col, null);\r
86     }\r
87     /**\r
88      * Convenience override of getDisplayNames(ULocale, Comparator, String) that\r
89      * uses the default collator for the locale as the comparator to\r
90      * sort the display names.\r
91      */\r
92     public SortedMap getDisplayNames(ICUService service, ULocale locale, String matchID) {\r
93         Collator col = Collator.getInstance(locale.toLocale());\r
94         return service.getDisplayNames(locale, col, matchID);\r
95     }\r
96 \r
97     // use locale keys\r
98     static final class TestService extends ICUService {\r
99         public TestService() {\r
100             super("Test Service");\r
101         }\r
102 \r
103     public Key createKey(String id) {\r
104         return LocaleKey.createWithCanonicalFallback(id, null); // no fallback locale\r
105     }\r
106     }\r
107 \r
108     public void TestAPI() {\r
109     // create a service using locale keys,\r
110     ICUService service = new TestService();\r
111 \r
112         logln("service name:" + service.getName());\r
113 \r
114     // register an object with one locale,\r
115     // search for an object with a more specific locale\r
116     // should return the original object\r
117     Integer singleton0 = new Integer(0);\r
118     service.registerObject(singleton0, "en_US");\r
119     Object result = service.get("en_US_FOO");\r
120     confirmIdentical("1) en_US_FOO -> en_US", result, singleton0);\r
121 \r
122     // register a new object with the more specific locale\r
123     // search for an object with that locale\r
124     // should return the new object\r
125     Integer singleton1 = new Integer(1);\r
126     service.registerObject(singleton1, "en_US_FOO");\r
127     result = service.get("en_US_FOO");\r
128     confirmIdentical("2) en_US_FOO -> en_US_FOO", result, singleton1);\r
129 \r
130     // search for an object that falls back to the first registered locale\r
131     result = service.get("en_US_BAR");\r
132     confirmIdentical("3) en_US_BAR -> en_US", result, singleton0);\r
133 \r
134     // get a list of the factories, should be two\r
135     List factories = service.factories();\r
136     confirmIdentical("4) factory size", factories.size(), 2);\r
137 \r
138     // register a new object with yet another locale\r
139     // original factory list is unchanged\r
140     Integer singleton2 = new Integer(2);\r
141     service.registerObject(singleton2, "en");\r
142     confirmIdentical("5) factory size", factories.size(), 2);\r
143 \r
144     // search for an object with the new locale\r
145     // stack of factories is now en, en_US_FOO, en_US\r
146     // search for en_US should still find en_US object\r
147     result = service.get("en_US_BAR");\r
148     confirmIdentical("6) en_US_BAR -> en_US", result, singleton0);\r
149 \r
150     // register a new object with an old id, should hide earlier factory using this id, but leave it there\r
151     Integer singleton3 = new Integer(3);\r
152     service.registerObject(singleton3, "en_US");\r
153     factories = service.factories();\r
154     confirmIdentical("9) factory size", factories.size(), 4);\r
155 \r
156     // should get data from that new factory\r
157     result = service.get("en_US_BAR");\r
158     confirmIdentical("10) en_US_BAR -> (3)", result, singleton3);\r
159 \r
160     // remove new factory\r
161     // should have fewer factories again\r
162     service.unregisterFactory((Factory)factories.get(0));\r
163     factories = service.factories();\r
164     confirmIdentical("11) factory size", factories.size(), 3);\r
165 \r
166     // should get original data again after remove factory\r
167     result = service.get("en_US_BAR");\r
168     confirmIdentical("12) en_US_BAR -> 0", result, singleton0);\r
169 \r
170     // shouldn't find unregistered ids\r
171     result = service.get("foo");\r
172     confirmIdentical("13) foo -> null", result, null);\r
173 \r
174     // should find non-canonical strings\r
175     String[] resultID = new String[1];\r
176     result = service.get("EN_us_fOo", resultID);\r
177     confirmEqual("14) find non-canonical", resultID[0], "en_US_FOO");\r
178 \r
179     // should be able to register non-canonical strings and get them canonicalized\r
180     service.registerObject(singleton3, "eN_ca_dUde");\r
181     result = service.get("En_Ca_DuDe", resultID);\r
182     confirmEqual("15) register non-canonical", resultID[0], "en_CA_DUDE");\r
183 \r
184     // should be able to register invisible factories, these will not\r
185     // be visible by default, but if you know the secret password you\r
186     // can still access these services...\r
187     Integer singleton4 = new Integer(4);\r
188     service.registerObject(singleton4, "en_US_BAR", false);\r
189     result = service.get("en_US_BAR");\r
190     confirmIdentical("17) get invisible", result, singleton4);\r
191 \r
192     // should not be able to locate invisible services\r
193     Set ids = service.getVisibleIDs();\r
194     confirmBoolean("18) find invisible", !ids.contains("en_US_BAR"));\r
195 \r
196     service.reset();\r
197     // an anonymous factory than handles all ids\r
198     {\r
199         Factory factory = new Factory() {\r
200             public Object create(Key key, ICUService unusedService) {\r
201                 return new ULocale(key.currentID());\r
202             }\r
203 \r
204             public void updateVisibleIDs(Map unusedResult) {\r
205             }\r
206 \r
207             public String getDisplayName(String id, ULocale l) {\r
208                 return null;\r
209             }\r
210         };\r
211         service.registerFactory(factory);\r
212 \r
213         // anonymous factory will still handle the id\r
214         result = service.get(ULocale.US.toString());\r
215         confirmEqual("21) locale", result, ULocale.US);\r
216 \r
217         // still normalizes id\r
218         result = service.get("EN_US_BAR");\r
219         confirmEqual("22) locale", result, new ULocale("en_US_BAR"));\r
220 \r
221         // we can override for particular ids\r
222         service.registerObject(singleton3, "en_US_BAR");\r
223         result = service.get("en_US_BAR");\r
224         confirmIdentical("23) override super", result, singleton3);\r
225 \r
226     }\r
227 \r
228     // empty service should not recognize anything\r
229     service.reset();\r
230     result = service.get("en_US");\r
231     confirmIdentical("24) empty", result, null);\r
232 \r
233     // create a custom multiple key factory\r
234     {\r
235         String[] xids = { "en_US_VALLEY_GIRL",\r
236                   "en_US_VALLEY_BOY",\r
237                   "en_US_SURFER_GAL",\r
238                   "en_US_SURFER_DUDE"\r
239         };\r
240         service.registerFactory(new TestLocaleKeyFactory(xids, "Later"));\r
241     }\r
242 \r
243     // iterate over the visual ids returned by the multiple factory\r
244     {\r
245         Set vids = service.getVisibleIDs();\r
246         Iterator iter = vids.iterator();\r
247         int count = 0;\r
248         while (iter.hasNext()) {\r
249         ++count;\r
250                 String id = (String)iter.next();\r
251         logln("  " + id + " --> " + service.get(id));\r
252         }\r
253         // four visible ids\r
254         confirmIdentical("25) visible ids", count, 4);\r
255     }\r
256 \r
257     // iterate over the display names\r
258     {\r
259         Map dids = getDisplayNames(service, ULocale.GERMANY);\r
260         Iterator iter = dids.entrySet().iterator();\r
261         int count = 0;\r
262         while (iter.hasNext()) {\r
263         ++count;\r
264         Entry e = (Entry)iter.next();\r
265         logln("  " + e.getKey() + " -- > " + e.getValue());\r
266         }\r
267         // four display names, in german\r
268         confirmIdentical("26) display names", count, 4);\r
269     }\r
270 \r
271     // no valid display name\r
272     confirmIdentical("27) get display name", service.getDisplayName("en_US_VALLEY_GEEK"), null);\r
273 \r
274     {\r
275         String name = service.getDisplayName("en_US_SURFER_DUDE", ULocale.US);\r
276         confirmEqual("28) get display name", name, "English (United States, SURFER_DUDE)");\r
277     }\r
278 \r
279     // register another multiple factory\r
280     {\r
281         String[] xids = {\r
282         "en_US_SURFER", "en_US_SURFER_GAL", "en_US_SILICON", "en_US_SILICON_GEEK"\r
283         };\r
284         service.registerFactory(new TestLocaleKeyFactory(xids, "Rad dude"));\r
285     }\r
286 \r
287     // this time, we have seven display names\r
288         // Rad dude's surfer gal 'replaces' later's surfer gal\r
289     {\r
290         Map dids = getDisplayNames(service);\r
291         Iterator iter = dids.entrySet().iterator();\r
292         int count = 0;\r
293         while (iter.hasNext()) {\r
294         ++count;\r
295         Entry e = (Entry)iter.next();\r
296         logln("  " + e.getKey() + " --> " + e.getValue());\r
297         }\r
298         // seven display names, in spanish\r
299         confirmIdentical("29) display names", count, 7);\r
300     }\r
301 \r
302     // we should get the display name corresponding to the actual id\r
303     // returned by the id we used.\r
304     {\r
305         String[] actualID = new String[1];\r
306         String id = "en_us_surfer_gal";\r
307         String gal = (String)service.get(id, actualID);\r
308         if (gal != null) {\r
309                 logln("actual id: " + actualID[0]);\r
310         String displayName = service.getDisplayName(actualID[0], ULocale.US);\r
311         logln("found actual: " + gal + " with display name: " + displayName);\r
312         confirmBoolean("30) found display name for actual", displayName != null);\r
313 \r
314         displayName = service.getDisplayName(id, ULocale.US);\r
315         logln("found query: " + gal + " with display name: " + displayName);\r
316         // this is no longer a bug, we want to return display names for anything\r
317         // that a factory handles.  since we handle it, we should return a display\r
318         // name.  see jb3549\r
319         // confirmBoolean("31) found display name for query", displayName == null);\r
320         } else {\r
321         errln("30) service could not find entry for " + id);\r
322         }\r
323 \r
324             // this should be handled by the 'dude' factory, since it overrides en_US_SURFER.\r
325         id = "en_US_SURFER_BOZO";\r
326         String bozo = (String)service.get(id, actualID);\r
327         if (bozo != null) {\r
328         String displayName = service.getDisplayName(actualID[0], ULocale.US);\r
329         logln("found actual: " + bozo + " with display name: " + displayName);\r
330         confirmBoolean("32) found display name for actual", displayName != null);\r
331 \r
332         displayName = service.getDisplayName(id, ULocale.US);\r
333         logln("found actual: " + bozo + " with display name: " + displayName);\r
334         // see above and jb3549\r
335         // confirmBoolean("33) found display name for query", displayName == null);\r
336         } else {\r
337         errln("32) service could not find entry for " + id);\r
338         }\r
339 \r
340             confirmBoolean("34) is default ", !service.isDefault());\r
341     }\r
342 \r
343         /*\r
344       // disallow hiding for now\r
345 \r
346       // hiding factory should obscure 'sublocales'\r
347       {\r
348       String[] xids = {\r
349       "en_US_VALLEY", "en_US_SILICON"\r
350       };\r
351       service.registerFactory(new TestHidingFactory(xids, "hiding"));\r
352       }\r
353 \r
354       {\r
355       Map dids = service.getDisplayNames();\r
356       Iterator iter = dids.entrySet().iterator();\r
357       int count = 0;\r
358       while (iter.hasNext()) {\r
359       ++count;\r
360       Entry e = (Entry)iter.next();\r
361       logln("  " + e.getKey() + " -- > " + e.getValue());\r
362       }\r
363       confirmIdentical("35) hiding factory", count, 5);\r
364       }\r
365         */\r
366 \r
367     {\r
368         Set xids = service.getVisibleIDs();\r
369         Iterator iter = xids.iterator();\r
370         while (iter.hasNext()) {\r
371         String xid = (String)iter.next();\r
372         logln(xid + "?  " + service.get(xid));\r
373         }\r
374 \r
375         logln("valleygirl?  " + service.get("en_US_VALLEY_GIRL"));\r
376         logln("valleyboy?   " + service.get("en_US_VALLEY_BOY"));\r
377         logln("valleydude?  " + service.get("en_US_VALLEY_DUDE"));\r
378         logln("surfergirl?  " + service.get("en_US_SURFER_GIRL"));\r
379     }\r
380 \r
381     // resource bundle factory.\r
382     service.reset();\r
383     service.registerFactory(new ICUResourceBundleFactory());\r
384 \r
385     // list all of the resources\r
386     {\r
387             logln("all visible ids: " + service.getVisibleIDs());\r
388             /*\r
389           Set xids = service.getVisibleIDs();\r
390           StringBuffer buf = new StringBuffer("{");\r
391           boolean notfirst = false;\r
392           Iterator iter = xids.iterator();\r
393           while (iter.hasNext()) {\r
394           String xid = (String)iter.next();\r
395           if (notfirst) {\r
396           buf.append(", ");\r
397           } else {\r
398           notfirst = true;\r
399           }\r
400           buf.append(xid);\r
401           }\r
402           buf.append("}");\r
403           logln(buf.toString());\r
404             */\r
405     }\r
406 \r
407         // list only the resources for es, default locale\r
408         // since we're using the default Key, only "es" is matched\r
409         {\r
410             logln("visible ids for es locale: " + service.getVisibleIDs("es"));\r
411         }\r
412 \r
413         // list only the spanish display names for es, spanish collation order\r
414         // since we're using the default Key, only "es" is matched\r
415         {\r
416             logln("display names: " + getDisplayNames(service, new ULocale("es"), "es"));\r
417         }\r
418 \r
419         // list the display names in reverse order\r
420         {\r
421             logln("display names in reverse order: " +\r
422                   service.getDisplayNames(ULocale.US, new Comparator() {\r
423                           public int compare(Object lhs, Object rhs) {\r
424                               return -String.CASE_INSENSITIVE_ORDER.compare((String)lhs, (String)rhs);\r
425                           }\r
426                       }));\r
427         }\r
428 \r
429     // get all the display names of these resources\r
430     // this should be fast since the display names were cached.\r
431     {\r
432             logln("service display names for de_DE");\r
433         Map names = getDisplayNames(service, new ULocale("de_DE"));\r
434         StringBuffer buf = new StringBuffer("{");\r
435         Iterator iter = names.entrySet().iterator();\r
436         while (iter.hasNext()) {\r
437         Entry e = (Entry)iter.next();\r
438         String name = (String)e.getKey();\r
439         String id = (String)e.getValue();\r
440         buf.append("\n   " + name + " --> " + id);\r
441         }\r
442         buf.append("\n}");\r
443         logln(buf.toString());\r
444     }\r
445 \r
446         CalifornioLanguageFactory califactory = new CalifornioLanguageFactory();\r
447         service.registerFactory(califactory);\r
448     // get all the display names of these resources\r
449     {\r
450             logln("californio language factory");\r
451         StringBuffer buf = new StringBuffer("{");\r
452             String[] idNames = {\r
453                 CalifornioLanguageFactory.californio,\r
454         CalifornioLanguageFactory.valley,\r
455         CalifornioLanguageFactory.surfer,\r
456         CalifornioLanguageFactory.geek\r
457             };\r
458             for (int i = 0; i < idNames.length; ++i) {\r
459                 String idName = idNames[i];\r
460                 buf.append("\n  --- " + idName + " ---");\r
461                 Map names = getDisplayNames(service, new ULocale(idName));\r
462                 Iterator iter = names.entrySet().iterator();\r
463                 while (iter.hasNext()) {\r
464                     Entry e = (Entry)iter.next();\r
465                     String name = (String)e.getKey();\r
466                     String id = (String)e.getValue();\r
467                     buf.append("\n    " + name + " --> " + id);\r
468                 }\r
469         }\r
470         buf.append("\n}");\r
471         logln(buf.toString());\r
472     }\r
473 \r
474     // test notification\r
475     // simple registration\r
476     {\r
477             logln("simple registration notification");\r
478         ICULocaleService ls = new ICULocaleService();\r
479         ServiceListener l1 = new ServiceListener() {\r
480             private int n;\r
481             public void serviceChanged(ICUService s) {\r
482             logln("listener 1 report " + n++ + " service changed: " + s);\r
483             }\r
484         };\r
485         ls.addListener(l1);\r
486         ServiceListener l2 = new ServiceListener() {\r
487             private int n;\r
488             public void serviceChanged(ICUService s) {\r
489             logln("listener 2 report " + n++ + " service changed: " + s);\r
490             }\r
491         };\r
492         ls.addListener(l2);\r
493         logln("registering foo... ");\r
494         ls.registerObject("Foo", "en_FOO");\r
495         logln("registering bar... ");\r
496         ls.registerObject("Bar", "en_BAR");\r
497         logln("getting foo...");\r
498         logln((String)ls.get("en_FOO"));\r
499         logln("removing listener 2...");\r
500         ls.removeListener(l2);\r
501         logln("registering baz...");\r
502         ls.registerObject("Baz", "en_BAZ");\r
503         logln("removing listener 1");\r
504         ls.removeListener(l1);\r
505         logln("registering burp...");\r
506         ls.registerObject("Burp", "en_BURP");\r
507 \r
508         // should only get one notification even if register multiple times\r
509         logln("... trying multiple registration");\r
510         ls.addListener(l1);\r
511         ls.addListener(l1);\r
512         ls.addListener(l1);\r
513         ls.addListener(l2);\r
514         ls.registerObject("Foo", "en_FOO");\r
515         logln("... registered foo");\r
516 \r
517         // since in a separate thread, we can callback and not deadlock\r
518         ServiceListener l3 = new ServiceListener() {\r
519             private int n;\r
520             public void serviceChanged(ICUService s) {\r
521             logln("listener 3 report " + n++ + " service changed...");\r
522             if (s.get("en_BOINK") == null) { // don't recurse on ourselves!!!\r
523                 logln("registering boink...");\r
524                 s.registerObject("boink", "en_BOINK");\r
525             }\r
526             }\r
527         };\r
528         ls.addListener(l3);\r
529         logln("registering boo...");\r
530         ls.registerObject("Boo", "en_BOO");\r
531         logln("...done");\r
532 \r
533         try {\r
534         Thread.sleep(100);\r
535         }\r
536         catch (InterruptedException e) {\r
537         }\r
538     }\r
539     }\r
540 \r
541     static class TestLocaleKeyFactory extends LocaleKeyFactory {\r
542     protected final Set ids;\r
543     protected final String factoryID;\r
544 \r
545     public TestLocaleKeyFactory(String[] ids, String factoryID) {\r
546             super(VISIBLE, factoryID);\r
547 \r
548         this.ids = Collections.unmodifiableSet(new HashSet(Arrays.asList(ids)));\r
549             this.factoryID = factoryID + ": ";\r
550     }\r
551 \r
552     protected Object handleCreate(ULocale loc, int kind, ICUService service) {\r
553             return factoryID + loc.toString();\r
554     }\r
555 \r
556     protected Set getSupportedIDs() {\r
557             return ids;\r
558     }\r
559     }\r
560 \r
561     /*\r
562       // Disallow hiding for now since it causes gnarly problems, like\r
563       // how do you localize the hidden (but still exported) names.\r
564 \r
565       static class TestHidingFactory implements ICUService.Factory {\r
566       protected final String[] ids;\r
567       protected final String factoryID;\r
568 \r
569       public TestHidingFactory(String[] ids) {\r
570       this(ids, "Hiding");\r
571       }\r
572 \r
573       public TestHidingFactory(String[] ids, String factoryID) {\r
574       this.ids = (String[])ids.clone();\r
575 \r
576       if (factoryID == null || factoryID.length() == 0) {\r
577       this.factoryID = "";\r
578       } else {\r
579       this.factoryID = factoryID + ": ";\r
580       }\r
581       }\r
582 \r
583       public Object create(Key key, ICUService service) {\r
584       for (int i = 0; i < ids.length; ++i) {\r
585       if (LocaleUtility.isFallbackOf(ids[i], key.currentID())) {\r
586       return factoryID + key.canonicalID();\r
587       }\r
588       }\r
589       return null;\r
590       }\r
591 \r
592       public void updateVisibleIDs(Map result) {\r
593       for (int i = 0; i < ids.length; ++i) {\r
594       String id = ids[i];\r
595       Iterator iter = result.keySet().iterator();\r
596       while (iter.hasNext()) {\r
597       if (LocaleUtility.isFallbackOf(id, (String)iter.next())) {\r
598       iter.remove();\r
599       }\r
600       }\r
601       result.put(id, this);\r
602       }\r
603       }\r
604 \r
605       public String getDisplayName(String id, ULocale locale) {\r
606       return factoryID + new ULocale(id).getDisplayName(locale);\r
607       }\r
608       }\r
609     */\r
610 \r
611     static class CalifornioLanguageFactory extends ICUResourceBundleFactory {\r
612     public static String californio = "en_US_CA";\r
613     public static String valley = californio + "_VALLEY";\r
614     public static String surfer = californio + "_SURFER";\r
615     public static String geek = californio + "_GEEK";\r
616         public static Set supportedIDs;\r
617         static {\r
618             HashSet result = new HashSet();\r
619             result.addAll(ICUResourceBundle.getAvailableLocaleNameSet());\r
620         result.add(californio);\r
621         result.add(valley);\r
622         result.add(surfer);\r
623         result.add(geek);\r
624             supportedIDs = Collections.unmodifiableSet(result);\r
625         }\r
626 \r
627     public Set getSupportedIDs() {\r
628             return supportedIDs;\r
629     }\r
630 \r
631     public String getDisplayName(String id, ULocale locale) {\r
632         String prefix = "";\r
633         String suffix = "";\r
634         String ls = locale.toString();\r
635         if (LocaleUtility.isFallbackOf(californio, ls)) {\r
636         if (ls.equalsIgnoreCase(valley)) {\r
637             prefix = "Like, you know, it's so totally ";\r
638         } else if (ls.equalsIgnoreCase(surfer)) {\r
639             prefix = "Dude, its ";\r
640         } else if (ls.equalsIgnoreCase(geek)) {\r
641             prefix = "I'd estimate it's approximately ";\r
642         } else {\r
643             prefix = "Huh?  Maybe ";\r
644         }\r
645         }\r
646         if (LocaleUtility.isFallbackOf(californio, id)) {\r
647         if (id.equalsIgnoreCase(valley)) {\r
648             suffix = "like the Valley, you know?  Let's go to the mall!";\r
649         } else if (id.equalsIgnoreCase(surfer)) {\r
650             suffix = "time to hit those gnarly waves, Dude!!!";\r
651         } else if (id.equalsIgnoreCase(geek)) {\r
652             suffix = "all systems go.  T-Minus 9, 8, 7...";\r
653         } else {\r
654             suffix = "No Habla Englais";\r
655         }\r
656         } else {\r
657         suffix = super.getDisplayName(id, locale);\r
658         }\r
659 \r
660         return prefix + suffix;\r
661     }\r
662     }\r
663 \r
664     public void TestLocale() {\r
665     ICULocaleService service = new ICULocaleService("test locale");\r
666     service.registerObject("root", ULocale.ROOT);\r
667     service.registerObject("german", "de");\r
668     service.registerObject("german_Germany", ULocale.GERMANY);\r
669     service.registerObject("japanese", "ja");\r
670     service.registerObject("japanese_Japan", ULocale.JAPAN);\r
671 \r
672     Object target = service.get("de_US");\r
673     confirmEqual("test de_US", "german", target);\r
674 \r
675         ULocale de = new ULocale("de");\r
676         ULocale de_US = new ULocale("de_US");\r
677 \r
678         target = service.get(de_US);\r
679     confirmEqual("test de_US 2", "german", target);\r
680 \r
681         target = service.get(de_US, LocaleKey.KIND_ANY);\r
682     confirmEqual("test de_US 3", "german", target);\r
683 \r
684         target = service.get(de_US, 1234);\r
685     confirmEqual("test de_US 4", "german", target);\r
686 \r
687         ULocale[] actualReturn = new ULocale[1];\r
688         target = service.get(de_US, actualReturn);\r
689         confirmEqual("test de_US 5", "german", target);\r
690         confirmEqual("test de_US 6", actualReturn[0], de);\r
691 \r
692         actualReturn[0] = null;\r
693         target = service.get(de_US, LocaleKey.KIND_ANY, actualReturn);\r
694         confirmEqual("test de_US 7", actualReturn[0], de);\r
695 \r
696         actualReturn[0] = null;\r
697         target = service.get(de_US, 1234, actualReturn);\r
698     confirmEqual("test de_US 8", "german", target);\r
699         confirmEqual("test de_US 9", actualReturn[0], de);\r
700 \r
701         service.registerObject("one/de_US", de_US, 1);\r
702         service.registerObject("two/de_US", de_US, 2);\r
703 \r
704         target = service.get(de_US, 1);\r
705         confirmEqual("test de_US kind 1", "one/de_US", target);\r
706 \r
707         target = service.get(de_US, 2);\r
708         confirmEqual("test de_US kind 2", "two/de_US", target);\r
709 \r
710         target = service.get(de_US);\r
711         confirmEqual("test de_US kind 3", "german", target);\r
712 \r
713         LocaleKey lkey = LocaleKey.createWithCanonicalFallback("en", null, 1234);\r
714         logln("lkey prefix: " + lkey.prefix());\r
715         logln("lkey descriptor: " + lkey.currentDescriptor());\r
716         logln("lkey current locale: " + lkey.currentLocale());\r
717 \r
718         lkey.fallback();\r
719         logln("lkey descriptor 2: " + lkey.currentDescriptor());\r
720 \r
721         lkey.fallback();\r
722         logln("lkey descriptor 3: " + lkey.currentDescriptor());\r
723 \r
724     target = service.get("za_PPP");\r
725     confirmEqual("test zappp", "root", target);\r
726 \r
727     ULocale loc = ULocale.getDefault();\r
728     ULocale.setDefault(ULocale.JAPANESE);\r
729     target = service.get("za_PPP");\r
730     confirmEqual("test with ja locale", "japanese", target);\r
731 \r
732     Set ids = service.getVisibleIDs();\r
733     for (Iterator iter = ids.iterator(); iter.hasNext();) {\r
734         logln("id: " + iter.next());\r
735     }\r
736 \r
737     ULocale.setDefault(loc);\r
738     ids = service.getVisibleIDs();\r
739     for (Iterator iter = ids.iterator(); iter.hasNext();) {\r
740         logln("id: " + iter.next());\r
741     }\r
742 \r
743     target = service.get("za_PPP");\r
744     confirmEqual("test with en locale", "root", target);\r
745 \r
746         ULocale[] locales = service.getAvailableULocales();\r
747         confirmIdentical("test available locales", locales.length, 6);\r
748         logln("locales: ");\r
749         for (int i = 0; i < locales.length; ++i) {\r
750             log("\n  [" + i + "] " + locales[i]);\r
751         }\r
752         logln(" ");\r
753 \r
754         service.registerFactory(new ICUResourceBundleFactory());\r
755         target = service.get(ULocale.JAPAN);\r
756 \r
757         {\r
758             int n = 0;\r
759             List factories = service.factories();\r
760             Iterator iter = factories.iterator();\r
761             while (iter.hasNext()) {\r
762                 logln("[" + n++ + "] " + iter.next());\r
763             }\r
764         }\r
765 \r
766         // list only the english display names for es, in reverse order\r
767         // since we're using locale keys, we should get all and only the es locales\r
768         // hmmm, the default toString function doesn't print in sorted order for TreeMap\r
769         {\r
770             SortedMap map = service.getDisplayNames(ULocale.US,\r
771                             new Comparator() {\r
772                                 public int compare(Object lhs, Object rhs) {\r
773                                 return -String.CASE_INSENSITIVE_ORDER.compare((String)lhs, (String)rhs);\r
774                                 }\r
775                             },\r
776                             "es");\r
777 \r
778             logln("es display names in reverse order " + map);\r
779         }\r
780     }\r
781 \r
782     public void TestWrapFactory() {\r
783         final String greeting = "Hello There";\r
784         final String greetingID = "greeting";\r
785 \r
786         ICUService service = new ICUService("wrap");\r
787         service.registerObject(greeting, greetingID);\r
788 \r
789         logln("test one: " + service.get(greetingID));\r
790 \r
791         class WrapFactory implements Factory {\r
792             public Object create(Key key, ICUService serviceArg) {\r
793                 if (key.currentID().equals(greetingID)) {\r
794                     Object previous = serviceArg.getKey(key, null, this);\r
795                     return "A different greeting: \"" + previous + "\"";\r
796                 }\r
797                 return null;\r
798             }\r
799 \r
800             public void updateVisibleIDs(Map result) {\r
801                 result.put("greeting", this);\r
802             }\r
803 \r
804             public String getDisplayName(String id, ULocale locale) {\r
805                 return "wrap '" + id + "'";\r
806             }\r
807         }\r
808         service.registerFactory(new WrapFactory());\r
809 \r
810         confirmEqual("wrap test: ", service.get(greetingID), "A different greeting: \"" + greeting + "\"");\r
811     }\r
812 \r
813     // misc coverage tests\r
814     public void TestCoverage() {\r
815     // Key\r
816     Key key = new Key("foobar");\r
817     logln("ID: " + key.id());\r
818     logln("canonicalID: " + key.canonicalID());\r
819     logln("currentID: " + key.currentID());\r
820     logln("has fallback: " + key.fallback());\r
821 \r
822     // SimpleFactory\r
823     Object obj = new Object();\r
824     SimpleFactory sf = new SimpleFactory(obj, "object");\r
825     try {\r
826         sf = new SimpleFactory(null, null);\r
827         errln("didn't throw exception");\r
828     }\r
829     catch (IllegalArgumentException e) {\r
830         logln("OK: " + e.getMessage());\r
831     }\r
832     catch (Exception e) {\r
833         errln("threw wrong exception" + e);\r
834     }\r
835     logln(sf.getDisplayName("object", null));\r
836 \r
837     // ICUService\r
838     ICUService service = new ICUService();\r
839     service.registerFactory(sf);\r
840 \r
841     try {\r
842         service.get(null, null);\r
843         errln("didn't throw exception");\r
844     }\r
845     catch (NullPointerException e) {\r
846         logln("OK: " + e.getMessage());\r
847     }\r
848         /*\r
849       catch (Exception e) {\r
850       errln("threw wrong exception" + e);\r
851       }\r
852         */\r
853     try {\r
854         service.registerFactory(null);\r
855         errln("didn't throw exception");\r
856     }\r
857     catch (NullPointerException e) {\r
858         logln("OK: " + e.getMessage());\r
859     }\r
860     catch (Exception e) {\r
861         errln("threw wrong exception" + e);\r
862     }\r
863 \r
864     try {\r
865         service.unregisterFactory(null);\r
866         errln("didn't throw exception");\r
867     }\r
868     catch (NullPointerException e) {\r
869         logln("OK: " + e.getMessage());\r
870     }\r
871     catch (Exception e) {\r
872         errln("threw wrong exception" + e);\r
873     }\r
874 \r
875     logln("object is: " + service.get("object"));\r
876 \r
877     logln("stats: " + service.stats());\r
878 \r
879     // ICURWLock\r
880 \r
881     ICURWLock rwlock = new ICURWLock();\r
882     rwlock.acquireRead();\r
883     rwlock.releaseRead();\r
884 \r
885     rwlock.acquireWrite();\r
886     rwlock.releaseWrite();\r
887     logln("stats: " + rwlock.getStats());\r
888     logln("stats: " + rwlock.clearStats());\r
889     rwlock.acquireRead();\r
890     rwlock.releaseRead();\r
891     rwlock.acquireWrite();\r
892     rwlock.releaseWrite();\r
893     logln("stats: " + rwlock.getStats());\r
894 \r
895     try {\r
896         rwlock.releaseRead();\r
897         errln("no error thrown");\r
898     }\r
899     catch (IllegalStateException e) {\r
900         logln("OK: " + e.getMessage());\r
901     }\r
902 \r
903     try {\r
904         rwlock.releaseWrite();\r
905         errln("no error thrown");\r
906     }\r
907     catch (IllegalStateException e) {\r
908         logln("OK: " + e.getMessage());\r
909     }\r
910 \r
911         // ICULocaleService\r
912 \r
913     // LocaleKey\r
914 \r
915     // LocaleKey lkey = LocaleKey.create("en_US", "ja_JP");\r
916     // lkey = LocaleKey.create(null, null);\r
917     LocaleKey lkey = LocaleKey.createWithCanonicalFallback("en_US", "ja_JP");\r
918         logln("lkey: " + lkey);\r
919 \r
920         lkey = LocaleKey.createWithCanonicalFallback(null, null);\r
921         logln("lkey from null,null: " + lkey);\r
922 \r
923     // LocaleKeyFactory\r
924     LocaleKeyFactory lkf = new LKFSubclass(false);\r
925         logln("lkf: " + lkf);\r
926     logln("obj: " + lkf.create(lkey, null));\r
927     logln(lkf.getDisplayName("foo", null));\r
928     logln(lkf.getDisplayName("bar", null));\r
929     lkf.updateVisibleIDs(new HashMap());\r
930 \r
931     LocaleKeyFactory invisibleLKF = new LKFSubclass(false);\r
932     logln("obj: " + invisibleLKF.create(lkey, null));\r
933     logln(invisibleLKF.getDisplayName("foo", null));\r
934     logln(invisibleLKF.getDisplayName("bar", null));\r
935     invisibleLKF.updateVisibleIDs(new HashMap());\r
936 \r
937     // ResourceBundleFactory\r
938     ICUResourceBundleFactory rbf = new ICUResourceBundleFactory();\r
939     logln("RB: " + rbf.create(lkey, null));\r
940 \r
941     // ICUNotifier\r
942     ICUNotifier nf = new ICUNSubclass();\r
943     try {\r
944         nf.addListener(null);\r
945         errln("added null listener");\r
946     }\r
947     catch (NullPointerException e) {\r
948         logln(e.getMessage());\r
949     }\r
950     catch (Exception e) {\r
951         errln("got wrong exception");\r
952     }\r
953 \r
954     try {\r
955         nf.addListener(new WrongListener());\r
956         errln("added wrong listener");\r
957     }\r
958     catch (IllegalStateException e) {\r
959         logln(e.getMessage());\r
960     }\r
961     catch (Exception e) {\r
962         errln("got wrong exception");\r
963     }\r
964 \r
965     try {\r
966         nf.removeListener(null);\r
967         errln("removed null listener");\r
968     }\r
969     catch (NullPointerException e) {\r
970         logln(e.getMessage());\r
971     }\r
972     catch (Exception e) {\r
973         errln("got wrong exception");\r
974     }\r
975 \r
976     nf.removeListener(new MyListener());\r
977     nf.notifyChanged();\r
978     nf.addListener(new MyListener());\r
979     nf.removeListener(new MyListener());\r
980     }\r
981 \r
982     static class MyListener implements EventListener {\r
983     }\r
984 \r
985     static class WrongListener implements EventListener {\r
986     }\r
987 \r
988     static class ICUNSubclass extends ICUNotifier {\r
989         public boolean acceptsListener(EventListener l) {\r
990             return l instanceof MyListener;\r
991         }\r
992     \r
993         // not used, just needed to implement abstract base\r
994         public void notifyListener(EventListener l) {\r
995         }\r
996     }\r
997 \r
998     static class LKFSubclass extends LocaleKeyFactory {\r
999     LKFSubclass(boolean visible) {\r
1000         super(visible ? VISIBLE : INVISIBLE);\r
1001     }\r
1002 \r
1003     protected Set getSupportedIDs() {\r
1004             return Collections.EMPTY_SET;\r
1005     }\r
1006     }\r
1007 }\r