191 lines
6.3 KiB
Java
191 lines
6.3 KiB
Java
/* GENERATED SOURCE. DO NOT MODIFY. */
|
|
// © 2016 and later: Unicode, Inc. and others.
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
/**
|
|
*******************************************************************************
|
|
* Copyright (C) 2003-2016, International Business Machines Corporation and
|
|
* others. All Rights Reserved.
|
|
*******************************************************************************
|
|
*/
|
|
|
|
package android.icu.text;
|
|
|
|
import java.util.Locale;
|
|
import java.util.MissingResourceException;
|
|
import java.util.Set;
|
|
|
|
import android.icu.impl.ICUData;
|
|
import android.icu.impl.ICULocaleService;
|
|
import android.icu.impl.ICULocaleService.LocaleKeyFactory;
|
|
import android.icu.impl.ICUResourceBundle;
|
|
import android.icu.impl.ICUService;
|
|
import android.icu.impl.ICUService.Factory;
|
|
import android.icu.impl.coll.CollationLoader;
|
|
import android.icu.impl.coll.CollationTailoring;
|
|
import android.icu.text.Collator.CollatorFactory;
|
|
import android.icu.util.ICUCloneNotSupportedException;
|
|
import android.icu.util.Output;
|
|
import android.icu.util.ULocale;
|
|
|
|
final class CollatorServiceShim extends Collator.ServiceShim {
|
|
|
|
@Override
|
|
Collator getInstance(ULocale locale) {
|
|
// use service cache, it's faster than instantiation
|
|
// if (service.isDefault()) {
|
|
// return new RuleBasedCollator(locale);
|
|
// }
|
|
try {
|
|
ULocale[] actualLoc = new ULocale[1];
|
|
Collator coll = (Collator)service.get(locale, actualLoc);
|
|
if (coll == null) {
|
|
///CLOVER:OFF
|
|
//Can't really change coll after it's been initialized
|
|
throw new MissingResourceException("Could not locate Collator data", "", "");
|
|
///CLOVER:ON
|
|
}
|
|
return (Collator) coll.clone();
|
|
}
|
|
catch (CloneNotSupportedException e) {
|
|
///CLOVER:OFF
|
|
throw new ICUCloneNotSupportedException(e);
|
|
///CLOVER:ON
|
|
}
|
|
}
|
|
|
|
@Override
|
|
Object registerInstance(Collator collator, ULocale locale) {
|
|
// Set the collator locales while registering so that getInstance()
|
|
// need not guess whether the collator's locales are already set properly
|
|
// (as they are by the data loader).
|
|
collator.setLocale(locale, locale);
|
|
return service.registerObject(collator, locale);
|
|
}
|
|
|
|
@Override
|
|
Object registerFactory(CollatorFactory f) {
|
|
class CFactory extends LocaleKeyFactory {
|
|
CollatorFactory delegate;
|
|
|
|
CFactory(CollatorFactory fctry) {
|
|
super(fctry.visible());
|
|
this.delegate = fctry;
|
|
}
|
|
|
|
@Override
|
|
public Object handleCreate(ULocale loc, int kind, ICUService srvc) {
|
|
Object coll = delegate.createCollator(loc);
|
|
return coll;
|
|
}
|
|
|
|
@Override
|
|
public String getDisplayName(String id, ULocale displayLocale) {
|
|
ULocale objectLocale = new ULocale(id);
|
|
return delegate.getDisplayName(objectLocale, displayLocale);
|
|
}
|
|
|
|
@Override
|
|
public Set<String> getSupportedIDs() {
|
|
return delegate.getSupportedLocaleIDs();
|
|
}
|
|
}
|
|
|
|
return service.registerFactory(new CFactory(f));
|
|
}
|
|
|
|
@Override
|
|
boolean unregister(Object registryKey) {
|
|
return service.unregisterFactory((Factory)registryKey);
|
|
}
|
|
|
|
@Override
|
|
Locale[] getAvailableLocales() {
|
|
// TODO rewrite this to just wrap getAvailableULocales later
|
|
Locale[] result;
|
|
if (service.isDefault()) {
|
|
result = ICUResourceBundle.getAvailableLocales(ICUData.ICU_COLLATION_BASE_NAME,
|
|
ICUResourceBundle.ICU_DATA_CLASS_LOADER);
|
|
} else {
|
|
result = service.getAvailableLocales();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
@Override
|
|
ULocale[] getAvailableULocales() {
|
|
ULocale[] result;
|
|
if (service.isDefault()) {
|
|
result = ICUResourceBundle.getAvailableULocales(ICUData.ICU_COLLATION_BASE_NAME,
|
|
ICUResourceBundle.ICU_DATA_CLASS_LOADER);
|
|
} else {
|
|
result = service.getAvailableULocales();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
@Override
|
|
String getDisplayName(ULocale objectLocale, ULocale displayLocale) {
|
|
String id = objectLocale.getName();
|
|
return service.getDisplayName(id, displayLocale);
|
|
}
|
|
|
|
private static class CService extends ICULocaleService {
|
|
CService() {
|
|
super("Collator");
|
|
|
|
class CollatorFactory extends ICUResourceBundleFactory {
|
|
CollatorFactory() {
|
|
super(ICUData.ICU_COLLATION_BASE_NAME);
|
|
}
|
|
|
|
@Override
|
|
protected Object handleCreate(ULocale uloc, int kind, ICUService srvc) {
|
|
return makeInstance(uloc);
|
|
}
|
|
}
|
|
|
|
this.registerFactory(new CollatorFactory());
|
|
markDefault();
|
|
}
|
|
|
|
/**
|
|
* makeInstance() returns an appropriate Collator for any locale.
|
|
* It falls back to root if there is no specific data.
|
|
*
|
|
* <p>Without this override, the service code would fall back to the default locale
|
|
* which is not desirable for an algorithm with a good Unicode default,
|
|
* like collation.
|
|
*/
|
|
@Override
|
|
public String validateFallbackLocale() {
|
|
return "";
|
|
}
|
|
|
|
///CLOVER:OFF
|
|
// The following method can not be reached by testing
|
|
@Override
|
|
protected Object handleDefault(Key key, String[] actualIDReturn) {
|
|
if (actualIDReturn != null) {
|
|
actualIDReturn[0] = "root";
|
|
}
|
|
try {
|
|
return makeInstance(ULocale.ROOT);
|
|
}
|
|
catch (MissingResourceException e) {
|
|
return null;
|
|
}
|
|
}
|
|
///CLOVER:ON
|
|
}
|
|
|
|
// Ported from C++ Collator::makeInstance().
|
|
private static final Collator makeInstance(ULocale desiredLocale) {
|
|
Output<ULocale> validLocale = new Output<>(ULocale.ROOT);
|
|
CollationTailoring t =
|
|
CollationLoader.loadTailoring(desiredLocale, validLocale);
|
|
return new RuleBasedCollator(t, validLocale.value);
|
|
}
|
|
|
|
private static ICULocaleService service = new CService();
|
|
}
|