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