1 /* 2 ******************************************************************************* 3 * Copyright (C) 2003-2011, International Business Machines Corporation and * 4 * others. All Rights Reserved. * 5 ******************************************************************************* 6 */ 7 8 package com.ibm.icu.text; 9 10 import java.util.Locale; 11 import java.util.MissingResourceException; 12 import java.util.Set; 13 14 import com.ibm.icu.impl.ICULocaleService; 15 import com.ibm.icu.impl.ICULocaleService.LocaleKey; 16 import com.ibm.icu.impl.ICULocaleService.LocaleKeyFactory; 17 import com.ibm.icu.impl.ICUResourceBundle; 18 import com.ibm.icu.impl.ICUService; 19 import com.ibm.icu.impl.ICUService.Factory; 20 import com.ibm.icu.impl.ICUService.Key; 21 import com.ibm.icu.text.NumberFormat.NumberFormatFactory; 22 import com.ibm.icu.util.Currency; 23 import com.ibm.icu.util.ULocale; 24 25 class NumberFormatServiceShim extends NumberFormat.NumberFormatShim { 26 getAvailableLocales()27 Locale[] getAvailableLocales() { 28 if (service.isDefault()) { 29 return ICUResourceBundle.getAvailableLocales(); 30 } 31 return service.getAvailableLocales(); 32 } 33 getAvailableULocales()34 ULocale[] getAvailableULocales() { 35 if (service.isDefault()) { 36 return ICUResourceBundle.getAvailableULocales(); 37 } 38 return service.getAvailableULocales(); 39 } 40 41 private static final class NFFactory extends LocaleKeyFactory { 42 private NumberFormatFactory delegate; 43 NFFactory(NumberFormatFactory delegate)44 NFFactory(NumberFormatFactory delegate) { 45 super(delegate.visible() ? VISIBLE : INVISIBLE); 46 47 this.delegate = delegate; 48 } 49 create(Key key, ICUService srvc)50 public Object create(Key key, ICUService srvc) { 51 if (!handlesKey(key) || !(key instanceof LocaleKey)) { 52 return null; 53 } 54 55 LocaleKey lkey = (LocaleKey)key; 56 Object result = delegate.createFormat(lkey.canonicalLocale(), lkey.kind()); 57 if (result == null) { 58 result = srvc.getKey(key, null, this); 59 } 60 return result; 61 } 62 getSupportedIDs()63 protected Set<String> getSupportedIDs() { 64 return delegate.getSupportedLocaleNames(); 65 } 66 } 67 registerFactory(NumberFormatFactory factory)68 Object registerFactory(NumberFormatFactory factory) { 69 return service.registerFactory(new NFFactory(factory)); 70 } 71 unregister(Object registryKey)72 boolean unregister(Object registryKey) { 73 return service.unregisterFactory((Factory)registryKey); 74 } 75 createInstance(ULocale desiredLocale, int choice)76 NumberFormat createInstance(ULocale desiredLocale, int choice) { 77 78 // use service cache 79 // if (service.isDefault()) { 80 // return NumberFormat.createInstance(desiredLocale, choice); 81 // } 82 83 ULocale[] actualLoc = new ULocale[1]; 84 NumberFormat fmt = (NumberFormat)service.get(desiredLocale, choice, 85 actualLoc); 86 if (fmt == null) { 87 throw new MissingResourceException("Unable to construct NumberFormat", "", ""); 88 } 89 fmt = (NumberFormat)fmt.clone(); 90 91 // If we are creating a currency type formatter, then we may have to set the currency 92 // explicitly, since the actualLoc may be different than the desiredLocale 93 if ( choice == NumberFormat.CURRENCYSTYLE || 94 choice == NumberFormat.ISOCURRENCYSTYLE || 95 choice == NumberFormat.PLURALCURRENCYSTYLE) { 96 fmt.setCurrency(Currency.getInstance(desiredLocale)); 97 } 98 99 ULocale uloc = actualLoc[0]; 100 fmt.setLocale(uloc, uloc); // services make no distinction between actual & valid 101 return fmt; 102 } 103 104 private static class NFService extends ICULocaleService { NFService()105 NFService() { 106 super("NumberFormat"); 107 108 class RBNumberFormatFactory extends ICUResourceBundleFactory { 109 protected Object handleCreate(ULocale loc, int kind, ICUService srvc) { 110 return NumberFormat.createInstance(loc, kind); 111 } 112 } 113 114 this.registerFactory(new RBNumberFormatFactory()); 115 markDefault(); 116 } 117 } 118 private static ICULocaleService service = new NFService(); 119 } 120