]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/icu/text/CollatorServiceShim.java
icu4jsrc
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / text / CollatorServiceShim.java
1 /**\r
2 *******************************************************************************\r
3 * Copyright (C) 2003-2008, International Business Machines Corporation and         *\r
4 * others. All Rights Reserved.                                                *\r
5 *******************************************************************************\r
6 */\r
7 \r
8 package com.ibm.icu.text;\r
9 \r
10 import java.util.Locale;\r
11 import java.util.MissingResourceException;\r
12 import java.util.Set;\r
13 \r
14 import com.ibm.icu.impl.ICULocaleService;\r
15 import com.ibm.icu.impl.ICUResourceBundle;\r
16 import com.ibm.icu.impl.ICULocaleService.LocaleKeyFactory;\r
17 import com.ibm.icu.impl.ICUService;\r
18 import com.ibm.icu.impl.ICUService.Factory;\r
19 import com.ibm.icu.text.Collator.CollatorFactory;\r
20 import com.ibm.icu.util.ULocale;\r
21 \r
22 final class CollatorServiceShim extends Collator.ServiceShim {\r
23 \r
24     Collator getInstance(ULocale locale) {\r
25     // use service cache, it's faster than instantiation\r
26 //          if (service.isDefault()) {\r
27 //              return new RuleBasedCollator(locale);\r
28 //          }\r
29 \r
30         try {\r
31             ULocale[] actualLoc = new ULocale[1];\r
32             Collator coll = (Collator)service.get(locale, actualLoc);\r
33             if (coll == null) {\r
34                 throw new MissingResourceException("Could not locate Collator data", "", "");\r
35             }\r
36             coll = (Collator) coll.clone();\r
37             coll.setLocale(actualLoc[0], actualLoc[0]); // services make no distinction between actual & valid\r
38             return coll;\r
39         }\r
40         catch (CloneNotSupportedException e) {\r
41         ///CLOVER:OFF\r
42             throw new IllegalStateException(e.getMessage());\r
43         ///CLOVER:ON\r
44         }\r
45     }\r
46 \r
47     Object registerInstance(Collator collator, ULocale locale) {\r
48         return service.registerObject(collator, locale);\r
49     }\r
50 \r
51     Object registerFactory(CollatorFactory f) {\r
52         class CFactory extends LocaleKeyFactory {\r
53             CollatorFactory delegate;\r
54 \r
55             CFactory(CollatorFactory fctry) {\r
56                 super(fctry.visible()); \r
57                 this.delegate = fctry;\r
58             }\r
59 \r
60             public Object handleCreate(ULocale loc, int kind, ICUService srvc) {\r
61                 Object coll = delegate.createCollator(loc);\r
62                 return coll;\r
63             }\r
64                 \r
65             public String getDisplayName(String id, ULocale displayLocale) {\r
66                 ULocale objectLocale = new ULocale(id);\r
67                 return delegate.getDisplayName(objectLocale, displayLocale);\r
68             }\r
69 \r
70             public Set getSupportedIDs() {\r
71                 return delegate.getSupportedLocaleIDs();\r
72             }\r
73         }\r
74 \r
75         return service.registerFactory(new CFactory(f));\r
76     }\r
77 \r
78     boolean unregister(Object registryKey) {\r
79         return service.unregisterFactory((Factory)registryKey);\r
80     }\r
81 \r
82     Locale[] getAvailableLocales() {\r
83         // TODO rewrite this to just wrap getAvailableULocales later\r
84         if (service.isDefault()) {\r
85             return ICUResourceBundle.getAvailableLocales(ICUResourceBundle.ICU_COLLATION_BASE_NAME);\r
86         }\r
87         return service.getAvailableLocales();\r
88     }\r
89 \r
90     ULocale[] getAvailableULocales() {\r
91         if (service.isDefault()) {\r
92             return ICUResourceBundle.getAvailableULocales(ICUResourceBundle.ICU_COLLATION_BASE_NAME);\r
93         }\r
94         return service.getAvailableULocales();\r
95     }\r
96 \r
97     String getDisplayName(ULocale objectLocale, ULocale displayLocale) {\r
98         String id = objectLocale.getName();\r
99         return service.getDisplayName(id, displayLocale);\r
100     }\r
101 \r
102     private static class CService extends ICULocaleService {\r
103         CService() {\r
104             super("Collator");\r
105 \r
106             class CollatorFactory extends ICUResourceBundleFactory {\r
107                 CollatorFactory() {\r
108                     super(ICUResourceBundle.ICU_COLLATION_BASE_NAME);\r
109                 }\r
110 \r
111                 protected Object handleCreate(ULocale uloc, int kind, ICUService srvc) {\r
112                     return new RuleBasedCollator(uloc);\r
113                 }\r
114             }\r
115 \r
116             this.registerFactory(new CollatorFactory());\r
117             markDefault();\r
118         }\r
119 \r
120         protected Object handleDefault(Key key, String[] actualIDReturn) {\r
121             if (actualIDReturn != null) {\r
122                 actualIDReturn[0] = "root";\r
123             }\r
124             try {\r
125                 return new RuleBasedCollator(ULocale.ROOT);\r
126             }\r
127             catch (MissingResourceException e) {\r
128                 return null;\r
129             }\r
130         }\r
131     }\r
132     private static ICULocaleService service = new CService();\r
133 }\r