src/java.base/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java
Print this page
rev 10556 : 8038436: Re-examine the mechanism to determine available localedata and cldrdata
Reviewed-by:
*** 23,74 ****
* questions.
*/
package sun.util.cldr;
- import java.io.File;
import java.security.AccessController;
! import java.security.PrivilegedAction;
import java.text.spi.BreakIteratorProvider;
import java.text.spi.CollatorProvider;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
! import java.util.ResourceBundle;
import java.util.Set;
import java.util.StringTokenizer;
- import java.util.spi.TimeZoneNameProvider;
import sun.util.locale.provider.JRELocaleProviderAdapter;
import sun.util.locale.provider.LocaleProviderAdapter;
/**
* LocaleProviderAdapter implementation for the CLDR locale data.
*
* @author Masayoshi Okutsu
* @author Naoto Sato
*/
public class CLDRLocaleProviderAdapter extends JRELocaleProviderAdapter {
! private static final String LOCALE_DATA_JAR_NAME = "cldrdata.jar";
public CLDRLocaleProviderAdapter() {
! final String sep = File.separator;
! String localeDataJar = java.security.AccessController.doPrivileged(
! new sun.security.action.GetPropertyAction("java.home"))
! + sep + "lib" + sep + "ext" + sep + LOCALE_DATA_JAR_NAME;
!
! // Peek at the installed extension directory to see if the jar file for
! // CLDR resources is installed or not.
! final File f = new File(localeDataJar);
! boolean result = AccessController.doPrivileged(
! new PrivilegedAction<Boolean>() {
@Override
! public Boolean run() {
! return f.exists();
}
});
! if (!result) {
! throw new UnsupportedOperationException();
}
}
/**
* Returns the type of this LocaleProviderAdapter
--- 23,79 ----
* questions.
*/
package sun.util.cldr;
import java.security.AccessController;
! import java.security.PrivilegedActionException;
! import java.security.PrivilegedExceptionAction;
import java.text.spi.BreakIteratorProvider;
import java.text.spi.CollatorProvider;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
! import java.util.ServiceLoader;
import java.util.Set;
import java.util.StringTokenizer;
import sun.util.locale.provider.JRELocaleProviderAdapter;
import sun.util.locale.provider.LocaleProviderAdapter;
+ import sun.util.locale.provider.LocaleDataMetaInfo;
/**
* LocaleProviderAdapter implementation for the CLDR locale data.
*
* @author Masayoshi Okutsu
* @author Naoto Sato
*/
public class CLDRLocaleProviderAdapter extends JRELocaleProviderAdapter {
!
! private LocaleDataMetaInfo metaInfo;
public CLDRLocaleProviderAdapter() {
! try {
! metaInfo = AccessController.doPrivileged(new PrivilegedExceptionAction<LocaleDataMetaInfo>() {
@Override
! public LocaleDataMetaInfo run() {
! for (LocaleDataMetaInfo ldmi : ServiceLoader.loadInstalled(LocaleDataMetaInfo.class)) {
! if (ldmi.getType() == LocaleProviderAdapter.Type.CLDR) {
! return ldmi;
! }
! }
! return null;
}
});
! } catch (Exception e) {
! // Catch any exception, and fail gracefully as if CLDR locales do not exist.
! // It's ok ignore it if something wrong happens because there always is the
! // JRE or FALLBACK LocaleProviderAdapter that will do the right thing.
! throw new UnsupportedOperationException(e);
! }
!
! if (metaInfo == null) {
! throw new UnsupportedOperationException("CLDR locale data could not be found.");
}
}
/**
* Returns the type of this LocaleProviderAdapter
*** 89,114 ****
return null;
}
@Override
public Locale[] getAvailableLocales() {
! Set<String> all = createLanguageTagSet("All");
Locale[] locs = new Locale[all.size()];
int index = 0;
for (String tag : all) {
locs[index++] = Locale.forLanguageTag(tag);
}
return locs;
}
@Override
protected Set<String> createLanguageTagSet(String category) {
! ResourceBundle rb = ResourceBundle.getBundle("sun.util.cldr.CLDRLocaleDataMetaInfo", Locale.ROOT);
! if (rb.containsKey(category)) {
return Collections.emptySet();
}
- String supportedLocaleString = rb.getString(category);
Set<String> tagset = new HashSet<>();
StringTokenizer tokens = new StringTokenizer(supportedLocaleString);
while (tokens.hasMoreTokens()) {
tagset.add(tokens.nextToken());
}
--- 94,118 ----
return null;
}
@Override
public Locale[] getAvailableLocales() {
! Set<String> all = createLanguageTagSet("AvailableLocales");
Locale[] locs = new Locale[all.size()];
int index = 0;
for (String tag : all) {
locs[index++] = Locale.forLanguageTag(tag);
}
return locs;
}
@Override
protected Set<String> createLanguageTagSet(String category) {
! String supportedLocaleString = metaInfo.availableLanguageTags(category);
! if (supportedLocaleString == null) {
return Collections.emptySet();
}
Set<String> tagset = new HashSet<>();
StringTokenizer tokens = new StringTokenizer(supportedLocaleString);
while (tokens.hasMoreTokens()) {
tagset.add(tokens.nextToken());
}