/* * Copyright (C) 2007-2009, 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(); } return service.getAvailableLocales(); } ULocale[] getAvailableULocales() { if (service.isDefault()) { return ICUResourceBundle.getAvailableULocales(); } 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 srvc) { if (handlesKey(key)) { LocaleKey lkey = (LocaleKey)key; ULocale loc = lkey.canonicalLocale(); Object result = delegate.createCalendar(loc); if (result == null) { result = srvc.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(); }