8000983: Support narrow display names for calendar fields
8003267: Support generic time zone names in TimeZoneNameProvider (SPI)
Reviewed-by: naoto
--- a/jdk/make/tools/src/build/tools/cldrconverter/Bundle.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/make/tools/src/build/tools/cldrconverter/Bundle.java Mon Dec 10 10:52:11 2012 +0900
@@ -29,6 +29,7 @@
import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -86,7 +87,23 @@
private final static String[] ERA_KEYS = {
"long.Eras",
"Eras",
- "short.Eras"
+ "narrow.Eras"
+ };
+
+ // Keys for individual time zone names
+ private final static String TZ_GEN_LONG_KEY = "timezone.displayname.generic.long";
+ private final static String TZ_GEN_SHORT_KEY = "timezone.displayname.generic.short";
+ private final static String TZ_STD_LONG_KEY = "timezone.displayname.standard.long";
+ private final static String TZ_STD_SHORT_KEY = "timezone.displayname.standard.short";
+ private final static String TZ_DST_LONG_KEY = "timezone.displayname.daylight.long";
+ private final static String TZ_DST_SHORT_KEY = "timezone.displayname.daylight.short";
+ private final static String[] ZONE_NAME_KEYS = {
+ TZ_STD_LONG_KEY,
+ TZ_STD_SHORT_KEY,
+ TZ_DST_LONG_KEY,
+ TZ_DST_SHORT_KEY,
+ TZ_GEN_LONG_KEY,
+ TZ_GEN_SHORT_KEY
};
private final String id;
@@ -98,6 +115,7 @@
return bundles.get(id);
}
+ @SuppressWarnings("ConvertToStringSwitch")
Bundle(String id, String cldrPath, String bundles, String currencies) {
this.id = id;
this.cldrPath = cldrPath;
@@ -242,9 +260,12 @@
// handle multiple inheritance for month and day names
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "MonthNames");
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "MonthAbbreviations");
+ handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "MonthNarrows");
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "DayNames");
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "DayAbbreviations");
+ handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "DayNarrows");
handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "AmPmMarkers");
+ handleMultipleInheritance(myMap, parentsMap, calendarPrefix + "narrow.AmPmMarkers");
adjustEraNames(myMap, calendarType);
@@ -253,6 +274,99 @@
handleDateTimeFormatPatterns(DATETIME_PATTERN_KEYS, myMap, parentsMap, calendarType, "DateTimePatterns");
}
+ // if myMap has any empty timezone or metazone names, weed out them.
+ // Fill in any missing abbreviations if locale is "en".
+ for (Iterator<String> it = myMap.keySet().iterator(); it.hasNext();) {
+ String key = it.next();
+ if (key.startsWith(CLDRConverter.TIMEZONE_ID_PREFIX)
+ || key.startsWith(CLDRConverter.METAZONE_ID_PREFIX)) {
+ @SuppressWarnings("unchecked")
+ Map<String, String> nameMap = (Map<String, String>) myMap.get(key);
+ if (nameMap.isEmpty()) {
+ // Some zones have only exemplarCity, which become empty.
+ // Remove those from the map.
+ it.remove();
+ continue;
+ }
+
+ if (id.startsWith("en")) {
+ fillInAbbrs(key, nameMap);
+ }
+ }
+ }
+ for (Iterator<String> it = myMap.keySet().iterator(); it.hasNext();) {
+ String key = it.next();
+ if (key.startsWith(CLDRConverter.TIMEZONE_ID_PREFIX)
+ || key.startsWith(CLDRConverter.METAZONE_ID_PREFIX)) {
+ @SuppressWarnings("unchecked")
+ Map<String, String> nameMap = (Map<String, String>) myMap.get(key);
+ // Convert key/value pairs to an array.
+ String[] names = new String[ZONE_NAME_KEYS.length];
+ int ix = 0;
+ for (String nameKey : ZONE_NAME_KEYS) {
+ String name = nameMap.get(nameKey);
+ if (name == null) {
+ @SuppressWarnings("unchecked")
+ Map<String, String> parentNames = (Map<String, String>) parentsMap.get(key);
+ if (parentNames != null) {
+ name = parentNames.get(nameKey);
+ }
+ }
+ names[ix++] = name;
+ }
+ if (hasNulls(names)) {
+ String metaKey = toMetaZoneKey(key);
+ if (metaKey != null) {
+ Object obj = myMap.get(metaKey);
+ if (obj instanceof String[]) {
+ String[] metaNames = (String[]) obj;
+ for (int i = 0; i < names.length; i++) {
+ if (names[i] == null) {
+ names[i] = metaNames[i];
+ }
+ }
+ } else if (obj instanceof Map) {
+ @SuppressWarnings("unchecked")
+ Map<String, String> m = (Map<String, String>) obj;
+ for (int i = 0; i < names.length; i++) {
+ if (names[i] == null) {
+ names[i] = m.get(ZONE_NAME_KEYS[i]);
+ }
+ }
+ }
+ }
+ // If there are still any nulls, try filling in them from en data.
+ if (hasNulls(names) && !id.equals("en")) {
+ @SuppressWarnings("unchecked")
+ String[] enNames = (String[]) Bundle.getBundle("en").getTargetMap().get(key);
+ if (enNames == null) {
+ if (metaKey != null) {
+ @SuppressWarnings("unchecked")
+ String[] metaNames = (String[]) Bundle.getBundle("en").getTargetMap().get(metaKey);
+ enNames = metaNames;
+ }
+ }
+ if (enNames != null) {
+ for (int i = 0; i < names.length; i++) {
+ if (names[i] == null) {
+ names[i] = enNames[i];
+ }
+ }
+ }
+ // If there are still nulls, give up names.
+ if (hasNulls(names)) {
+ names = null;
+ }
+ }
+ }
+ // replace the Map with the array
+ if (names != null) {
+ myMap.put(key, names);
+ } else {
+ it.remove();
+ }
+ }
+ }
return myMap;
}
@@ -352,20 +466,10 @@
realKeys[index] = realKey;
eraNames[index++] = value;
}
- if (eraNames[0] != null) {
- if (eraNames[1] != null) {
- if (eraNames[2] == null) {
- // Eras -> short.Eras
- // long.Eras -> Eras
- map.put(realKeys[2], map.get(realKeys[1]));
- map.put(realKeys[1], map.get(realKeys[0]));
- }
- } else {
- // long.Eras -> Eras
- map.put(realKeys[1], map.get(realKeys[0]));
+ for (int i = 0; i < eraNames.length; i++) {
+ if (eraNames[i] == null) {
+ map.put(realKeys[i], null);
}
- // remove long.Eras
- map.remove(realKeys[0]);
}
}
@@ -473,6 +577,86 @@
return jrePattern.toString();
}
+ private String toMetaZoneKey(String tzKey) {
+ if (tzKey.startsWith(CLDRConverter.TIMEZONE_ID_PREFIX)) {
+ String tz = tzKey.substring(CLDRConverter.TIMEZONE_ID_PREFIX.length());
+ String meta = CLDRConverter.handlerMetaZones.get(tz);
+ if (meta != null) {
+ return CLDRConverter.METAZONE_ID_PREFIX + meta;
+ }
+ }
+ return null;
+ }
+
+ private void fillInAbbrs(String key, Map<String, String> map) {
+ fillInAbbrs(TZ_STD_LONG_KEY, TZ_STD_SHORT_KEY, map);
+ fillInAbbrs(TZ_DST_LONG_KEY, TZ_DST_SHORT_KEY, map);
+ fillInAbbrs(TZ_GEN_LONG_KEY, TZ_GEN_SHORT_KEY, map);
+
+ // If the standard std is "Standard Time" and daylight std is "Summer Time",
+ // replace the standard std with the generic std to avoid using
+ // the same abbrivation except for Australia time zone names.
+ String std = map.get(TZ_STD_SHORT_KEY);
+ String dst = map.get(TZ_DST_SHORT_KEY);
+ String gen = map.get(TZ_GEN_SHORT_KEY);
+ if (std != null) {
+ if (dst == null) {
+ // if dst is null, create long and short names from the standard
+ // std. ("Something Standard Time" to "Something Daylight Time",
+ // or "Something Time" to "Something Summer Time")
+ String name = map.get(TZ_STD_LONG_KEY);
+ if (name != null) {
+ if (name.contains("Standard Time")) {
+ name = name.replace("Standard Time", "Daylight Time");
+ } else if (name.endsWith("Mean Time")) {
+ name = name.replace("Mean Time", "Summer Time");
+ } else if (name.endsWith(" Time")) {
+ name = name.replace(" Time", " Summer Time");
+ }
+ map.put(TZ_DST_LONG_KEY, name);
+ fillInAbbrs(TZ_DST_LONG_KEY, TZ_DST_SHORT_KEY, map);
+ }
+ }
+ if (gen == null) {
+ String name = map.get(TZ_STD_LONG_KEY);
+ if (name != null) {
+ if (name.endsWith("Standard Time")) {
+ name = name.replace("Standard Time", "Time");
+ } else if (name.endsWith("Mean Time")) {
+ name = name.replace("Mean Time", "Time");
+ }
+ map.put(TZ_GEN_LONG_KEY, name);
+ fillInAbbrs(TZ_GEN_LONG_KEY, TZ_GEN_SHORT_KEY, map);
+ }
+ }
+ }
+ }
+
+ private void fillInAbbrs(String longKey, String shortKey, Map<String, String> map) {
+ String abbr = map.get(shortKey);
+ if (abbr == null) {
+ String name = map.get(longKey);
+ if (name != null) {
+ abbr = toAbbr(name);
+ if (abbr != null) {
+ map.put(shortKey, abbr);
+ }
+ }
+ }
+ }
+
+ private String toAbbr(String name) {
+ String[] substrs = name.split("\\s+");
+ StringBuilder sb = new StringBuilder();
+ for (String s : substrs) {
+ char c = s.charAt(0);
+ if (c >= 'A' && c <= 'Z') {
+ sb.append(c);
+ }
+ }
+ return sb.length() > 0 ? sb.toString() : null;
+ }
+
private void convert(CalendarType calendarType, char cldrLetter, int count, StringBuilder sb) {
switch (cldrLetter) {
case 'G':
@@ -539,4 +723,13 @@
sb.append(c);
}
}
+
+ private static boolean hasNulls(Object[] array) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] == null) {
+ return true;
+ }
+ }
+ return false;
+ }
}
--- a/jdk/make/tools/src/build/tools/cldrconverter/BundleGenerator.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/make/tools/src/build/tools/cldrconverter/BundleGenerator.java Mon Dec 10 10:52:11 2012 +0900
@@ -30,8 +30,27 @@
import java.util.SortedSet;
public interface BundleGenerator {
+ static enum BundleType {
+ PLAIN("java.util.ListResourceBundle"),
+ OPEN("sun.util.resources.OpenListResourceBundle"),
+ TIMEZONE("sun.util.resources.TimeZoneNamesBundle");
+
+ private final String pathName, className;
+ private BundleType(String name) {
+ pathName = name;
+ int x = name.lastIndexOf('.');
+ className = name.substring(x + 1);
+ }
+ String getPathName() {
+ return pathName;
+ }
+ String getClassName() {
+ return className;
+ }
+ };
+
public void generateBundle(String packageName, String baseName, String localeID,
- boolean useJava, Map<String, ?> map, boolean open) throws IOException;
+ boolean useJava, Map<String, ?> map, BundleType type) throws IOException;
public void generateMetaInfo(Map<String, SortedSet<String>> metaInfo) throws IOException;
}
--- a/jdk/make/tools/src/build/tools/cldrconverter/CLDRConverter.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/make/tools/src/build/tools/cldrconverter/CLDRConverter.java Mon Dec 10 10:52:11 2012 +0900
@@ -25,6 +25,7 @@
package build.tools.cldrconverter;
+import build.tools.cldrconverter.BundleGenerator.BundleType;
import java.io.File;
import java.nio.file.DirectoryStream;
import java.nio.file.FileSystems;
@@ -58,9 +59,8 @@
static final String CURRENCY_SYMBOL_PREFIX = "currency.symbol.";
static final String CURRENCY_NAME_PREFIX = "currency.displayname.";
static final String TIMEZONE_ID_PREFIX = "timezone.id.";
- static final String TIMEZONE_NAME_PREFIX = "timezone.displayname.";
+ static final String ZONE_NAME_PREFIX = "timezone.displayname.";
static final String METAZONE_ID_PREFIX = "metazone.id.";
- static final String METAZONE_NAME_PREFIX = "metazone.displayname.";
private static SupplementDataParseHandler handlerSuppl;
static NumberingSystemsParseHandler handlerNumbering;
@@ -236,7 +236,14 @@
if (sb.indexOf("root") == -1) {
sb.append("root");
}
- retList.add(new Bundle(id, sb.toString(), null, null));
+ Bundle b = new Bundle(id, sb.toString(), null, null);
+ // Insert the bundle for en at the top so that it will get
+ // processed first.
+ if ("en".equals(id)) {
+ retList.add(0, b);
+ } else {
+ retList.add(b);
+ }
}
}
}
@@ -312,6 +319,7 @@
Map<String, SortedSet<String>> metaInfo = new HashMap<>();
metaInfo.put("LocaleNames", new TreeSet<String>());
metaInfo.put("CurrencyNames", new TreeSet<String>());
+ metaInfo.put("TimeZoneNames", new TreeSet<String>());
metaInfo.put("CalendarData", new TreeSet<String>());
metaInfo.put("FormatData", new TreeSet<String>());
@@ -348,24 +356,28 @@
Map<String, Object> localeNamesMap = extractLocaleNames(targetMap, bundle.getID());
if (!localeNamesMap.isEmpty() || bundle.isRoot()) {
metaInfo.get("LocaleNames").add(toLanguageTag(bundle.getID()));
- bundleGenerator.generateBundle("util", "LocaleNames", bundle.getID(), true, localeNamesMap, true);
+ bundleGenerator.generateBundle("util", "LocaleNames", bundle.getID(), true, localeNamesMap, BundleType.OPEN);
}
}
if (bundleTypes.contains(Bundle.Type.CURRENCYNAMES)) {
Map<String, Object> currencyNamesMap = extractCurrencyNames(targetMap, bundle.getID(), bundle.getCurrencies());
if (!currencyNamesMap.isEmpty() || bundle.isRoot()) {
metaInfo.get("CurrencyNames").add(toLanguageTag(bundle.getID()));
- bundleGenerator.generateBundle("util", "CurrencyNames", bundle.getID(), true, currencyNamesMap, true);
+ bundleGenerator.generateBundle("util", "CurrencyNames", bundle.getID(), true, currencyNamesMap, BundleType.OPEN);
}
}
if (bundleTypes.contains(Bundle.Type.TIMEZONENAMES)) {
Map<String, Object> zoneNamesMap = extractZoneNames(targetMap, bundle.getID());
+ if (!zoneNamesMap.isEmpty() || bundle.isRoot()) {
+ metaInfo.get("TimeZoneNames").add(toLanguageTag(bundle.getID()));
+ bundleGenerator.generateBundle("util", "TimeZoneNames", bundle.getID(), true, zoneNamesMap, BundleType.TIMEZONE);
+ }
}
if (bundleTypes.contains(Bundle.Type.CALENDARDATA)) {
Map<String, Object> calendarDataMap = extractCalendarData(targetMap, bundle.getID());
if (!calendarDataMap.isEmpty() || bundle.isRoot()) {
metaInfo.get("CalendarData").add(toLanguageTag(bundle.getID()));
- bundleGenerator.generateBundle("util", "CalendarData", bundle.getID(), true, calendarDataMap, false);
+ bundleGenerator.generateBundle("util", "CalendarData", bundle.getID(), true, calendarDataMap, BundleType.PLAIN);
}
}
if (bundleTypes.contains(Bundle.Type.FORMATDATA)) {
@@ -373,9 +385,10 @@
// LocaleData.getAvailableLocales depends on having FormatData bundles around
if (!formatDataMap.isEmpty() || bundle.isRoot()) {
metaInfo.get("FormatData").add(toLanguageTag(bundle.getID()));
- bundleGenerator.generateBundle("text", "FormatData", bundle.getID(), true, formatDataMap, false);
+ bundleGenerator.generateBundle("text", "FormatData", bundle.getID(), true, formatDataMap, BundleType.PLAIN);
}
}
+
// For testing
SortedSet<String> allLocales = new TreeSet<>();
allLocales.addAll(metaInfo.get("CurrencyNames"));
@@ -431,6 +444,7 @@
private KeyComparator() {
}
+ @Override
public int compare(String o1, String o2) {
int len1 = o1.length();
int len2 = o2.length();
@@ -476,7 +490,26 @@
}
private static Map<String, Object> extractZoneNames(Map<String, Object> map, String id) {
- return null;
+ Map<String, Object> names = new HashMap<>();
+ for (String tzid : handlerMetaZones.keySet()) {
+ String tzKey = TIMEZONE_ID_PREFIX + tzid;
+ Object data = map.get(tzKey);
+ if (data instanceof String[]) {
+ names.put(tzid, data);
+ } else {
+ String meta = handlerMetaZones.get(tzid);
+ if (meta != null) {
+ String metaKey = METAZONE_ID_PREFIX + meta;
+ data = map.get(metaKey);
+ if (data instanceof String[]) {
+ // Keep the metazone prefix here.
+ names.put(metaKey, data);
+ names.put(tzid, meta);
+ }
+ }
+ }
+ }
+ return names;
}
private static Map<String, Object> extractCalendarData(Map<String, Object> map, String id) {
@@ -494,11 +527,19 @@
copyIfPresent(map, prefix + "standalone.MonthNames", formatData);
copyIfPresent(map, prefix + "MonthAbbreviations", formatData);
copyIfPresent(map, prefix + "standalone.MonthAbbreviations", formatData);
+ copyIfPresent(map, prefix + "MonthNarrow", formatData);
+ copyIfPresent(map, prefix + "standalone.MonthNarrows", formatData);
copyIfPresent(map, prefix + "DayNames", formatData);
+ copyIfPresent(map, prefix + "standalone.DayNames", formatData);
copyIfPresent(map, prefix + "DayAbbreviations", formatData);
+ copyIfPresent(map, prefix + "standalone.DayAbbreviations", formatData);
+ copyIfPresent(map, prefix + "DayNarrows", formatData);
+ copyIfPresent(map, prefix + "standalone.DayNarrows", formatData);
copyIfPresent(map, prefix + "AmPmMarkers", formatData);
+ copyIfPresent(map, prefix + "narrow.AmPmMarkers", formatData);
+ copyIfPresent(map, prefix + "long.Eras", formatData);
copyIfPresent(map, prefix + "Eras", formatData);
- copyIfPresent(map, prefix + "short.Eras", formatData);
+ copyIfPresent(map, prefix + "narrow.Eras", formatData);
copyIfPresent(map, prefix + "TimePatterns", formatData);
copyIfPresent(map, prefix + "DatePatterns", formatData);
copyIfPresent(map, prefix + "DateTimePatterns", formatData);
@@ -560,7 +601,6 @@
if (x == 0 || escapeSpace) {
outBuffer.append('\\');
}
-
outBuffer.append(' ');
break;
case '\\':
@@ -584,7 +624,7 @@
outBuffer.append('f');
break;
default:
- if (!USE_UTF8 && ((aChar < 0x0020) || (aChar > 0x007e))) {
+ if (aChar < 0x0020 || (!USE_UTF8 && aChar > 0x007e)) {
formatter.format("\\u%04x", (int)aChar);
} else {
if (specialSaveChars.indexOf(aChar) != -1) {
--- a/jdk/make/tools/src/build/tools/cldrconverter/LDMLParseHandler.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/make/tools/src/build/tools/cldrconverter/LDMLParseHandler.java Mon Dec 10 10:52:11 2012 +0900
@@ -155,6 +155,9 @@
case "abbreviated":
pushStringArrayEntry(qName, attributes, prefix + "MonthAbbreviations/" + getContainerKey(), 13);
break;
+ case "narrow":
+ pushStringArrayEntry(qName, attributes, prefix + "MonthNarrows/" + getContainerKey(), 13);
+ break;
default:
pushIgnoredContainer(qName);
break;
@@ -191,6 +194,9 @@
case "abbreviated":
pushStringArrayEntry(qName, attributes, prefix + "DayAbbreviations/" + getContainerKey(), 7);
break;
+ case "narrow":
+ pushStringArrayEntry(qName, attributes, prefix + "DayNarrows/" + getContainerKey(), 7);
+ break;
default:
pushIgnoredContainer(qName);
break;
@@ -219,25 +225,36 @@
case "dayPeriodWidth":
// for FormatData
// create string array entry for am/pm. only keeping wide
- if ("wide".equals(attributes.getValue("type"))) {
+ switch (attributes.getValue("type")) {
+ case "wide":
pushStringArrayEntry(qName, attributes, "AmPmMarkers/" + getContainerKey(), 2);
- } else {
+ break;
+ case "narrow":
+ pushStringArrayEntry(qName, attributes, "narrow.AmPmMarkers/" + getContainerKey(), 2);
+ break;
+ default:
pushIgnoredContainer(qName);
+ break;
}
break;
case "dayPeriod":
// for FormatData
// add to string array entry of AmPmMarkers element
- switch (attributes.getValue("type")) {
- case "am":
- pushStringArrayElement(qName, attributes, 0);
- break;
- case "pm":
- pushStringArrayElement(qName, attributes, 1);
- break;
- default:
+ if (attributes.getValue("alt") == null) {
+ switch (attributes.getValue("type")) {
+ case "am":
+ pushStringArrayElement(qName, attributes, 0);
+ break;
+ case "pm":
+ pushStringArrayElement(qName, attributes, 1);
+ break;
+ default:
+ pushIgnoredContainer(qName);
+ break;
+ }
+ } else {
+ // discard alt values
pushIgnoredContainer(qName);
- break;
}
break;
case "eraNames":
@@ -269,7 +286,7 @@
assert currentContainer instanceof IgnoredContainer;
pushIgnoredContainer(qName);
} else {
- String key = currentCalendarType.keyElementName() + "short.Eras";
+ String key = currentCalendarType.keyElementName() + "narrow.Eras";
pushStringArrayEntry(qName, attributes, key, currentCalendarType.getEraLength(qName));
}
break;
@@ -301,15 +318,15 @@
break;
case "zone":
{
- String zone = attributes.getValue("type");
+ String tzid = attributes.getValue("type"); // Olson tz id
zonePrefix = CLDRConverter.TIMEZONE_ID_PREFIX;
- put(zonePrefix + zone, new HashMap<String, String>());
- pushKeyContainer(qName, attributes, zone);
+ put(zonePrefix + tzid, new HashMap<String, String>());
+ pushKeyContainer(qName, attributes, tzid);
}
break;
case "metazone":
{
- String zone = attributes.getValue("type");
+ String zone = attributes.getValue("type"); // LDML meta zone id
zonePrefix = CLDRConverter.METAZONE_ID_PREFIX;
put(zonePrefix + zone, new HashMap<String, String>());
pushKeyContainer(qName, attributes, zone);
@@ -323,16 +340,12 @@
zoneNameStyle = "short";
pushContainer(qName, attributes);
break;
- case "generic": // not used in JDK
- pushIgnoredContainer(qName);
+ case "generic": // generic name
+ case "standard": // standard time name
+ case "daylight": // daylight saving (summer) time name
+ pushStringEntry(qName, attributes, CLDRConverter.ZONE_NAME_PREFIX + qName + "." + zoneNameStyle);
break;
- case "standard": // standard time
- pushStringEntry(qName, attributes, CLDRConverter.TIMEZONE_NAME_PREFIX + "standard." + zoneNameStyle);
- break;
- case "daylight":
- pushStringEntry(qName, attributes, CLDRConverter.TIMEZONE_NAME_PREFIX + "daylight." + zoneNameStyle);
- break;
- case "exemplarCity":
+ case "exemplarCity": // not used in JDK
pushIgnoredContainer(qName);
break;
@@ -530,6 +543,7 @@
case "timeZoneNames":
zonePrefix = null;
break;
+ case "generic":
case "standard":
case "daylight":
if (zonePrefix != null && (currentContainer instanceof Entry)) {
--- a/jdk/make/tools/src/build/tools/cldrconverter/MetaZonesParseHandler.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/make/tools/src/build/tools/cldrconverter/MetaZonesParseHandler.java Mon Dec 10 10:52:11 2012 +0900
@@ -46,8 +46,9 @@
return null;
}
+ // metaZone: ID -> metazone
+ // per locale: ID -> names, metazone -> names
@Override
- @SuppressWarnings("fallthrough")
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
switch (qName) {
case "timezone":
--- a/jdk/make/tools/src/build/tools/cldrconverter/ResourceBundleGenerator.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/make/tools/src/build/tools/cldrconverter/ResourceBundleGenerator.java Mon Dec 10 10:52:11 2012 +0900
@@ -28,14 +28,16 @@
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, boolean open) throws IOException {
+ 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
@@ -67,6 +69,28 @@
encoding = "iso-8859-1";
}
+ Formatter fmt = null;
+ if (type == BundleType.TIMEZONE) {
+ fmt = new Formatter();
+ Set<String> metaKeys = new HashSet<>();
+ for (String key : map.keySet()) {
+ if (key.startsWith(CLDRConverter.METAZONE_ID_PREFIX)) {
+ String meta = key.substring(CLDRConverter.METAZONE_ID_PREFIX.length());
+ String[] value;
+ value = (String[]) map.get(key);
+ fmt.format(" final String[] %s = new String[] {\n", meta);
+ for (String s : value) {
+ fmt.format(" \"%s\",\n", CLDRConverter.saveConvert(s, useJava));
+ }
+ fmt.format(" };\n");
+ metaKeys.add(key);
+ }
+ }
+ for (String key : metaKeys) {
+ map.remove(key);
+ }
+ }
+
try (PrintWriter out = new PrintWriter(file, encoding)) {
// Output copyright headers
out.println(CopyrightHeaders.getOpenJDKCopyright());
@@ -74,16 +98,15 @@
if (useJava) {
out.println("package sun." + packageName + ";\n");
- if (open) {
- out.println("import sun.util.resources.OpenListResourceBundle;\n");
- out.println("public class " + baseName + ("root".equals(localeID) ? "" : "_" + localeID) + " extends OpenListResourceBundle {");
- } else {
- out.println("import java.util.ListResourceBundle;\n");
- out.println("public class " + baseName + ("root".equals(localeID) ? "" : "_" + localeID) + " extends ListResourceBundle {");
+ out.printf("import %s;\n\n", type.getPathName());
+ out.printf("public class %s%s extends %s {\n", baseName, "root".equals(localeID) ? "" : "_" + localeID, type.getClassName());
+
+ out.println(" @Override\n" +
+ " protected final Object[][] getContents() {");
+ if (fmt != null) {
+ out.print(fmt.toString());
}
- out.println(" @Override\n" +
- " protected final Object[][] getContents() {\n" +
- " final Object[][] data = new Object[][] {");
+ out.println(" final Object[][] data = new Object[][] {");
}
for (String key : map.keySet()) {
if (useJava) {
@@ -91,7 +114,11 @@
if (value == null) {
CLDRConverter.warning("null value for " + key);
} else if (value instanceof String) {
- out.println(" { \"" + key + "\", \"" + CLDRConverter.saveConvert((String) value, useJava) + "\" },");
+ 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[]) {
String[] values = (String[]) value;
out.println(" { \"" + key + "\",\n new String[] {");
--- a/jdk/src/share/classes/java/text/DateFormatSymbols.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/java/text/DateFormatSymbols.java Mon Dec 10 10:52:11 2012 +0900
@@ -688,7 +688,16 @@
}
ResourceBundle resource = adapter.getLocaleData().getDateFormatData(locale);
- eras = resource.getStringArray("Eras");
+ // JRE and CLDR use different keys
+ // JRE: Eras, short.Eras and narrow.Eras
+ // CLDR: long.Eras, Eras and narrow.Eras
+ if (resource.containsKey("Eras")) {
+ eras = resource.getStringArray("Eras");
+ } else if (resource.containsKey("long.Eras")) {
+ eras = resource.getStringArray("long.Eras");
+ } else if (resource.containsKey("short.Eras")) {
+ eras = resource.getStringArray("short.Eras");
+ }
months = resource.getStringArray("MonthNames");
shortMonths = resource.getStringArray("MonthAbbreviations");
ampms = resource.getStringArray("AmPmMarkers");
--- a/jdk/src/share/classes/java/text/SimpleDateFormat.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/java/text/SimpleDateFormat.java Mon Dec 10 10:52:11 2012 +0900
@@ -48,12 +48,13 @@
import java.util.Locale;
import java.util.Map;
import java.util.SimpleTimeZone;
+import java.util.SortedMap;
import java.util.TimeZone;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import sun.util.locale.provider.LocaleProviderAdapter;
import sun.util.calendar.CalendarUtils;
import sun.util.calendar.ZoneInfoFile;
+import sun.util.locale.provider.LocaleProviderAdapter;
/**
* <code>SimpleDateFormat</code> is a concrete class for formatting and
@@ -1593,6 +1594,17 @@
private int matchString(String text, int start, int field,
Map<String,Integer> data, CalendarBuilder calb) {
if (data != null) {
+ // TODO: make this default when it's in the spec.
+ if (data instanceof SortedMap) {
+ for (String name : data.keySet()) {
+ if (text.regionMatches(true, start, name, 0, name.length())) {
+ calb.set(field, data.get(name));
+ return start + name.length();
+ }
+ }
+ return -start;
+ }
+
String bestMatch = null;
for (String name : data.keySet()) {
@@ -1803,7 +1815,7 @@
boolean obeyCount, boolean[] ambiguousYear,
ParsePosition origPos,
boolean useFollowingMinusSignAsDelimiter, CalendarBuilder calb) {
- Number number = null;
+ Number number;
int value = 0;
ParsePosition pos = new ParsePosition(0);
pos.index = start;
@@ -1876,9 +1888,7 @@
return index;
}
} else {
- Map<String, Integer> map = calendar.getDisplayNames(field,
- Calendar.ALL_STYLES,
- locale);
+ Map<String, Integer> map = getDisplayNamesMap(field, locale);
if ((index = matchString(text, start, field, map, calb)) > 0) {
return index;
}
@@ -1940,7 +1950,7 @@
// count >= 3 // i.e., MMM or MMMM
// Want to be able to parse both short and long forms.
// Try count == 4 first:
- int newStart = 0;
+ int newStart;
if ((newStart = matchString(text, start, Calendar.MONTH,
formatData.getMonths(), calb)) > 0) {
return newStart;
@@ -1951,9 +1961,7 @@
return index;
}
} else {
- Map<String, Integer> map = calendar.getDisplayNames(field,
- Calendar.ALL_STYLES,
- locale);
+ Map<String, Integer> map = getDisplayNamesMap(field, locale);
if ((index = matchString(text, start, field, map, calb)) > 0) {
return index;
}
@@ -1979,7 +1987,7 @@
if (useDateFormatSymbols) {
// Want to be able to parse both short and long forms.
// Try count == 4 (DDDD) first:
- int newStart = 0;
+ int newStart;
if ((newStart=matchString(text, start, Calendar.DAY_OF_WEEK,
formatData.getWeekdays(), calb)) > 0) {
return newStart;
@@ -2008,7 +2016,7 @@
return index;
}
} else {
- Map<String,Integer> map = calendar.getDisplayNames(field, Calendar.ALL_STYLES, locale);
+ Map<String,Integer> map = getDisplayNamesMap(field, locale);
if ((index = matchString(text, start, field, map, calb)) > 0) {
return index;
}
@@ -2098,7 +2106,7 @@
break parsing;
}
- int sign = 0;
+ int sign;
char c = text.charAt(pos.index);
if (c == 'Z') {
calb.set(Calendar.ZONE_OFFSET, 0).set(Calendar.DST_OFFSET, 0);
@@ -2340,6 +2348,21 @@
&& formatData.equals(that.formatData));
}
+ private static final int[] REST_OF_STYLES = {
+ Calendar.SHORT_STANDALONE, Calendar.LONG_FORMAT, Calendar.LONG_STANDALONE,
+ };
+ private Map<String, Integer> getDisplayNamesMap(int field, Locale locale) {
+ Map<String, Integer> map = calendar.getDisplayNames(field, Calendar.SHORT_FORMAT, locale);
+ // Get all SHORT and LONG styles (avoid NARROW styles).
+ for (int style : REST_OF_STYLES) {
+ Map<String, Integer> m = calendar.getDisplayNames(field, style, locale);
+ if (m != null) {
+ map.putAll(m);
+ }
+ }
+ return map;
+ }
+
/**
* After reading an object from the input stream, the format
* pattern in the object is verified.
--- a/jdk/src/share/classes/java/util/Calendar.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/java/util/Calendar.java Mon Dec 10 10:52:11 2012 +0900
@@ -53,9 +53,7 @@
import java.text.DateFormatSymbols;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import java.util.spi.CalendarDataProvider;
import sun.util.BuddhistCalendar;
-import sun.util.locale.provider.LocaleProviderAdapter;
import sun.util.calendar.ZoneInfo;
import sun.util.locale.provider.CalendarDataUtility;
@@ -746,6 +744,32 @@
/**
* A style specifier for {@link #getDisplayName(int, int, Locale)
* getDisplayName} and {@link #getDisplayNames(int, int, Locale)
+ * getDisplayNames} indicating a narrow name used for format. Narrow names
+ * are typically single character strings, such as "M" for Monday.
+ *
+ * @see #NARROW_STANDALONE
+ * @see #SHORT_FORMAT
+ * @see #LONG_FOTMAT
+ * @since 1.8
+ */
+ public static final int NARROW_FORMAT = 4;
+
+ /**
+ * A style specifier for {@link #getDisplayName(int, int, Locale)
+ * getDisplayName} and {@link #getDisplayNames(int, int, Locale)
+ * getDisplayNames} indicating a narrow name independently. Narrow names
+ * are typically single character strings, such as "M" for Monday.
+ *
+ * @see #NARROW_FORMAT
+ * @see #SHORT_STANDALONE
+ * @see #LONG_STANDALONE
+ * @since 1.8
+ */
+ public static final int NARROW_STANDALONE = NARROW_FORMAT | STANDALONE_MASK;
+
+ /**
+ * A style specifier for {@link #getDisplayName(int, int, Locale)
+ * getDisplayName} and {@link #getDisplayNames(int, int, Locale)
* getDisplayNames} indicating a short name used for format.
*
* @see #SHORT_STANDALONE
@@ -1472,30 +1496,31 @@
* @param style
* the style applied to the string representation; one of {@link
* #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE},
- * {@link #LONG_FORMAT} ({@link #LONG}) or {@link #LONG_STANDALONE}.
+ * {@link #LONG_FORMAT} ({@link #LONG}), {@link #LONG_STANDALONE},
+ * {@link #NARROW_FORMAT}, or {@link #NARROW_STANDALONE}.
* @param locale
* the locale for the string representation
* (any calendar types specified by {@code locale} are ignored)
* @return the string representation of the given
- * <code>field</code> in the given <code>style</code>, or
- * <code>null</code> if no string representation is
+ * {@code field} in the given {@code style}, or
+ * {@code null} if no string representation is
* applicable.
* @exception IllegalArgumentException
- * if <code>field</code> or <code>style</code> is invalid,
- * or if this <code>Calendar</code> is non-lenient and any
+ * if {@code field} or {@code style} is invalid,
+ * or if this {@code Calendar} is non-lenient and any
* of the calendar fields have invalid values
* @exception NullPointerException
- * if <code>locale</code> is null
+ * if {@code locale} is null
* @since 1.6
*/
public String getDisplayName(int field, int style, Locale locale) {
- if (!checkDisplayNameParams(field, style, SHORT, LONG, locale,
+ if (!checkDisplayNameParams(field, style, SHORT, NARROW_FORMAT, locale,
ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
return null;
}
- // the standalone styles are supported only through CalendarDataProviders.
- if (isStandaloneStyle(style)) {
+ // the standalone and narrow styles are supported only through CalendarDataProviders.
+ if (isStandaloneStyle(style) || isNarrowStyle(style)) {
return CalendarDataUtility.retrieveFieldValueName(getCalendarType(),
field, get(field),
style, locale);
@@ -1513,26 +1538,30 @@
}
/**
- * Returns a <code>Map</code> containing all names of the calendar
- * <code>field</code> in the given <code>style</code> and
- * <code>locale</code> and their corresponding field values. For
- * example, if this <code>Calendar</code> is a {@link
+ * Returns a {@code Map} containing all names of the calendar
+ * {@code field} in the given {@code style} and
+ * {@code locale} and their corresponding field values. For
+ * example, if this {@code Calendar} is a {@link
* GregorianCalendar}, the returned map would contain "Jan" to
* {@link #JANUARY}, "Feb" to {@link #FEBRUARY}, and so on, in the
* {@linkplain #SHORT short} style in an English locale.
*
+ * <p>Narrow names may not be unique due to use of single characters,
+ * such as "S" for Sunday and Saturday. In that case narrow names are not
+ * included in the returned {@code Map}.
+ *
* <p>The values of other calendar fields may be taken into
* account to determine a set of display names. For example, if
- * this <code>Calendar</code> is a lunisolar calendar system and
+ * this {@code Calendar} is a lunisolar calendar system and
* the year value given by the {@link #YEAR} field has a leap
* month, this method would return month names containing the leap
* month name, and month names are mapped to their values specific
* for the year.
*
* <p>The default implementation supports display names contained in
- * a {@link DateFormatSymbols}. For example, if <code>field</code>
- * is {@link #MONTH} and <code>style</code> is {@link
- * #ALL_STYLES}, this method returns a <code>Map</code> containing
+ * a {@link DateFormatSymbols}. For example, if {@code field}
+ * is {@link #MONTH} and {@code style} is {@link
+ * #ALL_STYLES}, this method returns a {@code Map} containing
* all strings returned by {@link DateFormatSymbols#getShortMonths()}
* and {@link DateFormatSymbols#getMonths()}.
*
@@ -1541,30 +1570,31 @@
* @param style
* the style applied to the string representation; one of {@link
* #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE},
- * {@link #LONG_FORMAT} ({@link #LONG}) or {@link #LONG_STANDALONE}.
+ * {@link #LONG_FORMAT} ({@link #LONG}), {@link #LONG_STANDALONE},
+ * {@link #NARROW_FORMAT}, or {@link #NARROW_STANDALONE}
* @param locale
* the locale for the display names
- * @return a <code>Map</code> containing all display names in
- * <code>style</code> and <code>locale</code> and their
- * field values, or <code>null</code> if no display names
- * are defined for <code>field</code>
+ * @return a {@code Map} containing all display names in
+ * {@code style} and {@code locale} and their
+ * field values, or {@code null} if no display names
+ * are defined for {@code field}
* @exception IllegalArgumentException
- * if <code>field</code> or <code>style</code> is invalid,
- * or if this <code>Calendar</code> is non-lenient and any
+ * if {@code field} or {@code style} is invalid,
+ * or if this {@code Calendar} is non-lenient and any
* of the calendar fields have invalid values
* @exception NullPointerException
- * if <code>locale</code> is null
+ * if {@code locale} is null
* @since 1.6
*/
public Map<String, Integer> getDisplayNames(int field, int style, Locale locale) {
- if (!checkDisplayNameParams(field, style, ALL_STYLES, LONG, locale,
+ if (!checkDisplayNameParams(field, style, ALL_STYLES, NARROW_FORMAT, locale,
ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
return null;
}
if (style == ALL_STYLES || isStandaloneStyle(style)) {
return CalendarDataUtility.retrieveFieldValueNames(getCalendarType(), field, style, locale);
}
- // SHORT or LONG
+ // SHORT, LONG, or NARROW
return getDisplayNamesImpl(field, style, locale);
}
@@ -1599,6 +1629,12 @@
private String[] getFieldStrings(int field, int style, DateFormatSymbols symbols) {
int baseStyle = getBaseStyle(style); // ignore the standalone mask
+
+ // DateFormatSymbols doesn't support any narrow names.
+ if (baseStyle == NARROW_FORMAT) {
+ return null;
+ }
+
String[] strings = null;
switch (field) {
case ERA:
@@ -1948,6 +1984,10 @@
return (style & STANDALONE_MASK) != 0;
}
+ boolean isNarrowStyle(int style) {
+ return style == NARROW_FORMAT || style == NARROW_STANDALONE;
+ }
+
/**
* Returns the pseudo-time-stamp for two fields, given their
* individual pseudo-time-stamps. If either of the fields
--- a/jdk/src/share/classes/java/util/JapaneseImperialCalendar.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/java/util/JapaneseImperialCalendar.java Mon Dec 10 10:52:11 2012 +0900
@@ -946,8 +946,9 @@
set(field, getRolledValue(internalGet(field), amount, min, max));
}
+ @Override
public String getDisplayName(int field, int style, Locale locale) {
- if (!checkDisplayNameParams(field, style, SHORT, LONG, locale,
+ if (!checkDisplayNameParams(field, style, SHORT, NARROW_FORMAT, locale,
ERA_MASK|YEAR_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
return null;
}
@@ -956,11 +957,12 @@
// "GanNen" is supported only in the LONG style.
if (field == YEAR
- && (getBaseStyle(style) == SHORT || fieldValue != 1 || get(ERA) == 0)) {
+ && (getBaseStyle(style) != LONG || fieldValue != 1 || get(ERA) == 0)) {
return null;
}
- String name = CalendarDataUtility.retrieveFieldValueName("japanese", field, fieldValue, style, locale);
+ String name = CalendarDataUtility.retrieveFieldValueName(getCalendarType(), field,
+ fieldValue, style, locale);
// If the ERA value is null, then
// try to get its name or abbreviation from the Era instance.
if (name == null && field == ERA && fieldValue < eras.length) {
@@ -970,27 +972,37 @@
return name;
}
+ @Override
public Map<String,Integer> getDisplayNames(int field, int style, Locale locale) {
- if (!checkDisplayNameParams(field, style, ALL_STYLES, LONG, locale,
+ if (!checkDisplayNameParams(field, style, ALL_STYLES, NARROW_FORMAT, locale,
ERA_MASK|YEAR_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) {
return null;
}
- Map<String, Integer> names = CalendarDataUtility.retrieveFieldValueNames("japanese", field, style, locale);
+ Map<String, Integer> names;
+ names = CalendarDataUtility.retrieveFieldValueNames(getCalendarType(), field, style, locale);
// If strings[] has fewer than eras[], get more names from eras[].
- if (field == ERA) {
- int size = names.size();
- if (style == ALL_STYLES) {
- size /= 2; // SHORT and LONG
- }
- if (size < eras.length) {
- int baseStyle = getBaseStyle(style);
- for (int i = size; i < eras.length; i++) {
- Era era = eras[i];
- if (baseStyle == ALL_STYLES || baseStyle == SHORT) {
- names.put(era.getAbbreviation(), i);
+ if (names != null) {
+ if (field == ERA) {
+ int size = names.size();
+ if (style == ALL_STYLES) {
+ Set<Integer> values = new HashSet<>();
+ // count unique era values
+ for (String key : names.keySet()) {
+ values.add(names.get(key));
}
- if (baseStyle == ALL_STYLES || baseStyle == LONG) {
- names.put(era.getName(), i);
+ size = values.size();
+ }
+ if (size < eras.length) {
+ int baseStyle = getBaseStyle(style);
+ for (int i = size; i < eras.length; i++) {
+ Era era = eras[i];
+ if (baseStyle == ALL_STYLES || baseStyle == SHORT
+ || baseStyle == NARROW_FORMAT) {
+ names.put(era.getAbbreviation(), i);
+ }
+ if (baseStyle == ALL_STYLES || baseStyle == LONG) {
+ names.put(era.getName(), i);
+ }
}
}
}
--- a/jdk/src/share/classes/java/util/TimeZone.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/java/util/TimeZone.java Mon Dec 10 10:52:11 2012 +0900
@@ -43,12 +43,12 @@
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.concurrent.ConcurrentHashMap;
+import sun.misc.JavaAWTAccess;
import sun.misc.SharedSecrets;
-import sun.misc.JavaAWTAccess;
import sun.security.action.GetPropertyAction;
-import sun.util.locale.provider.TimeZoneNameUtility;
import sun.util.calendar.ZoneInfo;
import sun.util.calendar.ZoneInfoFile;
+import sun.util.locale.provider.TimeZoneNameUtility;
/**
* <code>TimeZone</code> represents a time zone offset, and also figures out daylight
@@ -399,28 +399,23 @@
if (style != SHORT && style != LONG) {
throw new IllegalArgumentException("Illegal style: " + style);
}
-
String id = getID();
- String[] names = getDisplayNames(id, locale);
- if (names == null) {
- if (id.startsWith("GMT") && id.length() > 3) {
- char sign = id.charAt(3);
- if (sign == '+' || sign == '-') {
- return id;
- }
- }
- int offset = getRawOffset();
- if (daylight) {
- offset += getDSTSavings();
- }
- return ZoneInfoFile.toCustomID(offset);
+ String name = TimeZoneNameUtility.retrieveDisplayName(id, daylight, style, locale);
+ if (name != null) {
+ return name;
}
- int index = daylight ? 3 : 1;
- if (style == SHORT) {
- index++;
+ if (id.startsWith("GMT") && id.length() > 3) {
+ char sign = id.charAt(3);
+ if (sign == '+' || sign == '-') {
+ return id;
+ }
}
- return names[index];
+ int offset = getRawOffset();
+ if (daylight) {
+ offset += getDSTSavings();
+ }
+ return ZoneInfoFile.toCustomID(offset);
}
private static class DisplayNames {
@@ -429,9 +424,12 @@
// Map(key=id, value=SoftReference(Map(key=locale, value=displaynames)))
private static final Map<String, SoftReference<Map<Locale, String[]>>> CACHE =
new ConcurrentHashMap<>();
+
+ private DisplayNames() {
+ }
}
- private static final String[] getDisplayNames(String id, Locale locale) {
+ private static String[] getDisplayNames(String id, Locale locale) {
Map<String, SoftReference<Map<Locale, String[]>>> displayNames = DisplayNames.CACHE;
SoftReference<Map<Locale, String[]>> ref = displayNames.get(id);
@@ -631,14 +629,14 @@
}
private static synchronized TimeZone setDefaultZone() {
- TimeZone tz = null;
+ TimeZone tz;
// get the time zone ID from the system properties
String zoneID = AccessController.doPrivileged(
new GetPropertyAction("user.timezone"));
// if the time zone ID is not set (yet), perform the
// platform to Java time zone ID mapping.
- if (zoneID == null || zoneID.equals("")) {
+ if (zoneID == null || zoneID.isEmpty()) {
String country = AccessController.doPrivileged(
new GetPropertyAction("user.country"));
String javaHome = AccessController.doPrivileged(
@@ -670,8 +668,9 @@
assert tz != null;
final String id = zoneID;
- AccessController.doPrivileged(new PrivilegedAction<Object>() {
- public Object run() {
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
System.setProperty("user.timezone", id);
return null;
}
--- a/jdk/src/share/classes/java/util/spi/CalendarNameProvider.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/java/util/spi/CalendarNameProvider.java Mon Dec 10 10:52:11 2012 +0900
@@ -174,7 +174,8 @@
* <p>{@code style} gives the style of the string representation. It is one
* of {@link Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}),
* {@link Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT}
- * ({@link Calendar#LONG LONG}), or {@link Calendar#LONG_STANDALONE}.
+ * ({@link Calendar#LONG LONG}), {@link Calendar#LONG_STANDALONE},
+ * {@link Calendar#NARROW_FORMAT}, or {@link Calendar#NARROW_STANDALONE}.
*
* <p>For example, the following call will return {@code "Sunday"}.
* <pre>
@@ -195,8 +196,10 @@
* the string representation style: one of {@link
* Calendar#SHORT_FORMAT} ({@link Calendar#SHORT SHORT}),
* {@link Calendar#SHORT_STANDALONE}, {@link
- * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or
- * {@link Calendar#LONG_STANDALONE}
+ * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}),
+ * {@link Calendar#LONG_STANDALONE},
+ * {@link Calendar#NARROW_FORMAT},
+ * or {@link Calendar#NARROW_STANDALONE}
* @param locale
* the desired locale
* @return the string representation of the {@code field value}, or {@code
@@ -226,8 +229,11 @@
* <p>{@code style} gives the style of the string representation. It must be
* one of {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT} ({@link
* Calendar#SHORT SHORT}), {@link Calendar#SHORT_STANDALONE}, {@link
- * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), or {@link
- * Calendar#LONG_STANDALONE}.
+ * Calendar#LONG_FORMAT} ({@link Calendar#LONG LONG}), {@link
+ * Calendar#LONG_STANDALONE}, {@link Calendar#NARROW_FORMAT}, or
+ * {@link Calendar#NARROW_STANDALONE}. Note that narrow names may
+ * not be unique due to use of single characters, such as "S" for Sunday
+ * and Saturday, and that no narrow names are included in that case.
*
* <p>For example, the following call will return a {@code Map} containing
* {@code "January"} to {@link Calendar#JANUARY}, {@code "Jan"} to {@link
@@ -247,8 +253,9 @@
* {@link Calendar#ALL_STYLES}, {@link Calendar#SHORT_FORMAT}
* ({@link Calendar#SHORT SHORT}), {@link
* Calendar#SHORT_STANDALONE}, {@link Calendar#LONG_FORMAT}
- * ({@link Calendar#LONG LONG}), or {@link
- * Calendar#LONG_STANDALONE}.
+ * ({@link Calendar#LONG LONG}), {@link Calendar#LONG_STANDALONE},
+ * {@link Calendar#NARROW_FORMAT},
+ * or {@link Calendar#NARROW_STANDALONE}
* @param locale
* the desired locale
* @return a {@code Map} containing all display names of {@code field} in
--- a/jdk/src/share/classes/java/util/spi/TimeZoneNameProvider.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/java/util/spi/TimeZoneNameProvider.java Mon Dec 10 10:52:11 2012 +0900
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2012, 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
@@ -77,4 +77,34 @@
* @see java.util.TimeZone#getDisplayName(boolean, int, java.util.Locale)
*/
public abstract String getDisplayName(String ID, boolean daylight, int style, Locale locale);
+
+ /**
+ * Returns a generic name for the given time zone {@code ID} that's suitable
+ * for presentation to the user in the specified {@code locale}. Generic
+ * time zone names are neutral from standard time and daylight saving
+ * time. For example, "PT" is the short generic name of time zone ID {@code
+ * America/Los_Angeles}, while its short standard time and daylight saving
+ * time names are "PST" and "PDT", respectively. Refer to
+ * {@link #getDisplayName(String, boolean, int, Locale) getDisplayName}
+ * for valid time zone IDs.
+ *
+ * <p>The default implementation of this method returns {@code null}.
+ *
+ * @param ID a time zone ID string
+ * @param style either {@link java.util.TimeZone#LONG TimeZone.LONG} or
+ * {@link java.util.TimeZone#SHORT TimeZone.SHORT}
+ * @param locale the desired locale
+ * @return the human-readable generic name of the given time zone in the
+ * given locale, or {@code null} if it's not available.
+ * @exception IllegalArgumentException if <code>style</code> is invalid,
+ * or <code>locale</code> isn't one of the locales returned from
+ * {@link LocaleServiceProvider#getAvailableLocales()
+ * getAvailableLocales()}.
+ * @exception NullPointerException if <code>ID</code> or <code>locale</code>
+ * is {@code null}
+ * @since 1.8
+ */
+ public String getGenericDisplayName(String ID, int style, Locale locale) {
+ return null;
+ }
}
--- a/jdk/src/share/classes/sun/text/resources/FormatData.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/FormatData.java Mon Dec 10 10:52:11 2012 +0900
@@ -50,6 +50,20 @@
* Overrides ListResourceBundle
*/
protected final Object[][] getContents() {
+ final String[] buddhistEras = new String[] { // Thai Buddhist calendar era strings
+ "BC", // BC
+ "B.E." // Buddhist Era
+ };
+
+ // Japanese imperial calendar era abbreviations
+ final String[] japaneseEraAbbrs = new String[] {
+ "",
+ "M",
+ "T",
+ "S",
+ "H",
+ };
+
return new Object[][] {
{ "MonthNames",
new String[] {
@@ -107,29 +121,49 @@
"Sat" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "S",
+ "M",
+ "T",
+ "W",
+ "T",
+ "F",
+ "S",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"AM", // am marker
"PM" // pm marker
}
},
+ { "narrow.AmPmMarkers",
+ new String[] {
+ "a", // am marker
+ "p" // pm marker
+ }
+ },
{ "Eras",
new String[] { // era strings for GregorianCalendar
"BC",
"AD"
}
},
- { "buddhist.Eras",
- new String[] { // Thai Buddhist calendar era strings
- "BC", // BC
- "B.E." // Buddhist Era
+ { "narrow.Eras",
+ new String[] {
+ "B",
+ "A",
}
},
+ { "buddhist.Eras",
+ buddhistEras
+ },
{ "buddhist.short.Eras",
- new String[] { // Thai Buddhist calendar era strings
- "BC", // BC
- "B.E." // Buddhist Era
- }
+ buddhistEras
+ },
+ { "buddhist.narrow.Eras",
+ buddhistEras
},
{ "japanese.Eras",
new String[] { // Japanese imperial calendar era strings
@@ -141,13 +175,10 @@
}
},
{ "japanese.short.Eras",
- new String[] { // Japanese imperial calendar era abbreviations
- "",
- "M",
- "T",
- "S",
- "H",
- }
+ japaneseEraAbbrs
+ },
+ { "japanese.narrow.Eras",
+ japaneseEraAbbrs
},
{ "japanese.FirstYear",
new String[] { // Japanese imperial calendar year name
--- a/jdk/src/share/classes/sun/text/resources/ar/FormatData_ar.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/ar/FormatData_ar.java Mon Dec 10 10:52:11 2012 +0900
@@ -107,6 +107,17 @@
"\u0633" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u062d",
+ "\u0646",
+ "\u062b",
+ "\u0631",
+ "\u062e",
+ "\u062c",
+ "\u0633",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"\u0635", // am marker
--- a/jdk/src/share/classes/sun/text/resources/be/FormatData_be.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/be/FormatData_be.java Mon Dec 10 10:52:11 2012 +0900
@@ -85,6 +85,23 @@
"" // abb month 13 if applicable
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "\u0441",
+ "\u043b",
+ "\u0441",
+ "\u043a",
+ "\u043c",
+ "\u0447",
+ "\u043b",
+ "\u0436",
+ "\u0432",
+ "\u043a",
+ "\u043b",
+ "\u0441",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"\u043d\u044f\u0434\u0437\u0435\u043b\u044f", // Sunday
@@ -107,6 +124,17 @@
"\u0441\u0431" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u043d",
+ "\u043f",
+ "\u0430",
+ "\u0441",
+ "\u0447",
+ "\u043f",
+ "\u0441",
+ }
+ },
{ "Eras",
new String[] { // era strings
"\u0434\u0430 \u043d.\u0435.",
--- a/jdk/src/share/classes/sun/text/resources/bg/FormatData_bg.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/bg/FormatData_bg.java Mon Dec 10 10:52:11 2012 +0900
@@ -107,6 +107,17 @@
"\u0421\u0431" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u043d",
+ "\u043f",
+ "\u0432",
+ "\u0441",
+ "\u0447",
+ "\u043f",
+ "\u0441",
+ }
+ },
{ "Eras",
new String[] { // era strings
"\u043f\u0440.\u043d.\u0435.",
--- a/jdk/src/share/classes/sun/text/resources/ca/FormatData_ca.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/ca/FormatData_ca.java Mon Dec 10 10:52:11 2012 +0900
@@ -119,6 +119,23 @@
"" // abb month 13 if applicable
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "g",
+ "f",
+ "m",
+ "a",
+ "m",
+ "j",
+ "j",
+ "a",
+ "s",
+ "o",
+ "n",
+ "d",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"diumenge", // Sunday
@@ -141,6 +158,28 @@
"ds." // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "G",
+ "L", // Note: contributed item in CDLR
+ "T",
+ "C",
+ "J",
+ "V",
+ "S",
+ }
+ },
+ { "standalone.DayNarrows",
+ new String[] {
+ "g",
+ "l",
+ "t",
+ "c",
+ "j",
+ "v",
+ "s",
+ }
+ },
{ "NumberElements",
new String[] {
",", // decimal separator
--- a/jdk/src/share/classes/sun/text/resources/cs/FormatData_cs.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/cs/FormatData_cs.java Mon Dec 10 10:52:11 2012 +0900
@@ -141,6 +141,17 @@
"So" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "N",
+ "P",
+ "\u00da",
+ "S",
+ "\u010c",
+ "P",
+ "S",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"dop.", // am marker
--- a/jdk/src/share/classes/sun/text/resources/da/FormatData_da.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/da/FormatData_da.java Mon Dec 10 10:52:11 2012 +0900
@@ -124,6 +124,17 @@
"l\u00f8" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "S",
+ "M",
+ "T",
+ "O",
+ "T",
+ "F",
+ "L",
+ }
+ },
{ "NumberElements",
new String[] {
",", // decimal separator
--- a/jdk/src/share/classes/sun/text/resources/de/FormatData_de.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/de/FormatData_de.java Mon Dec 10 10:52:11 2012 +0900
@@ -124,6 +124,17 @@
"Sa" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "S",
+ "M",
+ "D",
+ "M",
+ "D",
+ "F",
+ "S",
+ }
+ },
{ "Eras",
new String[] { // era strings
"v. Chr.",
--- a/jdk/src/share/classes/sun/text/resources/el/FormatData_el.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/el/FormatData_el.java Mon Dec 10 10:52:11 2012 +0900
@@ -124,6 +124,17 @@
"\u03a3\u03b1\u03b2" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u039a",
+ "\u0394",
+ "\u03a4",
+ "\u03a4",
+ "\u03a0",
+ "\u03a0",
+ "\u03a3",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"\u03c0\u03bc", // am marker
--- a/jdk/src/share/classes/sun/text/resources/es/FormatData_es.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/es/FormatData_es.java Mon Dec 10 10:52:11 2012 +0900
@@ -104,6 +104,17 @@
"s\u00e1b" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "D",
+ "L",
+ "M",
+ "X",
+ "J",
+ "V",
+ "S",
+ }
+ },
{ "NumberPatterns",
new String[] {
"#,##0.###;-#,##0.###", // decimal pattern
--- a/jdk/src/share/classes/sun/text/resources/et/FormatData_et.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/et/FormatData_et.java Mon Dec 10 10:52:11 2012 +0900
@@ -104,6 +104,17 @@
"L" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "P",
+ "E",
+ "T",
+ "K",
+ "N",
+ "R",
+ "L",
+ }
+ },
{ "Eras",
new String[] { // era strings
"e.m.a.",
--- a/jdk/src/share/classes/sun/text/resources/fi/FormatData_fi.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/fi/FormatData_fi.java Mon Dec 10 10:52:11 2012 +0900
@@ -116,6 +116,23 @@
"" // abb month 13 if applicable
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "T",
+ "H",
+ "M",
+ "H",
+ "T",
+ "K",
+ "H",
+ "E",
+ "S",
+ "L",
+ "M",
+ "J",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"sunnuntai", // Sunday
@@ -138,6 +155,28 @@
"la" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "S",
+ "M",
+ "T",
+ "K",
+ "T",
+ "P",
+ "L",
+ }
+ },
+ { "standalone.DayNarrows",
+ new String[] {
+ "S",
+ "M",
+ "T",
+ "K",
+ "T",
+ "P",
+ "L",
+ }
+ },
{ "NumberElements",
new String[] {
",", // decimal separator
@@ -181,6 +220,12 @@
"ip." // pm marker
}
},
+ { "narrow.AmPmMarkers",
+ new String[] {
+ "ap.",
+ "ip.",
+ }
+ },
};
}
}
--- a/jdk/src/share/classes/sun/text/resources/fr/FormatData_fr.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/fr/FormatData_fr.java Mon Dec 10 10:52:11 2012 +0900
@@ -104,6 +104,17 @@
"sam." // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "D",
+ "L",
+ "M",
+ "M",
+ "J",
+ "V",
+ "S",
+ }
+ },
{ "Eras",
new String[] { // era strings
"BC",
--- a/jdk/src/share/classes/sun/text/resources/hi/FormatData_hi_IN.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/hi/FormatData_hi_IN.java Mon Dec 10 10:52:11 2012 +0900
@@ -99,6 +99,17 @@
"\u0936\u0928\u093f" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u0930",
+ "\u0938\u094b",
+ "\u092e\u0902",
+ "\u092c\u0941",
+ "\u0917\u0941",
+ "\u0936\u0941",
+ "\u0936",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"\u092a\u0942\u0930\u094d\u0935\u093e\u0939\u094d\u0928", // am marker
--- a/jdk/src/share/classes/sun/text/resources/hr/FormatData_hr.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/hr/FormatData_hr.java Mon Dec 10 10:52:11 2012 +0900
@@ -116,6 +116,23 @@
"" // abb month 13 if applicable
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "1.",
+ "2.",
+ "3.",
+ "4.",
+ "5.",
+ "6.",
+ "7.",
+ "8.",
+ "9.",
+ "10.",
+ "11.",
+ "12.",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"nedjelja", // Sunday
@@ -138,6 +155,28 @@
"sub" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "N",
+ "P",
+ "U",
+ "S",
+ "\u010c",
+ "P",
+ "S",
+ }
+ },
+ { "standalone.DayNarrows",
+ new String[] {
+ "n",
+ "p",
+ "u",
+ "s",
+ "\u010d",
+ "p",
+ "s",
+ }
+ },
{ "NumberElements",
new String[] {
",", // decimal separator
--- a/jdk/src/share/classes/sun/text/resources/hu/FormatData_hu.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/hu/FormatData_hu.java Mon Dec 10 10:52:11 2012 +0900
@@ -104,6 +104,17 @@
"Szo" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "V",
+ "H",
+ "K",
+ "Sz",
+ "Cs",
+ "P",
+ "Sz",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"DE", // am marker
--- a/jdk/src/share/classes/sun/text/resources/is/FormatData_is.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/is/FormatData_is.java Mon Dec 10 10:52:11 2012 +0900
@@ -82,6 +82,23 @@
"" // abb month 13 if applicable
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "j",
+ "f",
+ "m",
+ "a",
+ "m",
+ "j",
+ "j",
+ "\u00e1",
+ "s",
+ "o",
+ "n",
+ "d",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"sunnudagur", // Sunday
@@ -104,6 +121,28 @@
"lau." // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "S",
+ "M",
+ "\u00de",
+ "M",
+ "F",
+ "F",
+ "L",
+ }
+ },
+ { "standalone.DayNarrows",
+ new String[] {
+ "s",
+ "m",
+ "\u00fe",
+ "m",
+ "f",
+ "f",
+ "l",
+ }
+ },
{ "NumberElements",
new String[] {
",", // decimal separator
--- a/jdk/src/share/classes/sun/text/resources/it/FormatData_it.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/it/FormatData_it.java Mon Dec 10 10:52:11 2012 +0900
@@ -121,6 +121,17 @@
"sab" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "D",
+ "L",
+ "M",
+ "M",
+ "G",
+ "V",
+ "S",
+ }
+ },
{ "Eras",
new String[] { // era strings
"BC",
--- a/jdk/src/share/classes/sun/text/resources/iw/FormatData_iw.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/iw/FormatData_iw.java Mon Dec 10 10:52:11 2012 +0900
@@ -121,6 +121,28 @@
"\u05e9" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u05d0",
+ "\u05d1",
+ "\u05d2",
+ "\u05d3",
+ "\u05d4",
+ "\u05d5",
+ "\u05e9",
+ }
+ },
+ { "standalone.DayNarrows",
+ new String[] {
+ "\u05d0",
+ "\u05d1",
+ "\u05d2",
+ "\u05d3",
+ "\u05d4",
+ "\u05d5",
+ "\u05e9",
+ }
+ },
{ "Eras",
new String[] { // era strings
"\u05dc\u05e1\u05d4\"\u05e0",
--- a/jdk/src/share/classes/sun/text/resources/ja/FormatData_ja.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/ja/FormatData_ja.java Mon Dec 10 10:52:11 2012 +0900
@@ -104,6 +104,17 @@
"\u571f" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u65e5",
+ "\u6708",
+ "\u706b",
+ "\u6c34",
+ "\u6728",
+ "\u91d1",
+ "\u571f",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"\u5348\u524d", // am marker
--- a/jdk/src/share/classes/sun/text/resources/ko/FormatData_ko.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/ko/FormatData_ko.java Mon Dec 10 10:52:11 2012 +0900
@@ -104,6 +104,17 @@
"\ud1a0" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\uc77c",
+ "\uc6d4",
+ "\ud654",
+ "\uc218",
+ "\ubaa9",
+ "\uae08",
+ "\ud1a0",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"\uc624\uc804", // am marker
--- a/jdk/src/share/classes/sun/text/resources/lt/FormatData_lt.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/lt/FormatData_lt.java Mon Dec 10 10:52:11 2012 +0900
@@ -99,6 +99,23 @@
"" // abb month 13 if applicable
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "S",
+ "V",
+ "K",
+ "B",
+ "G",
+ "B",
+ "L",
+ "R",
+ "R",
+ "S",
+ "L",
+ "G",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"Sekmadienis", // Sunday
@@ -121,6 +138,28 @@
"\u0160t" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "S",
+ "P",
+ "A",
+ "T",
+ "K",
+ "P",
+ "\u0160",
+ }
+ },
+ { "standalone.DayNarrows",
+ new String[] {
+ "S",
+ "P",
+ "A",
+ "T",
+ "K",
+ "P",
+ "\u0160",
+ }
+ },
{ "Eras",
new String[] { // era strings
"pr.Kr.",
--- a/jdk/src/share/classes/sun/text/resources/lv/FormatData_lv.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/lv/FormatData_lv.java Mon Dec 10 10:52:11 2012 +0900
@@ -121,6 +121,17 @@
"S" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "S",
+ "P",
+ "O",
+ "T",
+ "C",
+ "P",
+ "S",
+ }
+ },
{ "Eras",
new String[] { // era strings
"pm\u0113",
--- a/jdk/src/share/classes/sun/text/resources/mk/FormatData_mk.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/mk/FormatData_mk.java Mon Dec 10 10:52:11 2012 +0900
@@ -104,6 +104,17 @@
"\u0441\u0430\u0431." // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u043d",
+ "\u043f",
+ "\u0432",
+ "\u0441",
+ "\u0447",
+ "\u043f",
+ "\u0441",
+ }
+ },
{ "Eras",
new String[] { // era strings
"\u043f\u0440.\u043d.\u0435.",
--- a/jdk/src/share/classes/sun/text/resources/ms/FormatData_ms.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/ms/FormatData_ms.java Mon Dec 10 10:52:11 2012 +0900
@@ -81,6 +81,23 @@
"",
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "O",
+ "S",
+ "O",
+ "N",
+ "D",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"Ahad",
@@ -103,6 +120,28 @@
"Sab",
}
},
+ { "DayNarrows",
+ new String[] {
+ "A",
+ "I",
+ "S",
+ "R",
+ "K",
+ "J",
+ "S",
+ }
+ },
+ { "standalone.DayNarrows",
+ new String[] {
+ "A",
+ "I",
+ "S",
+ "R",
+ "K",
+ "J",
+ "S",
+ }
+ },
{ "Eras",
new String[] {
"BCE",
--- a/jdk/src/share/classes/sun/text/resources/mt/FormatData_mt.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/mt/FormatData_mt.java Mon Dec 10 10:52:11 2012 +0900
@@ -103,6 +103,17 @@
"Sib",
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u0126",
+ "T",
+ "T",
+ "E",
+ "\u0126",
+ "\u0120",
+ "S",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"QN",
--- a/jdk/src/share/classes/sun/text/resources/nl/FormatData_nl.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/nl/FormatData_nl.java Mon Dec 10 10:52:11 2012 +0900
@@ -104,6 +104,17 @@
"za" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "Z",
+ "M",
+ "D",
+ "W",
+ "D",
+ "V",
+ "Z",
+ }
+ },
{ "Eras",
new String[] { // era strings for GregorianCalendar
"v. Chr.",
--- a/jdk/src/share/classes/sun/text/resources/pl/FormatData_pl.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/pl/FormatData_pl.java Mon Dec 10 10:52:11 2012 +0900
@@ -121,6 +121,17 @@
"So" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "N",
+ "P",
+ "W",
+ "\u015a",
+ "C",
+ "P",
+ "S",
+ }
+ },
{ "Eras",
new String[] { // era strings
"p.n.e.",
--- a/jdk/src/share/classes/sun/text/resources/pt/FormatData_pt.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/pt/FormatData_pt.java Mon Dec 10 10:52:11 2012 +0900
@@ -104,6 +104,17 @@
"S\u00e1b" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "D",
+ "S",
+ "T",
+ "Q",
+ "Q",
+ "S",
+ "S",
+ }
+ },
{ "NumberElements",
new String[] {
",", // decimal al separator
--- a/jdk/src/share/classes/sun/text/resources/ro/FormatData_ro.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/ro/FormatData_ro.java Mon Dec 10 10:52:11 2012 +0900
@@ -82,6 +82,23 @@
"" // abb month 13 if applicable
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "I",
+ "F",
+ "M",
+ "A",
+ "M",
+ "I",
+ "I",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"duminic\u0103", // Sunday
@@ -104,6 +121,29 @@
"S" // abb Saturday
}
},
+ // commented out DayNarrows because most names are contributed.
+// { "DayNarrows",
+// new String[] {
+// "D",
+// "",
+// "",
+// "",
+// "",
+// "",
+// "",
+// }
+// },
+ { "standalone.DayNarrows",
+ new String[] {
+ "D",
+ "L",
+ "M",
+ "M",
+ "J",
+ "V",
+ "S",
+ }
+ },
{ "Eras",
new String[] { // era strings
"d.C.",
--- a/jdk/src/share/classes/sun/text/resources/ru/FormatData_ru.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/ru/FormatData_ru.java Mon Dec 10 10:52:11 2012 +0900
@@ -138,6 +138,28 @@
"\u0421\u0431" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u0412",
+ "\u041f\u043d",
+ "\u0412\u0442",
+ "\u0421",
+ "\u0427",
+ "\u041f",
+ "\u0421", // contributed item in CLDR
+ }
+ },
+ { "standalone.DayNarrows",
+ new String[] {
+ "\u0412",
+ "\u041f",
+ "\u0412",
+ "\u0421",
+ "\u0427",
+ "\u041f",
+ "\u0421",
+ }
+ },
{ "Eras",
new String[] { // era strings
"\u0434\u043e \u043d.\u044d.",
--- a/jdk/src/share/classes/sun/text/resources/sk/FormatData_sk.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/sk/FormatData_sk.java Mon Dec 10 10:52:11 2012 +0900
@@ -138,6 +138,17 @@
"So" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "N",
+ "P",
+ "U",
+ "S",
+ "\u0160",
+ "P",
+ "S",
+ }
+ },
{ "Eras",
new String[] { // era strings
"pred n.l.",
--- a/jdk/src/share/classes/sun/text/resources/sl/FormatData_sl.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/sl/FormatData_sl.java Mon Dec 10 10:52:11 2012 +0900
@@ -121,6 +121,17 @@
"Sob" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "n",
+ "p",
+ "t",
+ "s",
+ "\u010d",
+ "p",
+ "s",
+ }
+ },
{ "Eras",
new String[] { // era strings
"pr.n.\u0161.",
--- a/jdk/src/share/classes/sun/text/resources/sq/FormatData_sq.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/sq/FormatData_sq.java Mon Dec 10 10:52:11 2012 +0900
@@ -104,6 +104,17 @@
"Sht" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "D",
+ "H",
+ "M",
+ "M",
+ "E",
+ "P",
+ "S",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"PD", // am marker
--- a/jdk/src/share/classes/sun/text/resources/sr/FormatData_sr.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/sr/FormatData_sr.java Mon Dec 10 10:52:11 2012 +0900
@@ -103,12 +103,35 @@
"\u0441\u0443\u0431",
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u043d",
+ "\u043f",
+ "\u0443",
+ "\u0441",
+ "\u0447",
+ "\u043f",
+ "\u0441",
+ }
+ },
{ "Eras",
new String[] {
"\u043f. \u043d. \u0435.",
"\u043d. \u0435",
}
},
+ { "short.Eras",
+ new String[] {
+ "\u043f. \u043d. \u0435.",
+ "\u043d. \u0435.",
+ }
+ },
+ { "narrow.Eras",
+ new String[] {
+ "\u043f.\u043d.\u0435.",
+ "\u043d.\u0435.",
+ }
+ },
{ "NumberPatterns",
new String[] {
"#,##0.###",
--- a/jdk/src/share/classes/sun/text/resources/sv/FormatData_sv.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/sv/FormatData_sv.java Mon Dec 10 10:52:11 2012 +0900
@@ -82,6 +82,23 @@
"" // abb month 13 if applicable
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "J",
+ "F",
+ "M",
+ "A",
+ "M",
+ "J",
+ "J",
+ "A",
+ "S",
+ "O",
+ "N",
+ "D",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"s\u00f6ndag", // Sunday
@@ -104,12 +121,46 @@
"l\u00f6" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "S",
+ "M",
+ "T",
+ "O",
+ "T",
+ "F",
+ "L",
+ }
+ },
+ { "standalone.DayNarrows",
+ new String[] {
+ "S",
+ "M",
+ "T",
+ "O",
+ "T",
+ "F",
+ "L",
+ }
+ },
+ { "narrow.Eras",
+ new String[] {
+ "f.Kr.",
+ "e.Kr.",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"fm", // am marker
"em" // pm marker
}
},
+ { "narrow.AmPmMarkers",
+ new String[] {
+ "f",
+ "e",
+ }
+ },
{ "NumberElements",
new String[] {
",", // decimal separator
--- a/jdk/src/share/classes/sun/text/resources/th/FormatData_th.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/th/FormatData_th.java Mon Dec 10 10:52:11 2012 +0900
@@ -99,6 +99,23 @@
"" // abb month 13 if applicable
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "\u0e21.\u0e04.",
+ "\u0e01.\u0e1e.",
+ "\u0e21\u0e35.\u0e04.",
+ "\u0e40\u0e21.\u0e22.",
+ "\u0e1e.\u0e04.",
+ "\u0e21\u0e34.\u0e22.",
+ "\u0e01.\u0e04.",
+ "\u0e2a.\u0e04.",
+ "\u0e01.\u0e22.",
+ "\u0e15.\u0e04.",
+ "\u0e1e.\u0e22.",
+ "\u0e18.\u0e04.",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c", // Sunday
@@ -121,6 +138,17 @@
"\u0e2a." // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u0e2d",
+ "\u0e08",
+ "\u0e2d",
+ "\u0e1e",
+ "\u0e1e",
+ "\u0e28",
+ "\u0e2a",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07", // am marker
@@ -145,6 +173,12 @@
"\u0e04.\u0e28."
}
},
+ { "narrow.Eras",
+ new String[] {
+ "\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28.",
+ "\u0e04.\u0e28.",
+ }
+ },
{ "buddhist.TimePatterns",
timePatterns
},
--- a/jdk/src/share/classes/sun/text/resources/tr/FormatData_tr.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/tr/FormatData_tr.java Mon Dec 10 10:52:11 2012 +0900
@@ -82,6 +82,23 @@
"" // abb month 13 if applicable
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "O",
+ "\u015e",
+ "M",
+ "N",
+ "M",
+ "H",
+ "T",
+ "A",
+ "E",
+ "E",
+ "K",
+ "A",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"Pazar", // Sunday
@@ -104,6 +121,17 @@
"Cmt" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "P",
+ "P",
+ "S",
+ "\u00c7",
+ "P",
+ "C",
+ "C",
+ }
+ },
{ "NumberPatterns",
new String[] {
"#,##0.###;-#,##0.###", // decimal pattern
--- a/jdk/src/share/classes/sun/text/resources/uk/FormatData_uk.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/uk/FormatData_uk.java Mon Dec 10 10:52:11 2012 +0900
@@ -138,6 +138,17 @@
"\u0441\u0431" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u041d",
+ "\u041f",
+ "\u0412",
+ "\u0421",
+ "\u0427",
+ "\u041f",
+ "\u0421",
+ }
+ },
{ "Eras",
new String[] { // era strings
"\u0434\u043e \u043d.\u0435.",
--- a/jdk/src/share/classes/sun/text/resources/vi/FormatData_vi.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/vi/FormatData_vi.java Mon Dec 10 10:52:11 2012 +0900
@@ -106,6 +106,17 @@
"Th 7" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "CN",
+ "T2",
+ "T3",
+ "T4",
+ "T5",
+ "T6",
+ "T7",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"SA", // am marker
--- a/jdk/src/share/classes/sun/text/resources/zh/FormatData_zh.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/text/resources/zh/FormatData_zh.java Mon Dec 10 10:52:11 2012 +0900
@@ -82,6 +82,23 @@
"" // abb month 13 if applicable
}
},
+ { "standalone.MonthNarrows",
+ new String[] {
+ "1\u6708",
+ "2\u6708",
+ "3\u6708",
+ "4\u6708",
+ "5\u6708",
+ "6\u6708",
+ "7\u6708",
+ "8\u6708",
+ "9\u6708",
+ "10\u6708",
+ "11\u6708",
+ "12\u6708",
+ "",
+ }
+ },
{ "DayNames",
new String[] {
"\u661f\u671f\u65e5", // Sunday
@@ -104,6 +121,17 @@
"\u661f\u671f\u516d" // abb Saturday
}
},
+ { "DayNarrows",
+ new String[] {
+ "\u65e5",
+ "\u4e00",
+ "\u4e8c",
+ "\u4e09",
+ "\u56db",
+ "\u4e94",
+ "\u516d",
+ }
+ },
{ "AmPmMarkers",
new String[] {
"\u4e0a\u5348", // am marker
--- a/jdk/src/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/util/cldr/CLDRLocaleProviderAdapter.java Mon Dec 10 10:52:11 2012 +0900
@@ -89,11 +89,6 @@
}
@Override
- public TimeZoneNameProvider getTimeZoneNameProvider() {
- return null;
- }
-
- @Override
public Locale[] getAvailableLocales() {
Set<String> all = createLanguageTagSet("All");
Locale[] locs = new Locale[all.size()];
--- a/jdk/src/share/classes/sun/util/locale/provider/CalendarDataUtility.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/util/locale/provider/CalendarDataUtility.java Mon Dec 10 10:52:11 2012 +0900
@@ -25,7 +25,6 @@
package sun.util.locale.provider;
-import java.util.Calendar;
import static java.util.Calendar.*;
import java.util.Locale;
import java.util.Map;
--- a/jdk/src/share/classes/sun/util/locale/provider/CalendarNameProviderImpl.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/util/locale/provider/CalendarNameProviderImpl.java Mon Dec 10 10:52:11 2012 +0900
@@ -52,7 +52,7 @@
@Override
public String getDisplayName(String calendarType, int field, int value, int style, Locale locale) {
String name = null;
- String key = getKey(calendarType, field, style);
+ String key = getResourceKey(calendarType, field, style);
if (key != null) {
ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale);
if (rb.containsKey(key)) {
@@ -64,9 +64,10 @@
name = strings[value];
// If name is empty in standalone, try its `format' style.
if (name.length() == 0
- && (style == SHORT_STANDALONE || style == LONG_STANDALONE)) {
+ && (style == SHORT_STANDALONE || style == LONG_STANDALONE
+ || style == NARROW_STANDALONE)) {
name = getDisplayName(calendarType, field, value,
- style == SHORT_STANDALONE ? SHORT_FORMAT : LONG_FORMAT,
+ getBaseStyle(style),
locale);
}
}
@@ -75,15 +76,17 @@
return name;
}
+ private static int[] REST_OF_STYLES = {
+ SHORT_STANDALONE, LONG_FORMAT, LONG_STANDALONE,
+ NARROW_FORMAT, NARROW_STANDALONE
+ };
@Override
public Map<String, Integer> getDisplayNames(String calendarType, int field, int style, Locale locale) {
Map<String, Integer> names;
if (style == ALL_STYLES) {
names = getDisplayNamesImpl(calendarType, field, SHORT_FORMAT, locale);
- if (field != AM_PM) {
- for (int st : new int[] { SHORT_STANDALONE, LONG_FORMAT, LONG_STANDALONE }) {
- names.putAll(getDisplayNamesImpl(calendarType, field, st, locale));
- }
+ for (int st : REST_OF_STYLES) {
+ names.putAll(getDisplayNamesImpl(calendarType, field, st, locale));
}
} else {
// specific style
@@ -94,26 +97,28 @@
private Map<String, Integer> getDisplayNamesImpl(String calendarType, int field,
int style, Locale locale) {
- String key = getKey(calendarType, field, style);
+ String key = getResourceKey(calendarType, field, style);
Map<String, Integer> map = new TreeMap<>(LengthBasedComparator.INSTANCE);
if (key != null) {
ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getDateFormatData(locale);
if (rb.containsKey(key)) {
String[] strings = rb.getStringArray(key);
- if (field == YEAR) {
- if (strings.length > 0) {
- map.put(strings[0], 1);
- }
- } else {
- int base = (field == DAY_OF_WEEK) ? 1 : 0;
- for (int i = 0; i < strings.length; i++) {
- String name = strings[i];
- // Ignore any empty string (some standalone month names
- // are not defined)
- if (name.length() == 0) {
- continue;
+ if (!hasDuplicates(strings)) {
+ if (field == YEAR) {
+ if (strings.length > 0) {
+ map.put(strings[0], 1);
}
- map.put(name, base + i);
+ } else {
+ int base = (field == DAY_OF_WEEK) ? 1 : 0;
+ for (int i = 0; i < strings.length; i++) {
+ String name = strings[i];
+ // Ignore any empty string (some standalone month names
+ // are not defined)
+ if (name.length() == 0) {
+ continue;
+ }
+ map.put(name, base + i);
+ }
}
}
}
@@ -121,6 +126,10 @@
return map;
}
+ private int getBaseStyle(int style) {
+ return style & ~(SHORT_STANDALONE - SHORT_FORMAT);
+ }
+
/**
* Comparator implementation for TreeMap which iterates keys from longest
* to shortest.
@@ -180,55 +189,92 @@
return langtags;
}
- private int getIntData(String key, Locale locale) {
- ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getCalendarData(locale);
- if (rb.containsKey(key)) {
- String firstday = rb.getString(key);
- return Integer.parseInt(firstday);
+ private boolean hasDuplicates(String[] strings) {
+ int len = strings.length;
+ for (int i = 0; i < len - 1; i++) {
+ String a = strings[i];
+ if (a != null) {
+ for (int j = i + 1; j < len; j++) {
+ if (a.equals(strings[j])) {
+ return true;
+ }
+ }
+ }
}
- // Note that the base bundle of CLDR doesn't have the Calendar week parameters.
- return 0;
+ return false;
}
- private String getKey(String type, int field, int style) {
- boolean standalone = (style & 0x8000) != 0;
- style &= ~0x8000;
+ private String getResourceKey(String type, int field, int style) {
+ int baseStyle = getBaseStyle(style);
+ boolean isStandalone = (style != baseStyle);
if ("gregory".equals(type)) {
type = null;
}
-
+ boolean isNarrow = (baseStyle == NARROW_FORMAT);
StringBuilder key = new StringBuilder();
switch (field) {
case ERA:
if (type != null) {
key.append(type).append('.');
}
- if (style == SHORT) {
- key.append("short.");
+ if (isNarrow) {
+ key.append("narrow.");
+ } else {
+ // JRE and CLDR use different resource key conventions
+ // due to historical reasons. (JRE DateFormatSymbols.getEras returns
+ // abbreviations while other getShort*() return abbreviations.)
+ if (this.type == LocaleProviderAdapter.Type.JRE) {
+ if (baseStyle == SHORT) {
+ key.append("short.");
+ }
+ } else { // CLDR
+ if (baseStyle == LONG) {
+ key.append("long.");
+ }
+ }
}
key.append("Eras");
break;
case YEAR:
- key.append(type).append(".FirstYear");
+ if (!isNarrow) {
+ key.append(type).append(".FirstYear");
+ }
break;
case MONTH:
- if (standalone) {
+ if (isStandalone) {
key.append("standalone.");
}
- key.append(style == SHORT ? "MonthAbbreviations" : "MonthNames");
+ key.append("Month").append(toStyleName(baseStyle));
break;
case DAY_OF_WEEK:
- key.append(style == SHORT ? "DayAbbreviations" : "DayNames");
+ // support standalone narrow day names
+ if (isStandalone && isNarrow) {
+ key.append("standalone.");
+ }
+ key.append("Day").append(toStyleName(baseStyle));
break;
case AM_PM:
+ if (isNarrow) {
+ key.append("narrow.");
+ }
key.append("AmPmMarkers");
break;
}
return key.length() > 0 ? key.toString() : null;
}
+
+ private String toStyleName(int baseStyle) {
+ switch (baseStyle) {
+ case SHORT:
+ return "Abbreviations";
+ case NARROW_FORMAT:
+ return "Narrows";
+ }
+ return "Names";
+ }
}
--- a/jdk/src/share/classes/sun/util/locale/provider/LocaleResources.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/util/locale/provider/LocaleResources.java Mon Dec 10 10:52:11 2012 +0900
@@ -46,7 +46,7 @@
import java.util.ResourceBundle;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import sun.util.resources.OpenListResourceBundle;
+import sun.util.resources.TimeZoneNamesBundle;
/**
* Central accessor to locale-dependent resources.
@@ -67,13 +67,13 @@
this.locale = locale;
}
- public OpenListResourceBundle getTimeZoneNames() {
- OpenListResourceBundle tznames = (OpenListResourceBundle) cache.get("TimeZoneNames");
+ public TimeZoneNamesBundle getTimeZoneNames() {
+ TimeZoneNamesBundle tznames = (TimeZoneNamesBundle) cache.get("TimeZoneNames");
if (tznames == null) {
tznames = adapter.getLocaleData().getTimeZoneNames(locale);
- OpenListResourceBundle olrb = (OpenListResourceBundle) cache.putIfAbsent("TimeZoneNames", tznames);
- if (olrb != null) {
- tznames = olrb;
+ TimeZoneNamesBundle tznb = (TimeZoneNamesBundle) cache.putIfAbsent("TimeZoneNames", tznames);
+ if (tznb != null) {
+ tznames = tznb;
}
}
return tznames;
--- a/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java Mon Dec 10 10:52:11 2012 +0900
@@ -604,5 +604,12 @@
assert tznp != null;
return tznp.getDisplayName(ID, daylight, style, locale);
}
+
+ @Override
+ public String getGenericDisplayName(String ID, int style, Locale locale) {
+ TimeZoneNameProvider tznp = getImpl(locale);
+ assert tznp != null;
+ return tznp.getGenericDisplayName(ID, style, locale);
+ }
}
}
--- a/jdk/src/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java Mon Dec 10 10:52:11 2012 +0900
@@ -25,11 +25,14 @@
package sun.util.locale.provider;
+import java.util.LinkedHashSet;
import java.util.Locale;
-import java.util.ResourceBundle;
+import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import java.util.spi.TimeZoneNameProvider;
+import sun.util.calendar.ZoneInfo;
+import sun.util.resources.TimeZoneNamesBundle;
/**
* Concrete implementation of the
@@ -96,21 +99,67 @@
*/
@Override
public String getDisplayName(String id, boolean daylight, int style, Locale locale) {
+ String[] names = getDisplayNameArray(id, 5, locale);
+ if (names != null) {
+ int index = daylight ? 3 : 1;
+ if (style == TimeZone.SHORT) {
+ index++;
+ }
+ return names[index];
+ }
+ return null;
+ }
+
+ @Override
+ public String getGenericDisplayName(String id, int style, Locale locale) {
+ String[] names = getDisplayNameArray(id, 7, locale);
+ if (names != null && names.length >= 7) {
+ return names[(style == TimeZone.LONG) ? 5 : 6];
+ }
+ return null;
+ }
+
+ private String[] getDisplayNameArray(String id, int n, Locale locale) {
if (id == null || locale == null) {
throw new NullPointerException();
}
+ LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type);
+ TimeZoneNamesBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames();
+ return rb.containsKey(id) ? rb.getStringArray(id, n) : null;
+ }
+ /**
+ * Returns a String[][] as the DateFormatSymbols.getZoneStrings() value for
+ * the given locale. This method is package private.
+ *
+ * @param locale a Locale for time zone names
+ * @return an array of time zone names arrays
+ */
+ String[][] getZoneStrings(Locale locale) {
LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type);
- ResourceBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames();
- if (rb.containsKey(id)) {
- String[] names = rb.getStringArray(id);
- int index = daylight ? 3 : 1;
- if (style == TimeZone.SHORT) {
- index++;
+ TimeZoneNamesBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames();
+ Set<String> keyset = rb.keySet();
+ // Use a LinkedHashSet to preseve the order
+ Set<String[]> value = new LinkedHashSet<>();
+ for (String key : keyset) {
+ value.add(rb.getStringArray(key));
+ }
+
+ // Add aliases data for CLDR
+ if (type == LocaleProviderAdapter.Type.CLDR) {
+ // Note: TimeZoneNamesBundle creates a String[] on each getStringArray call.
+ Map<String, String> aliases = ZoneInfo.getAliasTable();
+ for (String alias : aliases.keySet()) {
+ if (!keyset.contains(alias)) {
+ String tzid = aliases.get(alias);
+ if (keyset.contains(tzid)) {
+ String[] val = rb.getStringArray(tzid);
+ val[0] = alias;
+ value.add(val);
+ }
}
- return names[index];
}
-
- return null;
+ }
+ return value.toArray(new String[0][]);
}
}
--- a/jdk/src/share/classes/sun/util/locale/provider/TimeZoneNameUtility.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/util/locale/provider/TimeZoneNameUtility.java Mon Dec 10 10:52:11 2012 +0900
@@ -26,28 +26,28 @@
package sun.util.locale.provider;
import java.lang.ref.SoftReference;
-import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
-import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.spi.TimeZoneNameProvider;
import sun.util.calendar.ZoneInfo;
import sun.util.resources.OpenListResourceBundle;
+import sun.util.resources.TimeZoneNamesBundle;
/**
* Utility class that deals with the localized time zone names
*
* @author Naoto Sato
+ * @author Masayoshi Okutsu
*/
public final class TimeZoneNameUtility {
/**
* cache to hold time zone resource bundles. Keyed by Locale
*/
- private static ConcurrentHashMap<Locale, SoftReference<OpenListResourceBundle>> cachedBundles =
+ private static ConcurrentHashMap<Locale, SoftReference<TimeZoneNamesBundle>> cachedBundles =
new ConcurrentHashMap<>();
/**
@@ -73,15 +73,19 @@
}
private static String[][] loadZoneStrings(Locale locale) {
+ // If the provider is a TimeZoneNameProviderImpl, call its getZoneStrings
+ // in order to avoid per-ID retrieval.
+ LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(TimeZoneNameProvider.class, locale);
+ TimeZoneNameProvider provider = adapter.getTimeZoneNameProvider();
+ if (provider instanceof TimeZoneNameProviderImpl) {
+ return ((TimeZoneNameProviderImpl)provider).getZoneStrings(locale);
+ }
+
+ // Performs per-ID retrieval.
List<String[]> zones = new LinkedList<>();
OpenListResourceBundle rb = getBundle(locale);
- Enumeration<String> keys = rb.getKeys();
- String[] names;
-
- while(keys.hasMoreElements()) {
- String key = keys.nextElement();
-
- names = retrieveDisplayNames(rb, key, locale);
+ for (String key : rb.keySet()) {
+ String[] names = retrieveDisplayNamesImpl(key, locale);
if (names != null) {
zones.add(names);
}
@@ -95,24 +99,50 @@
* Retrieve display names for a time zone ID.
*/
public static String[] retrieveDisplayNames(String id, Locale locale) {
- OpenListResourceBundle rb = getBundle(locale);
- return retrieveDisplayNames(rb, id, locale);
- }
-
- private static String[] retrieveDisplayNames(OpenListResourceBundle rb,
- String id, Locale locale) {
if (id == null || locale == null) {
throw new NullPointerException();
}
+ return retrieveDisplayNamesImpl(id, locale);
+ }
+ /**
+ * Retrieves a generic time zone display name for a time zone ID.
+ *
+ * @param id time zone ID
+ * @param style TimeZone.LONG or TimeZone.SHORT
+ * @param locale desired Locale
+ * @return the requested generic time zone display name, or null if not found.
+ */
+ public static String retrieveGenericDisplayName(String id, int style, Locale locale) {
LocaleServiceProviderPool pool =
LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class);
- return pool.getLocalizedObject(TimeZoneNameGetter.INSTANCE, locale, id);
+ return pool.getLocalizedObject(TimeZoneNameGetter.INSTANCE, locale, "generic", style, id);
}
- private static OpenListResourceBundle getBundle(Locale locale) {
- OpenListResourceBundle rb;
- SoftReference<OpenListResourceBundle> data = cachedBundles.get(locale);
+ /**
+ * Retrieves a standard or daylight-saving time name for the given time zone ID.
+ *
+ * @param id time zone ID
+ * @param daylight true for a daylight saving time name, or false for a standard time name
+ * @param style TimeZone.LONG or TimeZone.SHORT
+ * @param locale desired Locale
+ * @return the requested time zone name, or null if not found.
+ */
+ public static String retrieveDisplayName(String id, boolean daylight, int style, Locale locale) {
+ LocaleServiceProviderPool pool =
+ LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class);
+ return pool.getLocalizedObject(TimeZoneNameGetter.INSTANCE, locale, daylight ? "dst" : "std", style, id);
+ }
+
+ private static String[] retrieveDisplayNamesImpl(String id, Locale locale) {
+ LocaleServiceProviderPool pool =
+ LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class);
+ return pool.getLocalizedObject(TimeZoneNameArrayGetter.INSTANCE, locale, id);
+ }
+
+ private static TimeZoneNamesBundle getBundle(Locale locale) {
+ TimeZoneNamesBundle rb;
+ SoftReference<TimeZoneNamesBundle> data = cachedBundles.get(locale);
if (data == null || ((rb = data.get()) == null)) {
rb = LocaleProviderAdapter.forJRE().getLocaleData().getTimeZoneNames(locale);
@@ -127,19 +157,18 @@
* Obtains a localized time zone strings from a TimeZoneNameProvider
* implementation.
*/
- private static class TimeZoneNameGetter
+ private static class TimeZoneNameArrayGetter
implements LocaleServiceProviderPool.LocalizedObjectGetter<TimeZoneNameProvider,
String[]>{
- private static final TimeZoneNameGetter INSTANCE =
- new TimeZoneNameGetter();
+ private static final TimeZoneNameArrayGetter INSTANCE =
+ new TimeZoneNameArrayGetter();
@Override
public String[] getObject(TimeZoneNameProvider timeZoneNameProvider,
- Locale locale,
- String requestID,
- Object... params) {
+ Locale locale,
+ String requestID,
+ Object... params) {
assert params.length == 0;
- String queryID = requestID;
// First, try to get names with the request ID
String[] names = buildZoneStrings(timeZoneNameProvider, locale, requestID);
@@ -150,21 +179,15 @@
if (aliases != null) {
// Check whether this id is an alias, if so,
// look for the standard id.
- if (aliases.containsKey(queryID)) {
- String prevID = queryID;
- while ((queryID = aliases.get(queryID)) != null) {
- prevID = queryID;
- }
- queryID = prevID;
+ String canonicalID = aliases.get(requestID);
+ if (canonicalID != null) {
+ names = buildZoneStrings(timeZoneNameProvider, locale, canonicalID);
}
-
- names = buildZoneStrings(timeZoneNameProvider, locale, queryID);
-
if (names == null) {
// There may be a case that a standard id has become an
// alias. so, check the aliases backward.
names = examineAliases(timeZoneNameProvider, locale,
- queryID, aliases, aliases.entrySet());
+ canonicalID == null ? requestID : canonicalID, aliases);
}
}
}
@@ -178,20 +201,18 @@
private static String[] examineAliases(TimeZoneNameProvider tznp, Locale locale,
String id,
- Map<String, String> aliases,
- Set<Map.Entry<String, String>> aliasesSet) {
+ Map<String, String> aliases) {
if (aliases.containsValue(id)) {
- for (Map.Entry<String, String> entry : aliasesSet) {
+ for (Map.Entry<String, String> entry : aliases.entrySet()) {
if (entry.getValue().equals(id)) {
String alias = entry.getKey();
String[] names = buildZoneStrings(tznp, locale, alias);
if (names != null) {
return names;
- } else {
- names = examineAliases(tznp, locale, alias, aliases, aliasesSet);
- if (names != null) {
- return names;
- }
+ }
+ names = examineAliases(tznp, locale, alias, aliases);
+ if (names != null) {
+ return names;
}
}
}
@@ -201,7 +222,7 @@
}
private static String[] buildZoneStrings(TimeZoneNameProvider tznp,
- Locale locale, String id) {
+ Locale locale, String id) {
String[] names = new String[5];
for (int i = 1; i <= 4; i ++) {
@@ -220,6 +241,77 @@
}
}
+ private static class TimeZoneNameGetter
+ implements LocaleServiceProviderPool.LocalizedObjectGetter<TimeZoneNameProvider,
+ String> {
+ private static final TimeZoneNameGetter INSTANCE =
+ new TimeZoneNameGetter();
+
+ @Override
+ public String getObject(TimeZoneNameProvider timeZoneNameProvider,
+ Locale locale,
+ String requestID,
+ Object... params) {
+ assert params.length == 2;
+ int style = (int) params[0];
+ String tzid = (String) params[1];
+ String value = getName(timeZoneNameProvider, locale, requestID, style, tzid);
+ if (value == null) {
+ Map<String, String> aliases = ZoneInfo.getAliasTable();
+ if (aliases != null) {
+ String canonicalID = aliases.get(tzid);
+ if (canonicalID != null) {
+ value = getName(timeZoneNameProvider, locale, requestID, style, canonicalID);
+ }
+ if (value == null) {
+ value = examineAliases(timeZoneNameProvider, locale, requestID,
+ canonicalID != null ? canonicalID : tzid, style, aliases);
+ }
+ }
+ }
+
+ return value;
+ }
+
+ private static String examineAliases(TimeZoneNameProvider tznp, Locale locale,
+ String requestID, String tzid, int style,
+ Map<String, String> aliases) {
+ if (aliases.containsValue(tzid)) {
+ for (Map.Entry<String, String> entry : aliases.entrySet()) {
+ if (entry.getValue().equals(tzid)) {
+ String alias = entry.getKey();
+ String name = getName(tznp, locale, requestID, style, alias);
+ if (name != null) {
+ return name;
+ }
+ name = examineAliases(tznp, locale, requestID, alias, style, aliases);
+ if (name != null) {
+ return name;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ private static String getName(TimeZoneNameProvider timeZoneNameProvider,
+ Locale locale, String requestID, int style, String tzid) {
+ String value = null;
+ switch (requestID) {
+ case "std":
+ value = timeZoneNameProvider.getDisplayName(tzid, false, style, locale);
+ break;
+ case "dst":
+ value = timeZoneNameProvider.getDisplayName(tzid, true, style, locale);
+ break;
+ case "generic":
+ value = timeZoneNameProvider.getGenericDisplayName(tzid, style, locale);
+ break;
+ }
+ return value;
+ }
+ }
+
// No instantiation
private TimeZoneNameUtility() {
}
--- a/jdk/src/share/classes/sun/util/resources/LocaleData.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/util/resources/LocaleData.java Mon Dec 10 10:52:11 2012 +0900
@@ -46,9 +46,9 @@
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
+import sun.util.locale.provider.LocaleDataMetaInfo;
import sun.util.locale.provider.LocaleProviderAdapter;
import static sun.util.locale.provider.LocaleProviderAdapter.Type.JRE;
-import sun.util.locale.provider.LocaleDataMetaInfo;
/**
* Provides information about and access to resource bundles in the
@@ -94,8 +94,8 @@
* Gets a time zone names resource bundle, using privileges
* to allow accessing a sun.* package.
*/
- public OpenListResourceBundle getTimeZoneNames(Locale locale) {
- return (OpenListResourceBundle) getBundle(type.getUtilResourcesPackage() + ".TimeZoneNames", locale);
+ public TimeZoneNamesBundle getTimeZoneNames(Locale locale) {
+ return (TimeZoneNamesBundle) getBundle(type.getUtilResourcesPackage() + ".TimeZoneNames", locale);
}
/**
@@ -158,30 +158,33 @@
/* Get the locale string list from LocaleDataMetaInfo class. */
String localeString = LocaleDataMetaInfo.getSupportedLocaleString(baseName);
- if (localeString == null || localeString.length() == 0) {
- return candidates;
- }
-
- for (Iterator<Locale> l = candidates.iterator(); l.hasNext(); ) {
- Locale loc = l.next();
- String lstr;
- if (loc.getScript().length() > 0) {
- lstr = loc.toLanguageTag().replace('-', '_');
- } else {
- lstr = loc.toString();
- int idx = lstr.indexOf("_#");
- if (idx >= 0) {
- lstr = lstr.substring(0, idx);
+ if (localeString != null && localeString.length() != 0) {
+ for (Iterator<Locale> l = candidates.iterator(); l.hasNext();) {
+ Locale loc = l.next();
+ String lstr;
+ if (loc.getScript().length() > 0) {
+ lstr = loc.toLanguageTag().replace('-', '_');
+ } else {
+ lstr = loc.toString();
+ int idx = lstr.indexOf("_#");
+ if (idx >= 0) {
+ lstr = lstr.substring(0, idx);
+ }
+ }
+ /* Every locale string in the locale string list returned from
+ the above getSupportedLocaleString is enclosed
+ within two white spaces so that we could check some locale
+ such as "en".
+ */
+ if (lstr.length() != 0 && localeString.indexOf(" " + lstr + " ") == -1) {
+ l.remove();
}
}
- /* Every locale string in the locale string list returned from
- the above getSupportedLocaleString is enclosed
- within two white spaces so that we could check some locale
- such as "en".
- */
- if (lstr.length() != 0 && localeString.indexOf(" " + lstr + " ") == -1) {
- l.remove();
- }
+ }
+ // Force fallback to Locale.ENGLISH for CLDR time zone names support
+ if (locale.getLanguage() != "en"
+ && baseName.contains(CLDR) && baseName.endsWith("TimeZoneNames")) {
+ candidates.add(candidates.size() - 1, Locale.ENGLISH);
}
return candidates;
}
--- a/jdk/src/share/classes/sun/util/resources/OpenListResourceBundle.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/util/resources/OpenListResourceBundle.java Mon Dec 10 10:52:11 2012 +0900
@@ -67,6 +67,7 @@
}
// Implements java.util.ResourceBundle.handleGetObject; inherits javadoc specification.
+ @Override
public Object handleGetObject(String key) {
if (key == null) {
throw new NullPointerException();
@@ -79,6 +80,7 @@
/**
* Implementation of ResourceBundle.getKeys.
*/
+ @Override
public Enumeration<String> getKeys() {
ResourceBundle parent = this.parent;
return new ResourceBundleEnumeration(handleGetKeys(),
@@ -86,7 +88,8 @@
}
/**
- * Returns a set of keys provided in this resource bundle
+ * Returns a set of keys provided in this resource bundle,
+ * including no parents.
*/
public Set<String> handleGetKeys() {
loadLookupTablesIfNecessary();
@@ -99,7 +102,7 @@
if (keyset != null) {
return keyset;
}
- Set<String> ks = new HashSet<>();
+ Set<String> ks = createSet();
ks.addAll(handleGetKeys());
if (parent != null) {
ks.addAll(parent.keySet());
@@ -113,13 +116,6 @@
}
/**
- * Returns the parent bundle
- */
- public OpenListResourceBundle getParent() {
- return (OpenListResourceBundle)parent;
- }
-
- /**
* See ListResourceBundle class description.
*/
abstract protected Object[][] getContents();
@@ -160,10 +156,14 @@
* Lets subclasses provide specialized Map implementations.
* Default uses HashMap.
*/
- protected Map<String, Object> createMap(int size) {
+ protected <K, V> Map<K, V> createMap(int size) {
return new HashMap<>(size);
}
+ protected <E> Set<E> createSet() {
+ return new HashSet<>();
+ }
+
private volatile Map<String, Object> lookup = null;
private volatile Set<String> keyset;
}
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Mon Dec 10 10:52:11 2012 +0900
@@ -43,160 +43,238 @@
public final class TimeZoneNames extends TimeZoneNamesBundle {
protected final Object[][] getContents() {
+ // Note: generic names came from CLDR with some adjustments.
String ACT[] = new String[] {"Acre Time", "ACT",
- "Acre Summer Time", "ACST"};
+ "Acre Summer Time", "ACST",
+ "Acre Time", "ACT"};
String ADELAIDE[] = new String[] {"Central Standard Time (South Australia)", "CST",
- "Central Summer Time (South Australia)", "CST"};
+ "Central Summer Time (South Australia)", "CST",
+ "Central Time (South Australia)", "CT"};
String AGT[] = new String[] {"Argentine Time", "ART",
- "Argentine Summer Time", "ARST"};
+ "Argentine Summer Time", "ARST",
+ "Argentine Time", "ART"};
String AKST[] = new String[] {"Alaska Standard Time", "AKST",
- "Alaska Daylight Time", "AKDT"};
+ "Alaska Daylight Time", "AKDT",
+ "Alaska Time", "AKT"};
String AMT[] = new String[] {"Amazon Time", "AMT",
- "Amazon Summer Time", "AMST"};
+ "Amazon Summer Time", "AMST",
+ "Amazon Time", "AMT"};
String ARAST[] = new String[] {"Arabia Standard Time", "AST",
- "Arabia Daylight Time", "ADT"};
+ "Arabia Daylight Time", "ADT",
+ "Arabia Time", "AT"};
String ARMT[] = new String[] {"Armenia Time", "AMT",
- "Armenia Summer Time", "AMST"};
+ "Armenia Summer Time", "AMST",
+ "Armenia Time", "AMT"};
String AST[] = new String[] {"Atlantic Standard Time", "AST",
- "Atlantic Daylight Time", "ADT"};
+ "Atlantic Daylight Time", "ADT",
+ "Atlantic Time", "AT"};
String BDT[] = new String[] {"Bangladesh Time", "BDT",
- "Bangladesh Summer Time", "BDST"};
+ "Bangladesh Summer Time", "BDST",
+ "Bangladesh Time", "BDT"};
String BRISBANE[] = new String[] {"Eastern Standard Time (Queensland)", "EST",
- "Eastern Summer Time (Queensland)", "EST"};
+ "Eastern Summer Time (Queensland)", "EST",
+ "Eastern Time (Queensland)", "ET"};
String BROKEN_HILL[] = new String[] {"Central Standard Time (South Australia/New South Wales)", "CST",
- "Central Summer Time (South Australia/New South Wales)", "CST"};
+ "Central Summer Time (South Australia/New South Wales)", "CST",
+ "Central Time (South Australia/New South Wales)", "CT"};
String BRT[] = new String[] {"Brasilia Time", "BRT",
- "Brasilia Summer Time", "BRST"};
+ "Brasilia Summer Time", "BRST",
+ "Brasilia Time", "BRT"};
String BTT[] = new String[] {"Bhutan Time", "BTT",
- "Bhutan Summer Time", "BTST"};
+ "Bhutan Summer Time", "BTST",
+ "Bhutan Time", "BTT"};
String CAT[] = new String[] {"Central African Time", "CAT",
- "Central African Summer Time", "CAST"};
+ "Central African Summer Time", "CAST",
+ "Central Africa Time", "CAT"};
String CET[] = new String[] {"Central European Time", "CET",
- "Central European Summer Time", "CEST"};
+ "Central European Summer Time", "CEST",
+ "Central European Time", "CET"};
String CHAST[] = new String[] {"Chatham Standard Time", "CHAST",
- "Chatham Daylight Time", "CHADT"};
+ "Chatham Daylight Time", "CHADT",
+ "Chatham Time", "CHAT"};
String CHUT[] = new String[] {"Chuuk Time", "CHUT",
- "Chuuk Summer Time", "CHUST"};
+ "Chuuk Summer Time", "CHUST",
+ "Chuuk Time", "CHUT"};
String CIT[] = new String[] {"Central Indonesia Time", "CIT",
- "Central Indonesia Summer Time", "CIST"};
+ "Central Indonesia Summer Time", "CIST",
+ "Central Indonesia Time", "CIT"};
String CLT[] = new String[] {"Chile Time", "CLT",
- "Chile Summer Time", "CLST"};
+ "Chile Summer Time", "CLST",
+ "Chile Time", "CLT"};
String CST[] = new String[] {"Central Standard Time", "CST",
- "Central Daylight Time", "CDT"};
+ "Central Daylight Time", "CDT",
+ "Central Time", "CT"};
String CTT[] = new String[] {"China Standard Time", "CST",
- "China Daylight Time", "CDT"};
+ "China Daylight Time", "CDT",
+ "China Time", "CT"};
String CUBA[] = new String[] {"Cuba Standard Time", "CST",
- "Cuba Daylight Time", "CDT"};
+ "Cuba Daylight Time", "CDT",
+ "Cuba Time", "CT"};
String DARWIN[] = new String[] {"Central Standard Time (Northern Territory)", "CST",
- "Central Summer Time (Northern Territory)", "CST"};
+ "Central Summer Time (Northern Territory)", "CST",
+ "Central Time (Northern Territory)", "CT"};
String DUBLIN[] = new String[] {"Greenwich Mean Time", "GMT",
- "Irish Summer Time", "IST"};
+ "Irish Summer Time", "IST",
+ "Irish Time", "IT"};
String EAT[] = new String[] {"Eastern African Time", "EAT",
- "Eastern African Summer Time", "EAST"};
+ "Eastern African Summer Time", "EAST",
+ "Eastern Africa Time", "EAT"};
String EASTER[] = new String[] {"Easter Is. Time", "EAST",
- "Easter Is. Summer Time", "EASST"};
+ "Easter Is. Summer Time", "EASST",
+ "Easter Is. Time", "EAST"};
String EET[] = new String[] {"Eastern European Time", "EET",
- "Eastern European Summer Time", "EEST"};
+ "Eastern European Summer Time", "EEST",
+ "Eastern European Time", "EET"};
String EGT[] = new String[] {"Eastern Greenland Time", "EGT",
- "Eastern Greenland Summer Time", "EGST"};
+ "Eastern Greenland Summer Time", "EGST",
+ "Eastern Greenland Time", "EGT"};
String EST[] = new String[] {"Eastern Standard Time", "EST",
- "Eastern Daylight Time", "EDT"};
+ "Eastern Daylight Time", "EDT",
+ "Eastern Time", "ET"};
String EST_NSW[] = new String[] {"Eastern Standard Time (New South Wales)", "EST",
- "Eastern Summer Time (New South Wales)", "EST"};
+ "Eastern Summer Time (New South Wales)", "EST",
+ "Eastern Time (New South Wales)", "ET"};
String FET[] = new String[] {"Further-eastern European Time", "FET",
- "Further-eastern European Summer Time", "FEST"};
+ "Further-eastern European Summer Time", "FEST",
+ "Further-eastern European Time", "FET"};
String GHMT[] = new String[] {"Ghana Mean Time", "GMT",
- "Ghana Summer Time", "GHST"};
+ "Ghana Summer Time", "GHST",
+ "Ghana Mean Time", "GMT"};
String GAMBIER[] = new String[] {"Gambier Time", "GAMT",
- "Gambier Summer Time", "GAMST"};
+ "Gambier Summer Time", "GAMST",
+ "Gambier Time", "GAMT"};
String GMT[] = new String[] {"Greenwich Mean Time", "GMT",
+ "Greenwich Mean Time", "GMT",
"Greenwich Mean Time", "GMT"};
String GMTBST[] = new String[] {"Greenwich Mean Time", "GMT",
- "British Summer Time", "BST"};
+ "British Summer Time", "BST",
+ "British Time", "BT"};
String GST[] = new String[] {"Gulf Standard Time", "GST",
- "Gulf Daylight Time", "GDT"};
+ "Gulf Daylight Time", "GDT",
+ "Gulf Time", "GT"};
String HAST[] = new String[] {"Hawaii-Aleutian Standard Time", "HAST",
- "Hawaii-Aleutian Daylight Time", "HADT"};
+ "Hawaii-Aleutian Daylight Time", "HADT",
+ "Hawaii-Aleutian Time", "HAT"};
String HKT[] = new String[] {"Hong Kong Time", "HKT",
- "Hong Kong Summer Time", "HKST"};
+ "Hong Kong Summer Time", "HKST",
+ "Hong Kong Time", "HKT"};
String HST[] = new String[] {"Hawaii Standard Time", "HST",
- "Hawaii Daylight Time", "HDT"};
+ "Hawaii Daylight Time", "HDT",
+ "Hawaii Time", "HT"};
String ICT[] = new String[] {"Indochina Time", "ICT",
- "Indochina Summer Time", "ICST"};
+ "Indochina Summer Time", "ICST",
+ "Indochina Time", "ICT"};
String IRT[] = new String[] {"Iran Standard Time", "IRST",
- "Iran Daylight Time", "IRDT"};
+ "Iran Daylight Time", "IRDT",
+ "Iran Time", "IRT"};
String ISRAEL[] = new String[] {"Israel Standard Time", "IST",
- "Israel Daylight Time", "IDT"};
+ "Israel Daylight Time", "IDT",
+ "Israel Time", "IT"};
String IST[] = new String[] {"India Standard Time", "IST",
- "India Daylight Time", "IDT"};
+ "India Daylight Time", "IDT",
+ "India Time", "IT"};
String JST[] = new String[] {"Japan Standard Time", "JST",
- "Japan Daylight Time", "JDT"};
+ "Japan Daylight Time", "JDT",
+ "Japan Time", "JT"};
String KST[] = new String[] {"Korea Standard Time", "KST",
- "Korea Daylight Time", "KDT"};
+ "Korea Daylight Time", "KDT",
+ "Korea Time", "KT"};
String LORD_HOWE[] = new String[] {"Lord Howe Standard Time", "LHST",
- "Lord Howe Summer Time", "LHST"};
+ "Lord Howe Summer Time", "LHST",
+ "Lord Howe Time", "LHT"};
String MHT[] = new String[] {"Marshall Islands Time", "MHT",
- "Marshall Islands Summer Time", "MHST"};
+ "Marshall Islands Summer Time", "MHST",
+ "Marshall Islands Time", "MHT"};
String MSK[] = new String[] {"Moscow Standard Time", "MSK",
- "Moscow Daylight Time", "MSD"};
+ "Moscow Daylight Time", "MSD",
+ "Moscow Time", "MT"};
String MST[] = new String[] {"Mountain Standard Time", "MST",
- "Mountain Daylight Time", "MDT"};
+ "Mountain Daylight Time", "MDT",
+ "Mountain Time", "MT"};
String MYT[] = new String[] {"Malaysia Time", "MYT",
- "Malaysia Summer Time", "MYST"};
+ "Malaysia Summer Time", "MYST",
+ "Malaysia Time", "MYT"};
String NORONHA[] = new String[] {"Fernando de Noronha Time", "FNT",
- "Fernando de Noronha Summer Time", "FNST"};
+ "Fernando de Noronha Summer Time", "FNST",
+ "Fernando de Noronha Time", "FNT"};
String NOVT[] = new String[] {"Novosibirsk Time", "NOVT",
- "Novosibirsk Summer Time", "NOVST"};
+ "Novosibirsk Summer Time", "NOVST",
+ "Novosibirsk Time", "NOVT"};
String NPT[] = new String[] {"Nepal Time", "NPT",
- "Nepal Summer Time", "NPST"};
+ "Nepal Summer Time", "NPST",
+ "Nepal Time", "NPT"};
String NST[] = new String[] {"Newfoundland Standard Time", "NST",
- "Newfoundland Daylight Time", "NDT"};
+ "Newfoundland Daylight Time", "NDT",
+ "Newfoundland Time", "NT"};
String NZST[] = new String[] {"New Zealand Standard Time", "NZST",
- "New Zealand Daylight Time", "NZDT"};
+ "New Zealand Daylight Time", "NZDT",
+ "New Zealand Time", "NZT"};
String PITCAIRN[] = new String[] {"Pitcairn Standard Time", "PST",
- "Pitcairn Daylight Time", "PDT"};
+ "Pitcairn Daylight Time", "PDT",
+ "Pitcairn Time", "PT"};
String PKT[] = new String[] {"Pakistan Time", "PKT",
- "Pakistan Summer Time", "PKST"};
+ "Pakistan Summer Time", "PKST",
+ "Pakistan Time", "PKT"};
String PONT[] = new String[] {"Pohnpei Time", "PONT",
- "Pohnpei Summer Time", "PONST"};
+ "Pohnpei Summer Time", "PONST",
+ "Ponape Time", "PONT"};
String PST[] = new String[] {"Pacific Standard Time", "PST",
- "Pacific Daylight Time", "PDT"};
+ "Pacific Daylight Time", "PDT",
+ "Pacific Time", "PT"};
String SAST[] = new String[] {"South Africa Standard Time", "SAST",
- "South Africa Summer Time", "SAST"};
+ "South Africa Summer Time", "SAST",
+ "South Africa Time", "SAT"};
String SBT[] = new String[] {"Solomon Is. Time", "SBT",
- "Solomon Is. Summer Time", "SBST"};
+ "Solomon Is. Summer Time", "SBST",
+ "Solomon Is. Time", "SBT"};
String SGT[] = new String[] {"Singapore Time", "SGT",
- "Singapore Summer Time", "SGST"};
+ "Singapore Summer Time", "SGST",
+ "Singapore Time", "SGT"};
String SLST[] = new String[] {"Greenwich Mean Time", "GMT",
- "Sierra Leone Summer Time", "SLST"};
+ "Sierra Leone Summer Time", "SLST",
+ "Sierra Leone Time", "SLT"};
String TASMANIA[] = new String[] {"Eastern Standard Time (Tasmania)", "EST",
- "Eastern Summer Time (Tasmania)", "EST"};
+ "Eastern Summer Time (Tasmania)", "EST",
+ "Eastern Time (Tasmania)", "ET"};
String TMT[] = new String[] {"Turkmenistan Time", "TMT",
- "Turkmenistan Summer Time", "TMST"};
+ "Turkmenistan Summer Time", "TMST",
+ "Turkmenistan Time", "TMT"};
String ULAT[]= new String[] {"Ulaanbaatar Time", "ULAT",
- "Ulaanbaatar Summer Time", "ULAST"};
+ "Ulaanbaatar Summer Time", "ULAST",
+ "Ulaanbaatar Time", "ULAT"};
String WART[] = new String[] {"Western Argentine Time", "WART",
- "Western Argentine Summer Time", "WARST"};
+ "Western Argentine Summer Time", "WARST",
+ "Western Argentine Time", "WART"};
String WAT[] = new String[] {"Western African Time", "WAT",
- "Western African Summer Time", "WAST"};
+ "Western African Summer Time", "WAST",
+ "Western African Time", "WAT"};
String WET[] = new String[] {"Western European Time", "WET",
- "Western European Summer Time", "WEST"};
+ "Western European Summer Time", "WEST",
+ "Western European Time", "WET"};
String WIT[] = new String[] {"West Indonesia Time", "WIT",
- "West Indonesia Summer Time", "WIST"};
+ "West Indonesia Summer Time", "WIST",
+ "West Indonesia Time", "WIT"};
String WST_AUS[] = new String[] {"Western Standard Time (Australia)", "WST",
- "Western Summer Time (Australia)", "WST"};
+ "Western Summer Time (Australia)", "WST",
+ "Western Time (Australia)", "WT"};
String SAMOA[] = new String[] {"Samoa Standard Time", "SST",
- "Samoa Daylight Time", "SDT"};
+ "Samoa Daylight Time", "SDT",
+ "Samoa Time", "ST"};
String WST_SAMOA[] = new String[] {"West Samoa Time", "WST",
- "West Samoa Daylight Time", "WSDT"};
+ "West Samoa Daylight Time", "WSDT",
+ "West Samoa Time", "WST"};
String ChST[] = new String[] {"Chamorro Standard Time", "ChST",
- "Chamorro Daylight Time", "ChDT"};
+ "Chamorro Daylight Time", "ChDT",
+ "Chamorro Time", "ChT"};
String VICTORIA[] = new String[] {"Eastern Standard Time (Victoria)", "EST",
- "Eastern Summer Time (Victoria)", "EST"};
+ "Eastern Summer Time (Victoria)", "EST",
+ "Eastern Time (Victoria)", "ET"};
String UTC[] = new String[] {"Coordinated Universal Time", "UTC",
+ "Coordinated Universal Time", "UTC",
"Coordinated Universal Time", "UTC"};
String UZT[] = new String[] {"Uzbekistan Time", "UZT",
- "Uzbekistan Summer Time", "UZST"};
+ "Uzbekistan Summer Time", "UZST",
+ "Uzbekistan Time", "UZT"};
return new Object[][] {
{"America/Los_Angeles", PST},
@@ -309,7 +387,8 @@
{"America/Argentina/Ushuaia", AGT},
{"America/Aruba", AST},
{"America/Asuncion", new String[] {"Paraguay Time", "PYT",
- "Paraguay Summer Time", "PYST"}},
+ "Paraguay Summer Time", "PYST",
+ "Paraguay Time", "PYT"}},
{"America/Atikokan", EST},
{"America/Atka", HAST},
{"America/Bahia", BRT},
@@ -320,17 +399,20 @@
{"America/Blanc-Sablon", AST},
{"America/Boa_Vista", AMT},
{"America/Bogota", new String[] {"Colombia Time", "COT",
- "Colombia Summer Time", "COST"}},
+ "Colombia Summer Time", "COST",
+ "Colombia Time", "COT"}},
{"America/Boise", MST},
{"America/Buenos_Aires", AGT},
{"America/Cambridge_Bay", MST},
{"America/Campo_Grande", AMT},
{"America/Cancun", CST},
{"America/Caracas", new String[] {"Venezuela Time", "VET",
- "Venezuela Summer Time", "VEST"}},
+ "Venezuela Summer Time", "VEST",
+ "Venezuela Time", "VET"}},
{"America/Catamarca", AGT},
{"America/Cayenne", new String[] {"French Guiana Time", "GFT",
- "French Guiana Summer Time", "GFST"}},
+ "French Guiana Summer Time", "GFST",
+ "French Guiana Time", "GFT"}},
{"America/Cayman", EST},
{"America/Chihuahua", MST},
{"America/Creston", MST},
@@ -352,16 +434,19 @@
{"America/Fortaleza", BRT},
{"America/Glace_Bay", AST},
{"America/Godthab", new String[] {"Western Greenland Time", "WGT",
- "Western Greenland Summer Time", "WGST"}},
+ "Western Greenland Summer Time", "WGST",
+ "Western Greenland Time", "WGT"}},
{"America/Goose_Bay", AST},
{"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
{"America/Guayaquil", new String[] {"Ecuador Time", "ECT",
- "Ecuador Summer Time", "ECST"}},
+ "Ecuador Summer Time", "ECST",
+ "Ecuador Time", "ECT"}},
{"America/Guyana", new String[] {"Guyana Time", "GYT",
- "Guyana Summer Time", "GYST"}},
+ "Guyana Summer Time", "GYST",
+ "Guyana Time", "GYT"}},
{"America/Havana", CUBA},
{"America/Hermosillo", MST},
{"America/Indiana/Indianapolis", EST},
@@ -382,9 +467,11 @@
{"America/Knox_IN", CST},
{"America/Kralendijk", AST},
{"America/La_Paz", new String[] {"Bolivia Time", "BOT",
- "Bolivia Summer Time", "BOST"}},
+ "Bolivia Summer Time", "BOST",
+ "Bolivia Time", "BOT"}},
{"America/Lima", new String[] {"Peru Time", "PET",
- "Peru Summer Time", "PEST"}},
+ "Peru Summer Time", "PEST",
+ "Peru Time", "PET"}},
{"America/Louisville", EST},
{"America/Lower_Princes", AST},
{"America/Maceio", BRT},
@@ -398,13 +485,16 @@
{"America/Menominee", CST},
{"America/Merida", CST},
{"America/Metlakatla", new String[] {"Metlakatla Standard Time", "MeST",
- "Metlakatla Daylight Time", "MeDT"}},
+ "Metlakatla Daylight Time", "MeDT",
+ "Metlakatla Time", "MeT"}},
{"America/Mexico_City", CST},
{"America/Miquelon", new String[] {"Pierre & Miquelon Standard Time", "PMST",
- "Pierre & Miquelon Daylight Time", "PMDT"}},
+ "Pierre & Miquelon Daylight Time", "PMDT",
+ "Pierre & Miquelon Time", "PMT"}},
{"America/Moncton", AST},
{"America/Montevideo", new String[] {"Uruguay Time", "UYT",
- "Uruguay Summer Time", "UYST"}},
+ "Uruguay Summer Time", "UYST",
+ "Uruguay Time", "UYT"}},
{"America/Monterrey", CST},
{"America/Montreal", EST},
{"America/Montserrat", AST},
@@ -419,7 +509,8 @@
{"America/Panama", EST},
{"America/Pangnirtung", EST},
{"America/Paramaribo", new String[] {"Suriname Time", "SRT",
- "Suriname Summer Time", "SRST"}},
+ "Suriname Summer Time", "SRST",
+ "Suriname Time", "SRT"}},
{"America/Port-au-Prince", EST},
{"America/Port_of_Spain", AST},
{"America/Porto_Acre", AMT},
@@ -459,113 +550,143 @@
{"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS},
{"Antarctica/Davis", new String[] {"Davis Time", "DAVT",
- "Davis Summer Time", "DAVST"}},
+ "Davis Summer Time", "DAVST",
+ "Davis Time", "DAVT"}},
{"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Time", "DDUT",
- "Dumont-d'Urville Summer Time", "DDUST"}},
+ "Dumont-d'Urville Summer Time", "DDUST",
+ "Dumont-d'Urville Time", "DDUT"}},
{"Antarctica/Macquarie", new String[] {"Macquarie Island Time", "MIST",
- "Macquarie Island Summer Time", "MIST"}},
+ "Macquarie Island Summer Time", "MIST",
+ "Macquarie Island Time", "MIST"}},
{"Antarctica/Mawson", new String[] {"Mawson Time", "MAWT",
- "Mawson Summer Time", "MAWST"}},
+ "Mawson Summer Time", "MAWST",
+ "Mawson Time", "MAWT"}},
{"Antarctica/McMurdo", NZST},
{"Antarctica/Palmer", CLT},
{"Antarctica/Rothera", new String[] {"Rothera Time", "ROTT",
- "Rothera Summer Time", "ROTST"}},
+ "Rothera Summer Time", "ROTST",
+ "Rothera Time", "ROTT"}},
{"Antarctica/South_Pole", NZST},
{"Antarctica/Syowa", new String[] {"Syowa Time", "SYOT",
- "Syowa Summer Time", "SYOST"}},
+ "Syowa Summer Time", "SYOST",
+ "Syowa Time", "SYOT"}},
{"Antarctica/Vostok", new String[] {"Vostok Time", "VOST",
- "Vostok Summer Time", "VOSST"}},
+ "Vostok Summer Time", "VOSST",
+ "Vostok Time", "VOST"}},
{"Arctic/Longyearbyen", CET},
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"Alma-Ata Time", "ALMT",
- "Alma-Ata Summer Time", "ALMST"}},
+ "Alma-Ata Summer Time", "ALMST",
+ "Alma-Ata Time", "ALMT"}},
{"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"Anadyr Time", "ANAT",
- "Anadyr Summer Time", "ANAST"}},
+ "Anadyr Summer Time", "ANAST",
+ "Anadyr Time", "ANAT"}},
{"Asia/Aqtau", new String[] {"Aqtau Time", "AQTT",
- "Aqtau Summer Time", "AQTST"}},
+ "Aqtau Summer Time", "AQTST",
+ "Aqtau Time", "AQTT"}},
{"Asia/Aqtobe", new String[] {"Aqtobe Time", "AQTT",
- "Aqtobe Summer Time", "AQTST"}},
+ "Aqtobe Summer Time", "AQTST",
+ "Aqtobe Time", "AQTT"}},
{"Asia/Ashgabat", TMT},
{"Asia/Ashkhabad", TMT},
{"Asia/Baghdad", ARAST},
{"Asia/Bahrain", ARAST},
{"Asia/Baku", new String[] {"Azerbaijan Time", "AZT",
- "Azerbaijan Summer Time", "AZST"}},
+ "Azerbaijan Summer Time", "AZST",
+ "Azerbaijan Time", "AZT"}},
{"Asia/Bangkok", ICT},
{"Asia/Beirut", EET},
{"Asia/Bishkek", new String[] {"Kirgizstan Time", "KGT",
- "Kirgizstan Summer Time", "KGST"}},
+ "Kirgizstan Summer Time", "KGST",
+ "Kirgizstan Time", "KGT"}},
{"Asia/Brunei", new String[] {"Brunei Time", "BNT",
- "Brunei Summer Time", "BNST"}},
+ "Brunei Summer Time", "BNST",
+ "Brunei Time", "BNT"}},
{"Asia/Calcutta", IST},
{"Asia/Choibalsan", new String[] {"Choibalsan Time", "CHOT",
- "Choibalsan Summer Time", "CHOST"}},
+ "Choibalsan Summer Time", "CHOST",
+ "Choibalsan Time", "CHOT"}},
{"Asia/Chongqing", CTT},
{"Asia/Chungking", CTT},
{"Asia/Colombo", IST},
{"Asia/Dacca", BDT},
{"Asia/Dhaka", BDT},
{"Asia/Dili", new String[] {"Timor-Leste Time", "TLT",
- "Timor-Leste Summer Time", "TLST"}},
+ "Timor-Leste Summer Time", "TLST",
+ "Timor-Leste Time", "TLT"}},
{"Asia/Damascus", EET},
{"Asia/Dubai", GST},
{"Asia/Dushanbe", new String[] {"Tajikistan Time", "TJT",
- "Tajikistan Summer Time", "TJST"}},
+ "Tajikistan Summer Time", "TJST",
+ "Tajikistan Time", "TJT"}},
{"Asia/Gaza", EET},
{"Asia/Harbin", CTT},
{"Asia/Hebron", EET},
{"Asia/Ho_Chi_Minh", ICT},
{"Asia/Hong_Kong", HKT},
{"Asia/Hovd", new String[] {"Hovd Time", "HOVT",
- "Hovd Summer Time", "HOVST"}},
+ "Hovd Summer Time", "HOVST",
+ "Hovd Time", "HOVT"}},
{"Asia/Irkutsk", new String[] {"Irkutsk Time", "IRKT",
- "Irkutsk Summer Time", "IRKST"}},
+ "Irkutsk Summer Time", "IRKST",
+ "Irkutsk Time", "IRKT"}},
{"Asia/Istanbul", EET},
{"Asia/Jakarta", WIT},
{"Asia/Jayapura", new String[] {"East Indonesia Time", "EIT",
- "East Indonesia Summer Time", "EIST"}},
+ "East Indonesia Summer Time", "EIST",
+ "East Indonesia Time", "EIT"}},
{"Asia/Kabul", new String[] {"Afghanistan Time", "AFT",
- "Afghanistan Summer Time", "AFST"}},
+ "Afghanistan Summer Time", "AFST",
+ "Afghanistan Time", "AFT"}},
{"Asia/Kamchatka", new String[] {"Petropavlovsk-Kamchatski Time", "PETT",
- "Petropavlovsk-Kamchatski Summer Time", "PETST"}},
+ "Petropavlovsk-Kamchatski Summer Time", "PETST",
+ "Petropavlovsk-Kamchatski Time", "PETT"}},
{"Asia/Karachi", PKT},
{"Asia/Kashgar", CTT},
{"Asia/Kathmandu", NPT},
{"Asia/Katmandu", NPT},
{"Asia/Kolkata", IST},
{"Asia/Krasnoyarsk", new String[] {"Krasnoyarsk Time", "KRAT",
- "Krasnoyarsk Summer Time", "KRAST"}},
+ "Krasnoyarsk Summer Time", "KRAST",
+ "Krasnoyarsk Time", "KRAT"}},
{"Asia/Kuala_Lumpur", MYT},
{"Asia/Kuching", MYT},
{"Asia/Kuwait", ARAST},
{"Asia/Macao", CTT},
{"Asia/Macau", CTT},
{"Asia/Magadan", new String[] {"Magadan Time", "MAGT",
- "Magadan Summer Time", "MAGST"}},
+ "Magadan Summer Time", "MAGST",
+ "Magadan Time", "MAGT"}},
{"Asia/Makassar", CIT},
{"Asia/Manila", new String[] {"Philippines Time", "PHT",
- "Philippines Summer Time", "PHST"}},
+ "Philippines Summer Time", "PHST",
+ "Philippines Time", "PHT"}},
{"Asia/Muscat", GST},
{"Asia/Nicosia", EET},
{"Asia/Novokuznetsk", NOVT},
{"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"Oral Time", "ORAT",
- "Oral Summer Time", "ORAST"}},
+ "Oral Summer Time", "ORAST",
+ "Oral Time", "ORAT"}},
{"Asia/Omsk", new String[] {"Omsk Time", "OMST",
- "Omsk Summer Time", "OMSST"}},
+ "Omsk Summer Time", "OMSST",
+ "Omsk Time", "OMST"}},
{"Asia/Phnom_Penh", ICT},
{"Asia/Pontianak", WIT},
{"Asia/Pyongyang", KST},
{"Asia/Qatar", ARAST},
{"Asia/Qyzylorda", new String[] {"Qyzylorda Time", "QYZT",
- "Qyzylorda Summer Time", "QYZST"}},
+ "Qyzylorda Summer Time", "QYZST",
+ "Qyzylorda Time", "QYZT"}},
{"Asia/Rangoon", new String[] {"Myanmar Time", "MMT",
- "Myanmar Summer Time", "MMST"}},
+ "Myanmar Summer Time", "MMST",
+ "Myanmar Time", "MMT"}},
{"Asia/Riyadh", ARAST},
{"Asia/Saigon", ICT},
{"Asia/Sakhalin", new String[] {"Sakhalin Time", "SAKT",
- "Sakhalin Summer Time", "SAKST"}},
+ "Sakhalin Summer Time", "SAKST",
+ "Sakhalin Time", "SAKT"}},
{"Asia/Samarkand", UZT},
{"Asia/Seoul", KST},
{"Asia/Singapore", SGT},
@@ -573,7 +694,8 @@
{"Asia/Tel_Aviv", ISRAEL},
{"Asia/Tashkent", UZT},
{"Asia/Tbilisi", new String[] {"Georgia Time", "GET",
- "Georgia Summer Time", "GEST"}},
+ "Georgia Summer Time", "GEST",
+ "Georgia Time", "GET"}},
{"Asia/Tehran", IRT},
{"Asia/Thimbu", BTT},
{"Asia/Thimphu", BTT},
@@ -583,28 +705,35 @@
{"Asia/Urumqi", CTT},
{"Asia/Vientiane", ICT},
{"Asia/Vladivostok", new String[] {"Vladivostok Time", "VLAT",
- "Vladivostok Summer Time", "VLAST"}},
+ "Vladivostok Summer Time", "VLAST",
+ "Vladivostok Time", "VLAT"}},
{"Asia/Yakutsk", new String[] {"Yakutsk Time", "YAKT",
- "Yakutsk Summer Time", "YAKST"}},
+ "Yakutsk Summer Time", "YAKST",
+ "Yakutsk Time", "YAKT"}},
{"Asia/Yekaterinburg", new String[] {"Yekaterinburg Time", "YEKT",
- "Yekaterinburg Summer Time", "YEKST"}},
+ "Yekaterinburg Summer Time", "YEKST",
+ "Yekaterinburg Time", "YEKT"}},
{"Asia/Yerevan", ARMT},
{"Atlantic/Azores", new String[] {"Azores Time", "AZOT",
- "Azores Summer Time", "AZOST"}},
+ "Azores Summer Time", "AZOST",
+ "Azores Time", "AZOT"}},
{"Atlantic/Bermuda", AST},
{"Atlantic/Canary", WET},
{"Atlantic/Cape_Verde", new String[] {"Cape Verde Time", "CVT",
- "Cape Verde Summer Time", "CVST"}},
+ "Cape Verde Summer Time", "CVST",
+ "Cape Verde Time", "CVT"}},
{"Atlantic/Faeroe", WET},
{"Atlantic/Faroe", WET},
{"Atlantic/Jan_Mayen", CET},
{"Atlantic/Madeira", WET},
{"Atlantic/Reykjavik", GMT},
{"Atlantic/South_Georgia", new String[] {"South Georgia Standard Time", "GST",
- "South Georgia Daylight Time", "GDT"}},
+ "South Georgia Daylight Time", "GDT",
+ "South Georgia Time", "GT"}},
{"Atlantic/St_Helena", GMT},
{"Atlantic/Stanley", new String[] {"Falkland Is. Time", "FKT",
- "Falkland Is. Summer Time", "FKST"}},
+ "Falkland Is. Summer Time", "FKST",
+ "Falkland Is. Time", "FKT"}},
{"Australia/ACT", EST_NSW},
{"Australia/Adelaide", ADELAIDE},
{"Australia/Brisbane", BRISBANE},
@@ -613,7 +742,8 @@
{"Australia/Currie", EST_NSW},
{"Australia/Darwin", DARWIN},
{"Australia/Eucla", new String[] {"Central Western Standard Time (Australia)", "CWST",
- "Central Western Summer Time (Australia)", "CWST"}},
+ "Central Western Summer Time (Australia)", "CWST",
+ "Central Western Time (Australia)", "CWT"}},
{"Australia/Hobart", TASMANIA},
{"Australia/LHI", LORD_HOWE},
{"Australia/Lindeman", BRISBANE},
@@ -697,7 +827,8 @@
{"Europe/Riga", EET},
{"Europe/Rome", CET},
{"Europe/Samara", new String[] {"Samara Time", "SAMT",
- "Samara Summer Time", "SAMST"}},
+ "Samara Summer Time", "SAMST",
+ "Samara Time", "SAMT"}},
{"Europe/San_Marino", CET},
{"Europe/Sarajevo", CET},
{"Europe/Simferopol", EET},
@@ -713,7 +844,8 @@
{"Europe/Vienna", CET},
{"Europe/Vilnius", EET},
{"Europe/Volgograd", new String[] {"Volgograd Time", "VOLT",
- "Volgograd Summer Time", "VOLST"}},
+ "Volgograd Summer Time", "VOLST",
+ "Volgograd Time", "VOLT"}},
{"Europe/Warsaw", CET},
{"Europe/Zagreb", CET},
{"Europe/Zaporozhye", EET},
@@ -727,30 +859,39 @@
{"IST", IST},
{"Indian/Antananarivo", EAT},
{"Indian/Chagos", new String[] {"Indian Ocean Territory Time", "IOT",
- "Indian Ocean Territory Summer Time", "IOST"}},
+ "Indian Ocean Territory Summer Time", "IOST",
+ "Indian Ocean Territory Time", "IOT"}},
{"Indian/Christmas", new String[] {"Christmas Island Time", "CXT",
- "Christmas Island Summer Time", "CXST"}},
+ "Christmas Island Summer Time", "CXST",
+ "Christmas Island Time", "CIT"}},
{"Indian/Cocos", new String[] {"Cocos Islands Time", "CCT",
- "Cocos Islands Summer Time", "CCST"}},
+ "Cocos Islands Summer Time", "CCST",
+ "Cocos Islands Time", "CCT"}},
{"Indian/Comoro", EAT},
{"Indian/Kerguelen", new String[] {"French Southern & Antarctic Lands Time", "TFT",
- "French Southern & Antarctic Lands Summer Time", "TFST"}},
+ "French Southern & Antarctic Lands Summer Time", "TFST",
+ "French Southern & Antarctic Lands Time", "TFT"}},
{"Indian/Mahe", new String[] {"Seychelles Time", "SCT",
- "Seychelles Summer Time", "SCST"}},
+ "Seychelles Summer Time", "SCST",
+ "Seychelles Time", "SCT"}},
{"Indian/Maldives", new String[] {"Maldives Time", "MVT",
- "Maldives Summer Time", "MVST"}},
+ "Maldives Summer Time", "MVST",
+ "Maldives Time", "MVT"}},
{"Indian/Mauritius", new String[] {"Mauritius Time", "MUT",
- "Mauritius Summer Time", "MUST"}},
+ "Mauritius Summer Time", "MUST",
+ "Mauritius Time", "MUT"}},
{"Indian/Mayotte", EAT},
{"Indian/Reunion", new String[] {"Reunion Time", "RET",
- "Reunion Summer Time", "REST"}},
+ "Reunion Summer Time", "REST",
+ "Reunion Time", "RET"}},
{"Israel", ISRAEL},
{"Jamaica", EST},
{"Japan", JST},
{"Kwajalein", MHT},
{"Libya", EET},
{"MET", new String[] {"Middle Europe Time", "MET",
- "Middle Europe Summer Time", "MEST"}},
+ "Middle Europe Summer Time", "MEST",
+ "Middle Europe Time", "MET"}},
{"Mexico/BajaNorte", PST},
{"Mexico/BajaSur", MST},
{"Mexico/General", CST},
@@ -770,61 +911,82 @@
{"Pacific/Chuuk", CHUT},
{"Pacific/Easter", EASTER},
{"Pacific/Efate", new String[] {"Vanuatu Time", "VUT",
- "Vanuatu Summer Time", "VUST"}},
+ "Vanuatu Summer Time", "VUST",
+ "Vanuatu Time", "VUT"}},
{"Pacific/Enderbury", new String[] {"Phoenix Is. Time", "PHOT",
- "Phoenix Is. Summer Time", "PHOST"}},
+ "Phoenix Is. Summer Time", "PHOST",
+ "Phoenix Is. Time", "PHOT"}},
{"Pacific/Fakaofo", new String[] {"Tokelau Time", "TKT",
- "Tokelau Summer Time", "TKST"}},
+ "Tokelau Summer Time", "TKST",
+ "Tokelau Time", "TKT"}},
{"Pacific/Fiji", new String[] {"Fiji Time", "FJT",
- "Fiji Summer Time", "FJST"}},
+ "Fiji Summer Time", "FJST",
+ "Fiji Time", "FJT"}},
{"Pacific/Funafuti", new String[] {"Tuvalu Time", "TVT",
- "Tuvalu Summer Time", "TVST"}},
+ "Tuvalu Summer Time", "TVST",
+ "Tuvalu Time", "TVT"}},
{"Pacific/Galapagos", new String[] {"Galapagos Time", "GALT",
- "Galapagos Summer Time", "GALST"}},
+ "Galapagos Summer Time", "GALST",
+ "Galapagos Time", "GALT"}},
{"Pacific/Gambier", GAMBIER},
{"Pacific/Guadalcanal", SBT},
{"Pacific/Guam", ChST},
{"Pacific/Johnston", HST},
{"Pacific/Kiritimati", new String[] {"Line Is. Time", "LINT",
- "Line Is. Summer Time", "LINST"}},
+ "Line Is. Summer Time", "LINST",
+ "Line Is. Time", "LINT"}},
{"Pacific/Kosrae", new String[] {"Kosrae Time", "KOST",
- "Kosrae Summer Time", "KOSST"}},
+ "Kosrae Summer Time", "KOSST",
+ "Kosrae Time", "KOST"}},
{"Pacific/Kwajalein", MHT},
{"Pacific/Majuro", MHT},
{"Pacific/Marquesas", new String[] {"Marquesas Time", "MART",
- "Marquesas Summer Time", "MARST"}},
+ "Marquesas Summer Time", "MARST",
+ "Marquesas Time", "MART"}},
{"Pacific/Midway", SAMOA},
{"Pacific/Nauru", new String[] {"Nauru Time", "NRT",
- "Nauru Summer Time", "NRST"}},
+ "Nauru Summer Time", "NRST",
+ "Nauru Time", "NRT"}},
{"Pacific/Niue", new String[] {"Niue Time", "NUT",
- "Niue Summer Time", "NUST"}},
+ "Niue Summer Time", "NUST",
+ "Niue Time", "NUT"}},
{"Pacific/Norfolk", new String[] {"Norfolk Time", "NFT",
- "Norfolk Summer Time", "NFST"}},
+ "Norfolk Summer Time", "NFST",
+ "Norfolk Time", "NFT"}},
{"Pacific/Noumea", new String[] {"New Caledonia Time", "NCT",
- "New Caledonia Summer Time", "NCST"}},
+ "New Caledonia Summer Time", "NCST",
+ "New Caledonia Time", "NCT"}},
{"Pacific/Pago_Pago", SAMOA},
{"Pacific/Palau", new String[] {"Palau Time", "PWT",
- "Palau Summer Time", "PWST"}},
+ "Palau Summer Time", "PWST",
+ "Palau Time", "PWT"}},
{"Pacific/Pitcairn", PITCAIRN},
{"Pacific/Pohnpei", PONT},
{"Pacific/Ponape", PONT},
{"Pacific/Port_Moresby", new String[] {"Papua New Guinea Time", "PGT",
- "Papua New Guinea Summer Time", "PGST"}},
+ "Papua New Guinea Summer Time", "PGST",
+ "Papua New Guinea Time", "PGT"}},
{"Pacific/Rarotonga", new String[] {"Cook Is. Time", "CKT",
- "Cook Is. Summer Time", "CKHST"}},
+ "Cook Is. Summer Time", "CKHST",
+ "Cook Is. Time", "CKT"}},
{"Pacific/Saipan", ChST},
{"Pacific/Samoa", SAMOA},
{"Pacific/Tahiti", new String[] {"Tahiti Time", "TAHT",
- "Tahiti Summer Time", "TAHST"}},
+ "Tahiti Summer Time", "TAHST",
+ "Tahiti Time", "TAHT"}},
{"Pacific/Tarawa", new String[] {"Gilbert Is. Time", "GILT",
- "Gilbert Is. Summer Time", "GILST"}},
+ "Gilbert Is. Summer Time", "GILST",
+ "Gilbert Is. Time", "GILT"}},
{"Pacific/Tongatapu", new String[] {"Tonga Time", "TOT",
- "Tonga Summer Time", "TOST"}},
+ "Tonga Summer Time", "TOST",
+ "Tonga Time", "TOT"}},
{"Pacific/Truk", CHUT},
{"Pacific/Wake", new String[] {"Wake Time", "WAKT",
- "Wake Summer Time", "WAKST"}},
+ "Wake Summer Time", "WAKST",
+ "Wake Time", "WAKT"}},
{"Pacific/Wallis", new String[] {"Wallis & Futuna Time", "WFT",
- "Wallis & Futuna Summer Time", "WFST"}},
+ "Wallis & Futuna Summer Time", "WFST",
+ "Wallis & Futuna Time", "WFT"}},
{"Pacific/Yap", CHUT},
{"Poland", CET},
{"PRC", CTT},
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNamesBundle.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNamesBundle.java Mon Dec 10 10:52:11 2012 +0900
@@ -42,6 +42,9 @@
import java.util.Map;
import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.MissingResourceException;
+import java.util.Set;
/**
* Subclass of <code>ResourceBundle</code> with special
@@ -58,6 +61,26 @@
public abstract class TimeZoneNamesBundle extends OpenListResourceBundle {
/**
+ * Returns a String array containing time zone names. The String array has
+ * at most size elements.
+ *
+ * @param key the time zone ID for which names are obtained
+ * @param size the requested size of array for names
+ * @return a String array containing names
+ */
+ public String[] getStringArray(String key, int size) {
+ String[] names = handleGetObject(key, size);
+ if ((names == null || names.length != size) && parent != null) {
+ names = ((TimeZoneNamesBundle)parent).getStringArray(key, size);
+ }
+ if (names == null) {
+ throw new MissingResourceException("no time zone names", getClass().getName(), key);
+ }
+ return names;
+
+ }
+
+ /**
* Maps time zone IDs to locale-specific names.
* The value returned is an array of five strings:
* <ul>
@@ -71,13 +94,17 @@
* <code>getContents</code> implementations, while the time zone
* ID is inserted into the returned array by this method.
*/
+ @Override
public Object handleGetObject(String key) {
+ return handleGetObject(key, 5);
+ }
+
+ private String[] handleGetObject(String key, int n) {
String[] contents = (String[]) super.handleGetObject(key);
if (contents == null) {
return null;
}
-
- int clen = contents.length;
+ int clen = Math.min(n, contents.length);
String[] tmpobj = new String[clen+1];
tmpobj[0] = key;
System.arraycopy(contents, 0, tmpobj, 1, clen);
@@ -85,14 +112,24 @@
}
/**
- * Use LinkedHashMap to preserve order of bundle entries.
+ * Use LinkedHashMap to preserve the order of bundle entries.
*/
@Override
- protected Map<String, Object> createMap(int size) {
+ protected <K, V> Map<K, V> createMap(int size) {
return new LinkedHashMap<>(size);
}
/**
+ * Use LinkedHashSet to preserve the key order.
+ * @param <E> the type of elements
+ * @return a Set
+ */
+ @Override
+ protected <E> Set<E> createSet() {
+ return new LinkedHashSet<>();
+ }
+
+ /**
* Provides key/value mappings for a specific
* resource bundle. Each entry of the array
* returned must be an array with two elements:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Calendar/GenericTimeZoneNamesTest.java Mon Dec 10 10:52:11 2012 +0900
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2012, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.util.*;
+import sun.util.locale.provider.TimeZoneNameUtility;
+
+public class GenericTimeZoneNamesTest {
+ private static final String[] PT = {
+ "America/Los_Angeles", "US/Pacific", "PST"
+ };
+
+ private static int errors = 0;
+
+ public static void main(String[] args) {
+ for (String tag : args) {
+ Locale locale = Locale.forLanguageTag(tag);
+ for (String tzid : PT) {
+ test(tzid, TimeZone.LONG, locale, "Pacific Time");
+ test(tzid, TimeZone.SHORT, locale, "PT");
+ }
+ }
+
+ if (errors != 0) {
+ throw new RuntimeException("test failed");
+ }
+ }
+
+ private static void test(String tzid, int style, Locale locale, String expected) {
+ // No public API to get generic time zone names (JDK 8)
+ String got = TimeZoneNameUtility.retrieveGenericDisplayName(tzid, style, locale);
+ if (!expected.equals(got)) {
+ System.err.printf("test: tzid=%s, locale=%s, style=%d, got=\"%s\", expected=\"%s\"%n",
+ tzid, locale, style, got, expected);
+ errors++;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Calendar/GenericTimeZoneNamesTest.sh Mon Dec 10 10:52:11 2012 +0900
@@ -0,0 +1,47 @@
+#
+# Copyright (c) 2012, 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.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+# @test
+# @bug 8003267
+# @summary Unit test for generic time zone names support
+# @compile -XDignore.symbol.file GenericTimeZoneNamesTest.java
+# @run shell GenericTimeZoneNamesTest.sh
+
+# This test is locale data-dependent and assumes that both JRE and CLDR
+# have the same geneic time zone names in English.
+
+STATUS=0
+echo "Locale providers: default"
+# TODO: The purpose of ja-JP is to make sure the fallback for generic
+# names works. Remove ja-JP when adding generic names to localized
+# resources.
+if ! ${TESTJAVA}/bin/java -esa -cp "${TESTCLASSES}" GenericTimeZoneNamesTest en-US ja-JP; then
+ STATUS=1
+fi
+
+echo "Locale providers: CLDR"
+if ! ${TESTJAVA}/bin/java -esa -cp "${TESTCLASSES}" -Djava.locale.providers=CLDR GenericTimeZoneNamesTest en-US; then
+ STATUS=1
+fi
+exit ${STATUS}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Calendar/NarrowNamesTest.java Mon Dec 10 10:52:11 2012 +0900
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2012, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.util.*;
+import static java.util.GregorianCalendar.*;
+
+public class NarrowNamesTest {
+ private static final Locale US = Locale.US;
+ private static final Locale JAJPJP = new Locale("ja", "JP", "JP");
+ private static final Locale THTH = new Locale("th", "TH");
+
+ private static final String RESET_INDEX = "RESET_INDEX";
+
+ private static int errors = 0;
+
+ // This test is locale data-dependent.
+ public static void main(String[] args) {
+ test(US, ERA, "B",
+ ERA, BC, YEAR, 1);
+ test(US, ERA, "A",
+ ERA, AD, YEAR, 2012);
+ test(US, DAY_OF_WEEK, "S",
+ YEAR, 2012, MONTH, DECEMBER, DAY_OF_MONTH, 23);
+ test(US, AM_PM, "a",
+ HOUR_OF_DAY, 10);
+ test(US, AM_PM, "p",
+ HOUR_OF_DAY, 23);
+ test(JAJPJP, DAY_OF_WEEK, "\u65e5",
+ YEAR, 24, MONTH, DECEMBER, DAY_OF_MONTH, 23);
+ test(THTH, MONTH, NARROW_STANDALONE, "\u0e18.\u0e04.",
+ YEAR, 2555, MONTH, DECEMBER, DAY_OF_MONTH, 5);
+ test(THTH, DAY_OF_WEEK, "\u0e1e",
+ YEAR, 2555, MONTH, DECEMBER, DAY_OF_MONTH, 5);
+
+ testMap(US, DAY_OF_WEEK, ALL_STYLES, // shouldn't include any narrow names
+ "", // 1-based indexing for DAY_OF_WEEK
+ "Sunday", // Sunday
+ "Monday", // Monday
+ "Tuesday", // Tuesday
+ "Wednesday", // Wednesday
+ "Thursday", // Thursday
+ "Friday", // Friday
+ "Saturday", // Saturday
+ RESET_INDEX,
+ "", // 1-based indexing for DAY_OF_WEEK
+ "Sun", // abb Sunday
+ "Mon", // abb Monday
+ "Tue", // abb Tuesday
+ "Wed", // abb Wednesday
+ "Thu", // abb Thursday
+ "Fri", // abb Friday
+ "Sat" // abb Saturday
+ );
+ testMap(US, DAY_OF_WEEK, NARROW_FORMAT); // expect null
+ testMap(US, AM_PM, ALL_STYLES,
+ "AM", "PM",
+ RESET_INDEX,
+ "a", "p");
+ testMap(JAJPJP, DAY_OF_WEEK, NARROW_STANDALONE); // expect null
+ testMap(JAJPJP, DAY_OF_WEEK, NARROW_FORMAT,
+ "", // 1-based indexing for DAY_OF_WEEK
+ "\u65e5",
+ "\u6708",
+ "\u706b",
+ "\u6c34",
+ "\u6728",
+ "\u91d1",
+ "\u571f");
+ testMap(THTH, MONTH, NARROW_FORMAT); // expect null
+ testMap(THTH, MONTH, NARROW_STANDALONE,
+ "\u0e21.\u0e04.",
+ "\u0e01.\u0e1e.",
+ "\u0e21\u0e35.\u0e04.",
+ "\u0e40\u0e21.\u0e22.",
+ "\u0e1e.\u0e04.",
+ "\u0e21\u0e34.\u0e22.",
+ "\u0e01.\u0e04.",
+ "\u0e2a.\u0e04.",
+ "\u0e01.\u0e22.",
+ "\u0e15.\u0e04.",
+ "\u0e1e.\u0e22.",
+ "\u0e18.\u0e04.");
+
+ if (errors != 0) {
+ throw new RuntimeException("test failed");
+ }
+ }
+
+ private static void test(Locale locale, int field, String expected, int... data) {
+ test(locale, field, NARROW_FORMAT, expected, data);
+ }
+
+ private static void test(Locale locale, int field, int style, String expected, int... fieldValuePairs) {
+ Calendar cal = Calendar.getInstance(locale);
+ cal.clear();
+ for (int i = 0; i < fieldValuePairs.length;) {
+ int f = fieldValuePairs[i++];
+ int v = fieldValuePairs[i++];
+ cal.set(f, v);
+ }
+ String got = cal.getDisplayName(field, style, locale);
+ if (!expected.equals(got)) {
+ System.err.printf("test: locale=%s, field=%d, value=%d, style=%d, got=\"%s\", expected=\"%s\"%n",
+ locale, field, cal.get(field), style, got, expected);
+ errors++;
+ }
+ }
+
+ private static void testMap(Locale locale, int field, int style, String... expected) {
+ Map<String, Integer> expectedMap = null;
+ if (expected.length > 0) {
+ expectedMap = new TreeMap<>(LengthBasedComparator.INSTANCE);
+ int index = 0;
+ for (int i = 0; i < expected.length; i++) {
+ if (expected[i].isEmpty()) {
+ index++;
+ continue;
+ }
+ if (expected[i] == RESET_INDEX) {
+ index = 0;
+ continue;
+ }
+ expectedMap.put(expected[i], index++);
+ }
+ }
+ Calendar cal = Calendar.getInstance(locale);
+ Map<String, Integer> got = cal.getDisplayNames(field, style, locale);
+ if (!(expectedMap == null && got == null)
+ && !expectedMap.equals(got)) {
+ System.err.printf("testMap: locale=%s, field=%d, style=%d, expected=%s, got=%s%n",
+ locale, field, style, expectedMap, got);
+ errors++;
+ }
+ }
+
+ /**
+ * Comparator implementation for TreeMap which iterates keys from longest
+ * to shortest.
+ */
+ private static class LengthBasedComparator implements Comparator<String> {
+ private static final LengthBasedComparator INSTANCE = new LengthBasedComparator();
+
+ private LengthBasedComparator() {
+ }
+
+ @Override
+ public int compare(String o1, String o2) {
+ int n = o2.length() - o1.length();
+ return (n == 0) ? o1.compareTo(o2) : n;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Calendar/NarrowNamesTest.sh Mon Dec 10 10:52:11 2012 +0900
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2012, 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.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+# @test
+# @bug 8000983
+# @summary Unit test for narrow names support
+# @build NarrowNamesTest
+# @run shell NarrowNamesTest.sh
+
+# This test is locale data-dependent and assumes that both JRE and CLDR
+# have the same narrow names.
+
+STATUS=0
+for P in "JRE,SPI" "CLDR"
+do
+ echo "Locale providers: $P"
+ if ! ${TESTJAVA}/bin/java -esa -cp "${TESTCLASSES}" -Djava.locale.providers="${P}" NarrowNamesTest; then
+ STATUS=1
+ fi
+done
+exit ${STATUS}
--- a/jdk/test/java/util/PluggableLocale/GenericTest.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/test/java/util/PluggableLocale/GenericTest.java Mon Dec 10 10:52:11 2012 +0900
@@ -41,6 +41,7 @@
com.bar.CurrencyNameProviderImpl2 currencyNP2 = new com.bar.CurrencyNameProviderImpl2();
com.bar.LocaleNameProviderImpl localeNP = new com.bar.LocaleNameProviderImpl();
com.bar.TimeZoneNameProviderImpl tzNP = new com.bar.TimeZoneNameProviderImpl();
+ com.bar.GenericTimeZoneNameProviderImpl tzGenNP = new com.bar.GenericTimeZoneNameProviderImpl();
com.bar.CalendarDataProviderImpl calDataP = new com.bar.CalendarDataProviderImpl();
com.bar.CalendarNameProviderImpl calNameP = new com.bar.CalendarNameProviderImpl();
@@ -73,6 +74,7 @@
expected.addAll(Arrays.asList(currencyNP2.getAvailableLocales()));
expected.addAll(Arrays.asList(localeNP.getAvailableLocales()));
expected.addAll(Arrays.asList(tzNP.getAvailableLocales()));
+ expected.addAll(Arrays.asList(tzGenNP.getAvailableLocales()));
expected.addAll(Arrays.asList(calDataP.getAvailableLocales()));
expected.addAll(Arrays.asList(calNameP.getAvailableLocales()));
if (!result.equals(expected)) {
--- a/jdk/test/java/util/PluggableLocale/TimeZoneNameProviderTest.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/test/java/util/PluggableLocale/TimeZoneNameProviderTest.java Mon Dec 10 10:52:11 2012 +0900
@@ -40,6 +40,7 @@
TimeZoneNameProviderTest() {
test1();
test2();
+ test3();
aliasTest();
}
@@ -92,6 +93,7 @@
final String pattern = "z";
final Locale OSAKA = new Locale("ja", "JP", "osaka");
final Locale KYOTO = new Locale("ja", "JP", "kyoto");
+ final Locale GENERIC = new Locale("ja", "JP", "generic");
final String[] TIMEZONES = {
"GMT", "America/Los_Angeles", "SystemV/PST8",
@@ -157,6 +159,29 @@
}
}
+ void test3() {
+ final String[] TZNAMES = {
+ LATIME, PST, PST8PDT, US_PACIFIC,
+ TOKYOTIME, JST, JAPAN,
+ };
+ for (String tzname : TZNAMES) {
+ TimeZone tz = TimeZone.getTimeZone(tzname);
+ for (int style : new int[] { TimeZone.LONG, TimeZone.SHORT }) {
+ String osakaStd = tz.getDisplayName(false, style, OSAKA);
+ if (osakaStd != null) {
+ // No API for getting generic time zone names
+ String generic = TimeZoneNameUtility.retrieveGenericDisplayName(tzname,
+ style, GENERIC);
+ String expected = "Generic " + osakaStd;
+ if (!expected.equals(generic)) {
+ throw new RuntimeException("Wrong generic name: got=\"" + generic
+ + "\", expected=\"" + expected + "\"");
+ }
+ }
+ }
+ }
+ }
+
final String LATIME = "America/Los_Angeles";
final String PST = "PST";
final String PST8PDT = "PST8PDT";
--- a/jdk/test/java/util/PluggableLocale/TimeZoneNameProviderTest.sh Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/test/java/util/PluggableLocale/TimeZoneNameProviderTest.sh Mon Dec 10 10:52:11 2012 +0900
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2007, 2012, 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
@@ -23,6 +23,6 @@
#!/bin/sh
#
# @test
-# @bug 4052440
+# @bug 4052440 8003267
# @summary TimeZoneNameProvider tests
# @run shell ExecTest.sh bar TimeZoneNameProviderTest true
Binary file jdk/test/java/util/PluggableLocale/barprovider.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/PluggableLocale/providersrc/GenericTimeZoneNameProviderImpl.java Mon Dec 10 10:52:11 2012 +0900
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2012, 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ *
+ */
+
+package com.bar;
+
+import java.util.*;
+import java.util.spi.*;
+
+import com.foobar.Utils;
+
+/**
+ * Implementation class for getGenericTimeZoneName which returns "Generic "+<standard name in OSAKA>.
+ */
+public class GenericTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
+ static final Locale jaJPGeneric = new Locale("ja", "JP", "generic");
+ static final Locale OSAKA = new Locale("ja", "JP", "osaka");
+
+ static Locale[] avail = {
+ jaJPGeneric
+ };
+
+ @Override
+ public Locale[] getAvailableLocales() {
+ return avail;
+ }
+
+ @Override
+ public String getGenericDisplayName(String id, int style, Locale locale) {
+ if (!jaJPGeneric.equals(locale)) {
+ return null;
+ }
+ String std = super.getDisplayName(id, false, style, OSAKA);
+ return (std != null) ? "Generic " + std : null;
+ }
+}
--- a/jdk/test/java/util/PluggableLocale/providersrc/Makefile Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/test/java/util/PluggableLocale/providersrc/Makefile Mon Dec 10 10:52:11 2012 +0900
@@ -38,6 +38,7 @@
CurrencyNameProviderImpl.java \
CurrencyNameProviderImpl2.java \
TimeZoneNameProviderImpl.java \
+ GenericTimeZoneNameProviderImpl.java \
LocaleNameProviderImpl.java \
CalendarDataProviderImpl.java \
CalendarNameProviderImpl.java \
--- a/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.TimeZoneNameProvider Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.TimeZoneNameProvider Mon Dec 10 10:52:11 2012 +0900
@@ -5,3 +5,4 @@
# implementation class
#
com.bar.TimeZoneNameProviderImpl
+com.bar.GenericTimeZoneNameProviderImpl
--- a/jdk/test/sun/text/resources/LocaleData Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/test/sun/text/resources/LocaleData Mon Dec 10 10:52:11 2012 +0900
@@ -7074,3 +7074,586 @@
# bug 7189611
CurrencyNames/es_VE/VEF=Bs.F.
+
+# rfe 8000983 (narrow names support)
+FormatData//DayNarrows/0=S
+FormatData//DayNarrows/1=M
+FormatData//DayNarrows/2=T
+FormatData//DayNarrows/3=W
+FormatData//DayNarrows/4=T
+FormatData//DayNarrows/5=F
+FormatData//DayNarrows/6=S
+FormatData//narrow.AmPmMarkers/0=a
+FormatData//narrow.AmPmMarkers/1=p
+FormatData//narrow.Eras/0=B
+FormatData//narrow.Eras/1=A
+FormatData//buddhist.narrow.Eras/0=BC
+FormatData//buddhist.narrow.Eras/1=B.E.
+FormatData//japanese.narrow.Eras/0=
+FormatData//japanese.narrow.Eras/1=M
+FormatData//japanese.narrow.Eras/2=T
+FormatData//japanese.narrow.Eras/3=S
+FormatData//japanese.narrow.Eras/4=H
+
+FormatData/ar/DayNarrows/0=\u062d
+FormatData/ar/DayNarrows/1=\u0646
+FormatData/ar/DayNarrows/2=\u062b
+FormatData/ar/DayNarrows/3=\u0631
+FormatData/ar/DayNarrows/4=\u062e
+FormatData/ar/DayNarrows/5=\u062c
+FormatData/ar/DayNarrows/6=\u0633
+
+FormatData/be/standalone.MonthNarrows/0=\u0441
+FormatData/be/standalone.MonthNarrows/1=\u043b
+FormatData/be/standalone.MonthNarrows/2=\u0441
+FormatData/be/standalone.MonthNarrows/3=\u043a
+FormatData/be/standalone.MonthNarrows/4=\u043c
+FormatData/be/standalone.MonthNarrows/5=\u0447
+FormatData/be/standalone.MonthNarrows/6=\u043b
+FormatData/be/standalone.MonthNarrows/7=\u0436
+FormatData/be/standalone.MonthNarrows/8=\u0432
+FormatData/be/standalone.MonthNarrows/9=\u043a
+FormatData/be/standalone.MonthNarrows/10=\u043b
+FormatData/be/standalone.MonthNarrows/11=\u0441
+FormatData/be/standalone.MonthNarrows/12=
+FormatData/be/DayNarrows/0=\u043d
+FormatData/be/DayNarrows/1=\u043f
+FormatData/be/DayNarrows/2=\u0430
+FormatData/be/DayNarrows/3=\u0441
+FormatData/be/DayNarrows/4=\u0447
+FormatData/be/DayNarrows/5=\u043f
+FormatData/be/DayNarrows/6=\u0441
+
+FormatData/bg/DayNarrows/0=\u043d
+FormatData/bg/DayNarrows/1=\u043f
+FormatData/bg/DayNarrows/2=\u0432
+FormatData/bg/DayNarrows/3=\u0441
+FormatData/bg/DayNarrows/4=\u0447
+FormatData/bg/DayNarrows/5=\u043f
+FormatData/bg/DayNarrows/6=\u0441
+
+FormatData/ca/standalone.MonthNarrows/0=g
+FormatData/ca/standalone.MonthNarrows/1=f
+FormatData/ca/standalone.MonthNarrows/2=m
+FormatData/ca/standalone.MonthNarrows/3=a
+FormatData/ca/standalone.MonthNarrows/4=m
+FormatData/ca/standalone.MonthNarrows/5=j
+FormatData/ca/standalone.MonthNarrows/6=j
+FormatData/ca/standalone.MonthNarrows/7=a
+FormatData/ca/standalone.MonthNarrows/8=s
+FormatData/ca/standalone.MonthNarrows/9=o
+FormatData/ca/standalone.MonthNarrows/10=n
+FormatData/ca/standalone.MonthNarrows/11=d
+FormatData/ca/standalone.MonthNarrows/12=
+FormatData/ca/DayNarrows/0=G
+# Note: "L" is a contribued item in CLDR
+FormatData/ca/DayNarrows/1=L
+FormatData/ca/DayNarrows/2=T
+FormatData/ca/DayNarrows/3=C
+FormatData/ca/DayNarrows/4=J
+FormatData/ca/DayNarrows/5=V
+FormatData/ca/DayNarrows/6=S
+FormatData/ca/standalone.DayNarrows/0=g
+FormatData/ca/standalone.DayNarrows/1=l
+FormatData/ca/standalone.DayNarrows/2=t
+FormatData/ca/standalone.DayNarrows/3=c
+FormatData/ca/standalone.DayNarrows/4=j
+FormatData/ca/standalone.DayNarrows/5=v
+FormatData/ca/standalone.DayNarrows/6=s
+
+FormatData/cs/DayNarrows/0=N
+FormatData/cs/DayNarrows/1=P
+FormatData/cs/DayNarrows/2=\u00da
+FormatData/cs/DayNarrows/3=S
+FormatData/cs/DayNarrows/4=\u010c
+FormatData/cs/DayNarrows/5=P
+FormatData/cs/DayNarrows/6=S
+
+FormatData/da/DayNarrows/0=S
+FormatData/da/DayNarrows/1=M
+FormatData/da/DayNarrows/2=T
+FormatData/da/DayNarrows/3=O
+FormatData/da/DayNarrows/4=T
+FormatData/da/DayNarrows/5=F
+FormatData/da/DayNarrows/6=L
+
+FormatData/de/DayNarrows/0=S
+FormatData/de/DayNarrows/1=M
+FormatData/de/DayNarrows/2=D
+FormatData/de/DayNarrows/3=M
+FormatData/de/DayNarrows/4=D
+FormatData/de/DayNarrows/5=F
+FormatData/de/DayNarrows/6=S
+
+FormatData/el/DayNarrows/0=\u039a
+FormatData/el/DayNarrows/1=\u0394
+FormatData/el/DayNarrows/2=\u03a4
+FormatData/el/DayNarrows/3=\u03a4
+FormatData/el/DayNarrows/4=\u03a0
+FormatData/el/DayNarrows/5=\u03a0
+FormatData/el/DayNarrows/6=\u03a3
+
+FormatData/es/DayNarrows/0=D
+FormatData/es/DayNarrows/1=L
+FormatData/es/DayNarrows/2=M
+FormatData/es/DayNarrows/3=X
+FormatData/es/DayNarrows/4=J
+FormatData/es/DayNarrows/5=V
+FormatData/es/DayNarrows/6=S
+
+FormatData/et/DayNarrows/0=P
+FormatData/et/DayNarrows/1=E
+FormatData/et/DayNarrows/2=T
+FormatData/et/DayNarrows/3=K
+FormatData/et/DayNarrows/4=N
+FormatData/et/DayNarrows/5=R
+FormatData/et/DayNarrows/6=L
+
+FormatData/fi/standalone.MonthNarrows/0=T
+FormatData/fi/standalone.MonthNarrows/1=H
+FormatData/fi/standalone.MonthNarrows/2=M
+FormatData/fi/standalone.MonthNarrows/3=H
+FormatData/fi/standalone.MonthNarrows/4=T
+FormatData/fi/standalone.MonthNarrows/5=K
+FormatData/fi/standalone.MonthNarrows/6=H
+FormatData/fi/standalone.MonthNarrows/7=E
+FormatData/fi/standalone.MonthNarrows/8=S
+FormatData/fi/standalone.MonthNarrows/9=L
+FormatData/fi/standalone.MonthNarrows/10=M
+FormatData/fi/standalone.MonthNarrows/11=J
+FormatData/fi/standalone.MonthNarrows/12=
+FormatData/fi/DayNarrows/0=S
+FormatData/fi/DayNarrows/1=M
+FormatData/fi/DayNarrows/2=T
+FormatData/fi/DayNarrows/3=K
+FormatData/fi/DayNarrows/4=T
+FormatData/fi/DayNarrows/5=P
+FormatData/fi/DayNarrows/6=L
+FormatData/fi/standalone.DayNarrows/0=S
+FormatData/fi/standalone.DayNarrows/1=M
+FormatData/fi/standalone.DayNarrows/2=T
+FormatData/fi/standalone.DayNarrows/3=K
+FormatData/fi/standalone.DayNarrows/4=T
+FormatData/fi/standalone.DayNarrows/5=P
+FormatData/fi/standalone.DayNarrows/6=L
+FormatData/fi/narrow.AmPmMarkers/0=ap.
+FormatData/fi/narrow.AmPmMarkers/1=ip.
+
+FormatData/fr/DayNarrows/0=D
+FormatData/fr/DayNarrows/1=L
+FormatData/fr/DayNarrows/2=M
+FormatData/fr/DayNarrows/3=M
+FormatData/fr/DayNarrows/4=J
+FormatData/fr/DayNarrows/5=V
+FormatData/fr/DayNarrows/6=S
+
+FormatData/hi_IN/DayNarrows/0=\u0930
+FormatData/hi_IN/DayNarrows/1=\u0938\u094b
+FormatData/hi_IN/DayNarrows/2=\u092e\u0902
+FormatData/hi_IN/DayNarrows/3=\u092c\u0941
+FormatData/hi_IN/DayNarrows/4=\u0917\u0941
+FormatData/hi_IN/DayNarrows/5=\u0936\u0941
+FormatData/hi_IN/DayNarrows/6=\u0936
+
+FormatData/hr/standalone.MonthNarrows/0=1.
+FormatData/hr/standalone.MonthNarrows/1=2.
+FormatData/hr/standalone.MonthNarrows/2=3.
+FormatData/hr/standalone.MonthNarrows/3=4.
+FormatData/hr/standalone.MonthNarrows/4=5.
+FormatData/hr/standalone.MonthNarrows/5=6.
+FormatData/hr/standalone.MonthNarrows/6=7.
+FormatData/hr/standalone.MonthNarrows/7=8.
+FormatData/hr/standalone.MonthNarrows/8=9.
+FormatData/hr/standalone.MonthNarrows/9=10.
+FormatData/hr/standalone.MonthNarrows/10=11.
+FormatData/hr/standalone.MonthNarrows/11=12.
+FormatData/hr/standalone.MonthNarrows/12=
+FormatData/hr/DayNarrows/0=N
+FormatData/hr/DayNarrows/1=P
+FormatData/hr/DayNarrows/2=U
+FormatData/hr/DayNarrows/3=S
+FormatData/hr/DayNarrows/4=\u010c
+FormatData/hr/DayNarrows/5=P
+FormatData/hr/DayNarrows/6=S
+FormatData/hr/standalone.DayNarrows/0=n
+FormatData/hr/standalone.DayNarrows/1=p
+FormatData/hr/standalone.DayNarrows/2=u
+FormatData/hr/standalone.DayNarrows/3=s
+FormatData/hr/standalone.DayNarrows/4=\u010d
+FormatData/hr/standalone.DayNarrows/5=p
+FormatData/hr/standalone.DayNarrows/6=s
+
+FormatData/hu/DayNarrows/0=V
+FormatData/hu/DayNarrows/1=H
+FormatData/hu/DayNarrows/2=K
+FormatData/hu/DayNarrows/3=Sz
+FormatData/hu/DayNarrows/4=Cs
+FormatData/hu/DayNarrows/5=P
+FormatData/hu/DayNarrows/6=Sz
+
+FormatData/is/standalone.MonthNarrows/0=j
+FormatData/is/standalone.MonthNarrows/1=f
+FormatData/is/standalone.MonthNarrows/2=m
+FormatData/is/standalone.MonthNarrows/3=a
+FormatData/is/standalone.MonthNarrows/4=m
+FormatData/is/standalone.MonthNarrows/5=j
+FormatData/is/standalone.MonthNarrows/6=j
+FormatData/is/standalone.MonthNarrows/7=\u00e1
+FormatData/is/standalone.MonthNarrows/8=s
+FormatData/is/standalone.MonthNarrows/9=o
+FormatData/is/standalone.MonthNarrows/10=n
+FormatData/is/standalone.MonthNarrows/11=d
+FormatData/is/standalone.MonthNarrows/12=
+FormatData/is/DayNarrows/0=S
+FormatData/is/DayNarrows/1=M
+FormatData/is/DayNarrows/2=\u00de
+FormatData/is/DayNarrows/3=M
+FormatData/is/DayNarrows/4=F
+FormatData/is/DayNarrows/5=F
+FormatData/is/DayNarrows/6=L
+FormatData/is/standalone.DayNarrows/0=s
+FormatData/is/standalone.DayNarrows/1=m
+FormatData/is/standalone.DayNarrows/2=\u00fe
+FormatData/is/standalone.DayNarrows/3=m
+FormatData/is/standalone.DayNarrows/4=f
+FormatData/is/standalone.DayNarrows/5=f
+FormatData/is/standalone.DayNarrows/6=l
+
+FormatData/it/DayNarrows/0=D
+FormatData/it/DayNarrows/1=L
+FormatData/it/DayNarrows/2=M
+FormatData/it/DayNarrows/3=M
+FormatData/it/DayNarrows/4=G
+FormatData/it/DayNarrows/5=V
+FormatData/it/DayNarrows/6=S
+
+FormatData/iw/DayNarrows/0=\u05d0
+FormatData/iw/DayNarrows/1=\u05d1
+FormatData/iw/DayNarrows/2=\u05d2
+FormatData/iw/DayNarrows/3=\u05d3
+FormatData/iw/DayNarrows/4=\u05d4
+FormatData/iw/DayNarrows/5=\u05d5
+FormatData/iw/DayNarrows/6=\u05e9
+FormatData/iw/standalone.DayNarrows/0=\u05d0
+FormatData/iw/standalone.DayNarrows/1=\u05d1
+FormatData/iw/standalone.DayNarrows/2=\u05d2
+FormatData/iw/standalone.DayNarrows/3=\u05d3
+FormatData/iw/standalone.DayNarrows/4=\u05d4
+FormatData/iw/standalone.DayNarrows/5=\u05d5
+FormatData/iw/standalone.DayNarrows/6=\u05e9
+
+FormatData/ja/DayNarrows/0=\u65e5
+FormatData/ja/DayNarrows/1=\u6708
+FormatData/ja/DayNarrows/2=\u706b
+FormatData/ja/DayNarrows/3=\u6c34
+FormatData/ja/DayNarrows/4=\u6728
+FormatData/ja/DayNarrows/5=\u91d1
+FormatData/ja/DayNarrows/6=\u571f
+
+FormatData/ko/DayNarrows/0=\uc77c
+FormatData/ko/DayNarrows/1=\uc6d4
+FormatData/ko/DayNarrows/2=\ud654
+FormatData/ko/DayNarrows/3=\uc218
+FormatData/ko/DayNarrows/4=\ubaa9
+FormatData/ko/DayNarrows/5=\uae08
+FormatData/ko/DayNarrows/6=\ud1a0
+
+FormatData/lt/standalone.MonthNarrows/0=S
+FormatData/lt/standalone.MonthNarrows/1=V
+FormatData/lt/standalone.MonthNarrows/2=K
+FormatData/lt/standalone.MonthNarrows/3=B
+FormatData/lt/standalone.MonthNarrows/4=G
+FormatData/lt/standalone.MonthNarrows/5=B
+FormatData/lt/standalone.MonthNarrows/6=L
+FormatData/lt/standalone.MonthNarrows/7=R
+FormatData/lt/standalone.MonthNarrows/8=R
+FormatData/lt/standalone.MonthNarrows/9=S
+FormatData/lt/standalone.MonthNarrows/10=L
+FormatData/lt/standalone.MonthNarrows/11=G
+FormatData/lt/standalone.MonthNarrows/12=
+
+FormatData/lt/DayNarrows/0=S
+FormatData/lt/DayNarrows/1=P
+FormatData/lt/DayNarrows/2=A
+FormatData/lt/DayNarrows/3=T
+FormatData/lt/DayNarrows/4=K
+FormatData/lt/DayNarrows/5=P
+FormatData/lt/DayNarrows/6=\u0160
+FormatData/lt/standalone.DayNarrows/0=S
+FormatData/lt/standalone.DayNarrows/1=P
+FormatData/lt/standalone.DayNarrows/2=A
+FormatData/lt/standalone.DayNarrows/3=T
+FormatData/lt/standalone.DayNarrows/4=K
+FormatData/lt/standalone.DayNarrows/5=P
+FormatData/lt/standalone.DayNarrows/6=\u0160
+
+FormatData/lv/DayNarrows/0=S
+FormatData/lv/DayNarrows/1=P
+FormatData/lv/DayNarrows/2=O
+FormatData/lv/DayNarrows/3=T
+FormatData/lv/DayNarrows/4=C
+FormatData/lv/DayNarrows/5=P
+FormatData/lv/DayNarrows/6=S
+
+FormatData/mk/DayNarrows/0=\u043d
+FormatData/mk/DayNarrows/1=\u043f
+FormatData/mk/DayNarrows/2=\u0432
+FormatData/mk/DayNarrows/3=\u0441
+FormatData/mk/DayNarrows/4=\u0447
+FormatData/mk/DayNarrows/5=\u043f
+FormatData/mk/DayNarrows/6=\u0441
+
+FormatData/ms/standalone.MonthNarrows/0=J
+FormatData/ms/standalone.MonthNarrows/1=F
+FormatData/ms/standalone.MonthNarrows/2=M
+FormatData/ms/standalone.MonthNarrows/3=A
+FormatData/ms/standalone.MonthNarrows/4=M
+FormatData/ms/standalone.MonthNarrows/5=J
+FormatData/ms/standalone.MonthNarrows/6=J
+FormatData/ms/standalone.MonthNarrows/7=O
+FormatData/ms/standalone.MonthNarrows/8=S
+FormatData/ms/standalone.MonthNarrows/9=O
+FormatData/ms/standalone.MonthNarrows/10=N
+FormatData/ms/standalone.MonthNarrows/11=D
+FormatData/ms/standalone.MonthNarrows/12=
+FormatData/ms/DayNarrows/0=A
+FormatData/ms/DayNarrows/1=I
+FormatData/ms/DayNarrows/2=S
+FormatData/ms/DayNarrows/3=R
+FormatData/ms/DayNarrows/4=K
+FormatData/ms/DayNarrows/5=J
+FormatData/ms/DayNarrows/6=S
+FormatData/ms/standalone.DayNarrows/0=A
+FormatData/ms/standalone.DayNarrows/1=I
+FormatData/ms/standalone.DayNarrows/2=S
+FormatData/ms/standalone.DayNarrows/3=R
+FormatData/ms/standalone.DayNarrows/4=K
+FormatData/ms/standalone.DayNarrows/5=J
+FormatData/ms/standalone.DayNarrows/6=S
+
+FormatData/mt/DayNarrows/0=\u0126
+FormatData/mt/DayNarrows/1=T
+FormatData/mt/DayNarrows/2=T
+FormatData/mt/DayNarrows/3=E
+FormatData/mt/DayNarrows/4=\u0126
+FormatData/mt/DayNarrows/5=\u0120
+FormatData/mt/DayNarrows/6=S
+
+FormatData/nl/DayNarrows/0=Z
+FormatData/nl/DayNarrows/1=M
+FormatData/nl/DayNarrows/2=D
+FormatData/nl/DayNarrows/3=W
+FormatData/nl/DayNarrows/4=D
+FormatData/nl/DayNarrows/5=V
+FormatData/nl/DayNarrows/6=Z
+
+FormatData/pl/DayNarrows/0=N
+FormatData/pl/DayNarrows/1=P
+FormatData/pl/DayNarrows/2=W
+FormatData/pl/DayNarrows/3=\u015a
+FormatData/pl/DayNarrows/4=C
+FormatData/pl/DayNarrows/5=P
+FormatData/pl/DayNarrows/6=S
+
+FormatData/pt/DayNarrows/0=D
+FormatData/pt/DayNarrows/1=S
+FormatData/pt/DayNarrows/2=T
+FormatData/pt/DayNarrows/3=Q
+FormatData/pt/DayNarrows/4=Q
+FormatData/pt/DayNarrows/5=S
+FormatData/pt/DayNarrows/6=S
+
+FormatData/ro/standalone.MonthNarrows/0=I
+FormatData/ro/standalone.MonthNarrows/1=F
+FormatData/ro/standalone.MonthNarrows/2=M
+FormatData/ro/standalone.MonthNarrows/3=A
+FormatData/ro/standalone.MonthNarrows/4=M
+FormatData/ro/standalone.MonthNarrows/5=I
+FormatData/ro/standalone.MonthNarrows/6=I
+FormatData/ro/standalone.MonthNarrows/7=A
+FormatData/ro/standalone.MonthNarrows/8=S
+FormatData/ro/standalone.MonthNarrows/9=O
+FormatData/ro/standalone.MonthNarrows/10=N
+FormatData/ro/standalone.MonthNarrows/11=D
+FormatData/ro/standalone.MonthNarrows/12=
+# commented out DayNarrows due to mostly undefined
+#FormatData/ro/DayNarrows/0=D
+#FormatData/ro/DayNarrows/1=
+#FormatData/ro/DayNarrows/2=
+#FormatData/ro/DayNarrows/3=
+#FormatData/ro/DayNarrows/4=
+#FormatData/ro/DayNarrows/5=
+#FormatData/ro/DayNarrows/6=
+FormatData/ro/standalone.DayNarrows/0=D
+FormatData/ro/standalone.DayNarrows/1=L
+FormatData/ro/standalone.DayNarrows/2=M
+FormatData/ro/standalone.DayNarrows/3=M
+FormatData/ro/standalone.DayNarrows/4=J
+FormatData/ro/standalone.DayNarrows/5=V
+FormatData/ro/standalone.DayNarrows/6=S
+
+FormatData/ru/DayNarrows/0=\u0412
+FormatData/ru/DayNarrows/1=\u041f\u043d
+FormatData/ru/DayNarrows/2=\u0412\u0442
+FormatData/ru/DayNarrows/3=\u0421
+FormatData/ru/DayNarrows/4=\u0427
+FormatData/ru/DayNarrows/5=\u041f
+# Note: "sat" is an contributed item in CLDR.
+FormatData/ru/DayNarrows/6=\u0421
+
+FormatData/ru/standalone.DayNarrows/0=\u0412
+FormatData/ru/standalone.DayNarrows/1=\u041f
+FormatData/ru/standalone.DayNarrows/2=\u0412
+FormatData/ru/standalone.DayNarrows/3=\u0421
+FormatData/ru/standalone.DayNarrows/4=\u0427
+FormatData/ru/standalone.DayNarrows/5=\u041f
+FormatData/ru/standalone.DayNarrows/6=\u0421
+
+FormatData/sk/DayNarrows/0=N
+FormatData/sk/DayNarrows/1=P
+FormatData/sk/DayNarrows/2=U
+FormatData/sk/DayNarrows/3=S
+FormatData/sk/DayNarrows/4=\u0160
+FormatData/sk/DayNarrows/5=P
+FormatData/sk/DayNarrows/6=S
+
+FormatData/sl/DayNarrows/0=n
+FormatData/sl/DayNarrows/1=p
+FormatData/sl/DayNarrows/2=t
+FormatData/sl/DayNarrows/3=s
+FormatData/sl/DayNarrows/4=\u010d
+FormatData/sl/DayNarrows/5=p
+FormatData/sl/DayNarrows/6=s
+
+FormatData/sq/DayNarrows/0=D
+FormatData/sq/DayNarrows/1=H
+FormatData/sq/DayNarrows/2=M
+FormatData/sq/DayNarrows/3=M
+FormatData/sq/DayNarrows/4=E
+FormatData/sq/DayNarrows/5=P
+FormatData/sq/DayNarrows/6=S
+
+FormatData/sr/DayNarrows/0=\u043d
+FormatData/sr/DayNarrows/1=\u043f
+FormatData/sr/DayNarrows/2=\u0443
+FormatData/sr/DayNarrows/3=\u0441
+FormatData/sr/DayNarrows/4=\u0447
+FormatData/sr/DayNarrows/5=\u043f
+FormatData/sr/DayNarrows/6=\u0441
+FormatData/sr/short.Eras/0=\u043f. \u043d. \u0435.
+FormatData/sr/short.Eras/1=\u043d. \u0435.
+FormatData/sr/narrow.Eras/0=\u043f.\u043d.\u0435.
+FormatData/sr/narrow.Eras/1=\u043d.\u0435.
+
+FormatData/sv/standalone.MonthNarrows/0=J
+FormatData/sv/standalone.MonthNarrows/1=F
+FormatData/sv/standalone.MonthNarrows/2=M
+FormatData/sv/standalone.MonthNarrows/3=A
+FormatData/sv/standalone.MonthNarrows/4=M
+FormatData/sv/standalone.MonthNarrows/5=J
+FormatData/sv/standalone.MonthNarrows/6=J
+FormatData/sv/standalone.MonthNarrows/7=A
+FormatData/sv/standalone.MonthNarrows/8=S
+FormatData/sv/standalone.MonthNarrows/9=O
+FormatData/sv/standalone.MonthNarrows/10=N
+FormatData/sv/standalone.MonthNarrows/11=D
+FormatData/sv/standalone.MonthNarrows/12=
+FormatData/sv/DayNarrows/0=S
+FormatData/sv/DayNarrows/1=M
+FormatData/sv/DayNarrows/2=T
+FormatData/sv/DayNarrows/3=O
+FormatData/sv/DayNarrows/4=T
+FormatData/sv/DayNarrows/5=F
+FormatData/sv/DayNarrows/6=L
+FormatData/sv/standalone.DayNarrows/0=S
+FormatData/sv/standalone.DayNarrows/1=M
+FormatData/sv/standalone.DayNarrows/2=T
+FormatData/sv/standalone.DayNarrows/3=O
+FormatData/sv/standalone.DayNarrows/4=T
+FormatData/sv/standalone.DayNarrows/5=F
+FormatData/sv/standalone.DayNarrows/6=L
+FormatData/sv/narrow.Eras/0=f.Kr.
+FormatData/sv/narrow.Eras/1=e.Kr.
+FormatData/sv/narrow.AmPmMarkers/0=f
+FormatData/sv/narrow.AmPmMarkers/1=e
+
+FormatData/th/standalone.MonthNarrows/0=\u0e21.\u0e04.
+FormatData/th/standalone.MonthNarrows/1=\u0e01.\u0e1e.
+FormatData/th/standalone.MonthNarrows/2=\u0e21\u0e35.\u0e04.
+FormatData/th/standalone.MonthNarrows/3=\u0e40\u0e21.\u0e22.
+FormatData/th/standalone.MonthNarrows/4=\u0e1e.\u0e04.
+FormatData/th/standalone.MonthNarrows/5=\u0e21\u0e34.\u0e22.
+FormatData/th/standalone.MonthNarrows/6=\u0e01.\u0e04.
+FormatData/th/standalone.MonthNarrows/7=\u0e2a.\u0e04.
+FormatData/th/standalone.MonthNarrows/8=\u0e01.\u0e22.
+FormatData/th/standalone.MonthNarrows/9=\u0e15.\u0e04.
+FormatData/th/standalone.MonthNarrows/10=\u0e1e.\u0e22.
+FormatData/th/standalone.MonthNarrows/11=\u0e18.\u0e04.
+FormatData/th/standalone.MonthNarrows/12=
+FormatData/th/DayNarrows/0=\u0e2d
+FormatData/th/DayNarrows/1=\u0e08
+FormatData/th/DayNarrows/2=\u0e2d
+FormatData/th/DayNarrows/3=\u0e1e
+FormatData/th/DayNarrows/4=\u0e1e
+FormatData/th/DayNarrows/5=\u0e28
+FormatData/th/DayNarrows/6=\u0e2a
+FormatData/th/narrow.Eras/0=\u0e01\u0e48\u0e2d\u0e19 \u0e04.\u0e28.
+FormatData/th/narrow.Eras/1=\u0e04.\u0e28.
+
+FormatData/tr/standalone.MonthNarrows/0=O
+FormatData/tr/standalone.MonthNarrows/1=\u015e
+FormatData/tr/standalone.MonthNarrows/2=M
+FormatData/tr/standalone.MonthNarrows/3=N
+FormatData/tr/standalone.MonthNarrows/4=M
+FormatData/tr/standalone.MonthNarrows/5=H
+FormatData/tr/standalone.MonthNarrows/6=T
+FormatData/tr/standalone.MonthNarrows/7=A
+FormatData/tr/standalone.MonthNarrows/8=E
+FormatData/tr/standalone.MonthNarrows/9=E
+FormatData/tr/standalone.MonthNarrows/10=K
+FormatData/tr/standalone.MonthNarrows/11=A
+FormatData/tr/standalone.MonthNarrows/12=
+FormatData/tr/DayNarrows/0=P
+FormatData/tr/DayNarrows/1=P
+FormatData/tr/DayNarrows/2=S
+FormatData/tr/DayNarrows/3=\u00c7
+FormatData/tr/DayNarrows/4=P
+FormatData/tr/DayNarrows/5=C
+FormatData/tr/DayNarrows/6=C
+
+FormatData/uk/DayNarrows/0=\u041d
+FormatData/uk/DayNarrows/1=\u041f
+FormatData/uk/DayNarrows/2=\u0412
+FormatData/uk/DayNarrows/3=\u0421
+FormatData/uk/DayNarrows/4=\u0427
+FormatData/uk/DayNarrows/5=\u041f
+FormatData/uk/DayNarrows/6=\u0421
+
+FormatData/vi/DayNarrows/0=CN
+FormatData/vi/DayNarrows/1=T2
+FormatData/vi/DayNarrows/2=T3
+FormatData/vi/DayNarrows/3=T4
+FormatData/vi/DayNarrows/4=T5
+FormatData/vi/DayNarrows/5=T6
+FormatData/vi/DayNarrows/6=T7
+
+FormatData/zh/standalone.MonthNarrows/0=1\u6708
+FormatData/zh/standalone.MonthNarrows/1=2\u6708
+FormatData/zh/standalone.MonthNarrows/2=3\u6708
+FormatData/zh/standalone.MonthNarrows/3=4\u6708
+FormatData/zh/standalone.MonthNarrows/4=5\u6708
+FormatData/zh/standalone.MonthNarrows/5=6\u6708
+FormatData/zh/standalone.MonthNarrows/6=7\u6708
+FormatData/zh/standalone.MonthNarrows/7=8\u6708
+FormatData/zh/standalone.MonthNarrows/8=9\u6708
+FormatData/zh/standalone.MonthNarrows/9=10\u6708
+FormatData/zh/standalone.MonthNarrows/10=11\u6708
+FormatData/zh/standalone.MonthNarrows/11=12\u6708
+FormatData/zh/standalone.MonthNarrows/12=
+FormatData/zh/DayNarrows/0=\u65e5
+FormatData/zh/DayNarrows/1=\u4e00
+FormatData/zh/DayNarrows/2=\u4e8c
+FormatData/zh/DayNarrows/3=\u4e09
+FormatData/zh/DayNarrows/4=\u56db
+FormatData/zh/DayNarrows/5=\u4e94
+FormatData/zh/DayNarrows/6=\u516d
--- a/jdk/test/sun/text/resources/LocaleDataTest.java Sun Dec 09 19:13:08 2012 +0000
+++ b/jdk/test/sun/text/resources/LocaleDataTest.java Mon Dec 10 10:52:11 2012 +0900
@@ -34,7 +34,7 @@
* 6509039 6609737 6610748 6645271 6507067 6873931 6450945 6645268 6646611
* 6645405 6650730 6910489 6573250 6870908 6585666 6716626 6914413 6916787
* 6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7101495
- * 7003124 7085757 7028073 7171028 7189611
+ * 7003124 7085757 7028073 7171028 7189611 8000983
* @summary Verify locale data
*
*/