/* | |
* Copyright (C) 2007, International Business Machines | |
* Corporation and others. All Rights Reserved. | |
*/ | |
package com.ibm.icu.util; | |
import java.util.Locale; | |
import java.util.MissingResourceException; | |
import java.util.Set; | |
import com.ibm.icu.impl.ICULocaleService; | |
import com.ibm.icu.impl.ICUResourceBundle; | |
import com.ibm.icu.impl.ICUService; | |
import com.ibm.icu.impl.ICULocaleService.LocaleKey; | |
import com.ibm.icu.impl.ICULocaleService.LocaleKeyFactory; | |
import com.ibm.icu.impl.ICUService.Factory; | |
import com.ibm.icu.impl.ICUService.Key; | |
import com.ibm.icu.util.Calendar.CalendarFactory; | |
class CalendarServiceShim extends Calendar.CalendarShim { | |
Locale[] getAvailableLocales() { | |
if (service.isDefault()) { | |
return ICUResourceBundle.getAvailableLocales(ICUResourceBundle.ICU_BASE_NAME); | |
} | |
return service.getAvailableLocales(); | |
} | |
ULocale[] getAvailableULocales() { | |
if (service.isDefault()) { | |
return ICUResourceBundle.getAvailableULocales(ICUResourceBundle.ICU_BASE_NAME); | |
} | |
return service.getAvailableULocales(); | |
} | |
private static final class CalFactory extends LocaleKeyFactory { | |
private CalendarFactory delegate; | |
CalFactory(CalendarFactory delegate) { | |
super(delegate.visible() ? VISIBLE : INVISIBLE); | |
this.delegate = delegate; | |
} | |
public Object create(Key key, ICUService service) { | |
if (handlesKey(key)) { | |
LocaleKey lkey = (LocaleKey)key; | |
ULocale loc = lkey.canonicalLocale(); | |
Object result = delegate.createCalendar(loc); | |
if (result == null) { | |
result = service.getKey(key, null, this); | |
} | |
return result; | |
} | |
return null; | |
} | |
protected Set getSupportedIDs() { | |
return delegate.getSupportedLocaleNames(); | |
} | |
} | |
Calendar createInstance(ULocale desiredLocale) { | |
ULocale[] actualLoc = new ULocale[1]; | |
if (desiredLocale.equals(ULocale.ROOT)) { | |
desiredLocale = ULocale.ROOT; | |
} | |
Calendar cal = (Calendar)service.get(desiredLocale, actualLoc); | |
if (cal == null) { | |
throw new MissingResourceException("Unable to construct Calendar", "", ""); | |
} | |
cal = (Calendar)cal.clone(); | |
/* !!! TODO !!! actualLoc returned by service is not properly set. | |
* When this Calendar object is being created, cal.setLocale is called | |
* and proper actual locale is set at that time. Revisit this later. | |
* -yoshito | |
*/ | |
/* | |
ULocale uloc = actualLoc[0]; | |
cal.setLocale(uloc, uloc); // service make no distinction between actual and valid | |
*/ | |
return cal; | |
} | |
Object registerFactory(CalendarFactory factory) { | |
return service.registerFactory(new CalFactory(factory)); | |
} | |
boolean unregister(Object k) { | |
return service.unregisterFactory((Factory)k); | |
} | |
private static class CalService extends ICULocaleService { | |
CalService() { | |
super("Calendar"); | |
class RBCalendarFactory extends ICUResourceBundleFactory { | |
protected Object handleCreate(ULocale loc, int kind, ICUService sercice) { | |
return Calendar.createInstance(loc); | |
} | |
} | |
this.registerFactory(new RBCalendarFactory()); | |
markDefault(); | |
} | |
} | |
private static ICULocaleService service = new CalService(); | |
} |