make/src/classes/build/tools/cldrconverter/ResourceBundleGenerator.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 28,53 ****
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Formatter;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
class ResourceBundleGenerator implements BundleGenerator {
@Override
public void generateBundle(String packageName, String baseName, String localeID, boolean useJava,
Map<String, ?> map, BundleType type) throws IOException {
String suffix = useJava ? ".java" : ".properties";
String lang = CLDRConverter.getLanguageCode(localeID);
String dirName = CLDRConverter.DESTINATION_DIR + File.separator + "sun" + File.separator
+ packageName + File.separator + "resources" + File.separator + "cldr";
if (lang.length() > 0) {
! dirName = dirName + File.separator + lang;
! packageName = packageName + ".resources.cldr." + lang;
} else {
packageName = packageName + ".resources.cldr";
}
File dir = new File(dirName);
if (!dir.exists()) {
dir.mkdirs();
--- 28,93 ----
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Formatter;
import java.util.HashSet;
+ import java.util.HashMap;
+ import java.util.LinkedHashMap;
import java.util.Map;
+ import java.util.Locale;
+ import java.util.Objects;
import java.util.Set;
import java.util.SortedSet;
class ResourceBundleGenerator implements BundleGenerator {
+ // preferred timezones - keeping compatibility with JDK1.1 3 letter abbreviations
+ private static final String[] preferredTZIDs = {
+ "America/Los_Angeles",
+ "America/Denver",
+ "America/Phoenix",
+ "America/Chicago",
+ "America/New_York",
+ "America/Indianapolis",
+ "Pacific/Honolulu",
+ "America/Anchorage",
+ "America/Halifax",
+ "America/Sitka",
+ "America/St_Johns",
+ "Europe/Paris",
+ // Although CLDR does not support abbreviated zones, handle "GMT" as a
+ // special case here, as it is specified in the javadoc.
+ "GMT",
+ "Africa/Casablanca",
+ "Asia/Jerusalem",
+ "Asia/Tokyo",
+ "Europe/Bucharest",
+ "Asia/Shanghai",
+ };
+
+ // For duplicated values
+ private static final String META_VALUE_PREFIX = "metaValue_";
+
@Override
public void generateBundle(String packageName, String baseName, String localeID, boolean useJava,
Map<String, ?> map, BundleType type) throws IOException {
String suffix = useJava ? ".java" : ".properties";
String lang = CLDRConverter.getLanguageCode(localeID);
+ String ctry = CLDRConverter.getCountryCode(localeID);
String dirName = CLDRConverter.DESTINATION_DIR + File.separator + "sun" + File.separator
+ packageName + File.separator + "resources" + File.separator + "cldr";
if (lang.length() > 0) {
! if (CLDRConverter.isBaseModule ^ isBaseLocale(localeID)) {
! return;
! }
! dirName = dirName + File.separator + lang +
! (ctry != null && ctry.length() > 0 ? File.separator + ctry : "");
! packageName = packageName + ".resources.cldr." + lang +
! (ctry != null && ctry.length() > 0 ? "." + ctry : "");
} else {
+ if (!CLDRConverter.isBaseModule) {
+ return;
+ }
packageName = packageName + ".resources.cldr";
}
File dir = new File(dirName);
if (!dir.exists()) {
dir.mkdirs();
*** 87,96 ****
--- 127,195 ----
}
}
for (String key : metaKeys) {
map.remove(key);
}
+
+ // Make it preferred ordered
+ LinkedHashMap<String, Object> newMap = new LinkedHashMap<>();
+ for (String preferred : preferredTZIDs) {
+ if (map.containsKey(preferred)) {
+ newMap.put(preferred, map.remove(preferred));
+ } else if ("GMT".equals(preferred) &&
+ metaKeys.contains(CLDRConverter.METAZONE_ID_PREFIX+preferred)) {
+ newMap.put(preferred, preferred);
+ }
+ }
+ newMap.putAll(map);
+ map = newMap;
+ } else {
+ // generic reduction of duplicated values
+ Map<String, Object> newMap = null;
+ for (String key : map.keySet()) {
+ Object val = map.get(key);
+ String metaVal = null;
+
+ for (Map.Entry<String, ?> entry : map.entrySet()) {
+ String k = entry.getKey();
+ if (!k.equals(key) &&
+ Objects.deepEquals(val, entry.getValue()) &&
+ !(Objects.nonNull(newMap) && newMap.containsKey(k))) {
+ if (Objects.isNull(newMap)) {
+ newMap = new HashMap<>();
+ fmt = new Formatter();
+ }
+
+ if (Objects.isNull(metaVal)) {
+ metaVal = META_VALUE_PREFIX + key.replaceAll("\\.", "_");
+
+ if (val instanceof String[]) {
+ fmt.format(" final String[] %s = new String[] {\n", metaVal);
+ for (String s : (String[])val) {
+ fmt.format(" \"%s\",\n", CLDRConverter.saveConvert(s, useJava));
+ }
+ fmt.format(" };\n");
+ } else {
+ fmt.format(" final String %s = \"%s\";\n", metaVal, CLDRConverter.saveConvert((String)val, useJava));
+ }
+ }
+
+ newMap.put(k, metaVal);
+ }
+ }
+
+ if (Objects.nonNull(metaVal)) {
+ newMap.put(key, metaVal);
+ }
+ }
+
+ if (Objects.nonNull(newMap)) {
+ for (String key : map.keySet()) {
+ newMap.putIfAbsent(key, map.get(key));
+ }
+ map = newMap;
+ }
}
try (PrintWriter out = new PrintWriter(file, encoding)) {
// Output copyright headers
out.println(CopyrightHeaders.getOpenJDKCopyright());
*** 112,122 ****
if (useJava) {
Object value = map.get(key);
if (value == null) {
CLDRConverter.warning("null value for " + key);
} else if (value instanceof String) {
! if (type == BundleType.TIMEZONE) {
out.printf(" { \"%s\", %s },\n", key, CLDRConverter.saveConvert((String) value, useJava));
} else {
out.printf(" { \"%s\", \"%s\" },\n", key, CLDRConverter.saveConvert((String) value, useJava));
}
} else if (value instanceof String[]) {
--- 211,222 ----
if (useJava) {
Object value = map.get(key);
if (value == null) {
CLDRConverter.warning("null value for " + key);
} else if (value instanceof String) {
! if (type == BundleType.TIMEZONE ||
! ((String)value).startsWith(META_VALUE_PREFIX)) {
out.printf(" { \"%s\", %s },\n", key, CLDRConverter.saveConvert((String) value, useJava));
} else {
out.printf(" { \"%s\", \"%s\" },\n", key, CLDRConverter.saveConvert((String) value, useJava));
}
} else if (value instanceof String[]) {
*** 137,194 ****
out.println(" };\n return data;\n }\n}");
}
}
}
- private static final String METAINFO_CLASS = "CLDRLocaleDataMetaInfo";
-
@Override
public void generateMetaInfo(Map<String, SortedSet<String>> metaInfo) throws IOException {
String dirName = CLDRConverter.DESTINATION_DIR + File.separator + "sun" + File.separator + "util" +
! File.separator + "resources" + File.separator + "cldr" + File.separator +
! "provider" + File.separator ;
File dir = new File(dirName);
if (!dir.exists()) {
dir.mkdirs();
}
! File file = new File(dir, METAINFO_CLASS + ".java");
if (!file.exists()) {
file.createNewFile();
}
CLDRConverter.info("Generating file " + file);
try (PrintWriter out = new PrintWriter(file, "us-ascii")) {
out.println(CopyrightHeaders.getOpenJDKCopyright());
! out.println("package sun.util.resources.cldr.provider;\n\n"
+ "import java.util.ListResourceBundle;\n"
+ "import sun.util.locale.provider.LocaleProviderAdapter;\n"
+ "import sun.util.locale.provider.LocaleDataMetaInfo;\n");
! out.printf("public class %s extends ListResourceBundle implements LocaleDataMetaInfo {\n", METAINFO_CLASS);
out.println(" @Override\n" +
" protected final Object[][] getContents() {\n" +
" final Object[][] data = new Object[][] {");
for (String key : metaInfo.keySet()) {
out.printf(" { \"%s\",\n", key);
! out.printf(" \"%s\" },\n", toLocaleList(metaInfo.get(key)));
}
out.println(" };\n return data;\n }\n\n");
! out.println(" public LocaleProviderAdapter.Type getType() {\n" +
" return LocaleProviderAdapter.Type.CLDR;\n" +
" }\n\n");
! out.println(" public String availableLanguageTags(String category) {\n" +
" return getString(category);\n" +
! " };\n}");
}
}
! private static String toLocaleList(SortedSet<String> set) {
StringBuilder sb = new StringBuilder(set.size() * 6);
for (String id : set) {
if (!"root".equals(id)) {
if (sb.length() > 0) {
sb.append(' ');
}
sb.append(id);
}
--- 237,335 ----
out.println(" };\n return data;\n }\n}");
}
}
}
@Override
public void generateMetaInfo(Map<String, SortedSet<String>> metaInfo) throws IOException {
String dirName = CLDRConverter.DESTINATION_DIR + File.separator + "sun" + File.separator + "util" +
! File.separator +
! (CLDRConverter.isBaseModule ? "cldr" + File.separator + File.separator :
! "resources" + File.separator + "cldr" + File.separator + "provider" + File.separator);
File dir = new File(dirName);
if (!dir.exists()) {
dir.mkdirs();
}
! String className =
! (CLDRConverter.isBaseModule ? "CLDRBaseLocaleDataMetaInfo" :
! "CLDRLocaleDataMetaInfo_" +
! CLDRConverter.DESTINATION_DIR.substring(CLDRConverter.DESTINATION_DIR.lastIndexOf('/')+1)
! .replaceAll("\\.", "_"));
! File file = new File(dir, className + ".java");
if (!file.exists()) {
file.createNewFile();
}
CLDRConverter.info("Generating file " + file);
try (PrintWriter out = new PrintWriter(file, "us-ascii")) {
out.println(CopyrightHeaders.getOpenJDKCopyright());
! out.println((CLDRConverter.isBaseModule ? "package sun.util.cldr;\n\n" :
! "package sun.util.resources.cldr.provider;\n\n")
! + "import java.util.HashMap;\n"
! + "import java.util.Map;\n"
+ "import java.util.ListResourceBundle;\n"
+ "import sun.util.locale.provider.LocaleProviderAdapter;\n"
+ "import sun.util.locale.provider.LocaleDataMetaInfo;\n");
! out.printf("public class %s extends ListResourceBundle implements LocaleDataMetaInfo {\n", className);
out.println(" @Override\n" +
" protected final Object[][] getContents() {\n" +
" final Object[][] data = new Object[][] {");
for (String key : metaInfo.keySet()) {
out.printf(" { \"%s\",\n", key);
! out.printf(" \"%s\" },\n",
! toLocaleList(key.equals("FormatData") ? metaInfo.get("AvailableLocales") :
! metaInfo.get(key),
! key.startsWith(CLDRConverter.PARENT_LOCALE_PREFIX)));
}
out.println(" };\n return data;\n }\n\n");
! out.println(" @Override\n" +
! " public LocaleProviderAdapter.Type getType() {\n" +
" return LocaleProviderAdapter.Type.CLDR;\n" +
" }\n\n");
! out.println(" @Override\n" +
! " public String availableLanguageTags(String category) {\n" +
" return getString(category);\n" +
! " };\n\n");
!
! if (CLDRConverter.isBaseModule) {
! out.printf(" public Map<String, String> parentLocales() {\n" +
! " Map<String, String> ret = new HashMap<>();\n" +
! " keySet().stream()\n" +
! " .filter(key -> key.startsWith(\"%s\"))\n" +
! " .forEach(key -> ret.put(key.substring(%d), getString(key)));\n" +
! " return ret.isEmpty() ? null : ret;\n" +
! " };\n}",
! CLDRConverter.PARENT_LOCALE_PREFIX,
! CLDRConverter.PARENT_LOCALE_PREFIX.length());
! } else {
! out.println("}");
! }
}
}
! private static final Locale.Builder LOCALE_BUILDER = new Locale.Builder();
! private static boolean isBaseLocale(String localeID) {
! localeID = localeID.replaceAll("-", "_");
! // ignore script here
! Locale locale = LOCALE_BUILDER
! .clear()
! .setLanguage(CLDRConverter.getLanguageCode(localeID))
! .setRegion(CLDRConverter.getCountryCode(localeID))
! .build();
! return CLDRConverter.BASE_LOCALES.contains(locale);
! }
!
! private static String toLocaleList(SortedSet<String> set, boolean all) {
StringBuilder sb = new StringBuilder(set.size() * 6);
for (String id : set) {
if (!"root".equals(id)) {
+ if (!all && CLDRConverter.isBaseModule ^ isBaseLocale(id)) {
+ continue;
+ }
if (sb.length() > 0) {
sb.append(' ');
}
sb.append(id);
}