2 *******************************************************************************
\r
3 * Copyright (C) 2003-2008, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
8 package com.ibm.icu.text;
\r
10 import java.util.Locale;
\r
11 import java.util.MissingResourceException;
\r
12 import java.util.Set;
\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
22 final class CollatorServiceShim extends Collator.ServiceShim {
\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
31 ULocale[] actualLoc = new ULocale[1];
\r
32 Collator coll = (Collator)service.get(locale, actualLoc);
\r
34 throw new MissingResourceException("Could not locate Collator data", "", "");
\r
36 coll = (Collator) coll.clone();
\r
37 coll.setLocale(actualLoc[0], actualLoc[0]); // services make no distinction between actual & valid
\r
40 catch (CloneNotSupportedException e) {
\r
42 throw new IllegalStateException(e.getMessage());
\r
47 Object registerInstance(Collator collator, ULocale locale) {
\r
48 return service.registerObject(collator, locale);
\r
51 Object registerFactory(CollatorFactory f) {
\r
52 class CFactory extends LocaleKeyFactory {
\r
53 CollatorFactory delegate;
\r
55 CFactory(CollatorFactory fctry) {
\r
56 super(fctry.visible());
\r
57 this.delegate = fctry;
\r
60 public Object handleCreate(ULocale loc, int kind, ICUService srvc) {
\r
61 Object coll = delegate.createCollator(loc);
\r
65 public String getDisplayName(String id, ULocale displayLocale) {
\r
66 ULocale objectLocale = new ULocale(id);
\r
67 return delegate.getDisplayName(objectLocale, displayLocale);
\r
70 public Set getSupportedIDs() {
\r
71 return delegate.getSupportedLocaleIDs();
\r
75 return service.registerFactory(new CFactory(f));
\r
78 boolean unregister(Object registryKey) {
\r
79 return service.unregisterFactory((Factory)registryKey);
\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
87 return service.getAvailableLocales();
\r
90 ULocale[] getAvailableULocales() {
\r
91 if (service.isDefault()) {
\r
92 return ICUResourceBundle.getAvailableULocales(ICUResourceBundle.ICU_COLLATION_BASE_NAME);
\r
94 return service.getAvailableULocales();
\r
97 String getDisplayName(ULocale objectLocale, ULocale displayLocale) {
\r
98 String id = objectLocale.getName();
\r
99 return service.getDisplayName(id, displayLocale);
\r
102 private static class CService extends ICULocaleService {
\r
106 class CollatorFactory extends ICUResourceBundleFactory {
\r
107 CollatorFactory() {
\r
108 super(ICUResourceBundle.ICU_COLLATION_BASE_NAME);
\r
111 protected Object handleCreate(ULocale uloc, int kind, ICUService srvc) {
\r
112 return new RuleBasedCollator(uloc);
\r
116 this.registerFactory(new CollatorFactory());
\r
120 protected Object handleDefault(Key key, String[] actualIDReturn) {
\r
121 if (actualIDReturn != null) {
\r
122 actualIDReturn[0] = "root";
\r
125 return new RuleBasedCollator(ULocale.ROOT);
\r
127 catch (MissingResourceException e) {
\r
132 private static ICULocaleService service = new CService();
\r