8202764: api/java_text/SimpleDateFormat/index.html#Format testcases started to fail with JDK11 b12
Reviewed-by: sherman
--- a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java Fri May 11 17:37:14 2018 +0200
+++ b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java Fri May 11 10:07:10 2018 -0700
@@ -109,6 +109,7 @@
private static final String[] AVAILABLE_TZIDS = TimeZone.getAvailableIDs();
private static String zoneNameTempFile;
private static String tzDataDir;
+ private static final Map<String, String> canonicalTZMap = new HashMap<>();
static enum DraftType {
UNCONFIRMED,
@@ -439,6 +440,15 @@
// Parse timezone
handlerTimeZone = new TimeZoneParseHandler();
parseLDMLFile(new File(TIMEZONE_SOURCE_FILE), handlerTimeZone);
+
+ // canonical tz name map
+ // alias -> primary
+ handlerTimeZone.getData().forEach((k, v) -> {
+ String[] ids = ((String)v).split("\\s");
+ for (int i = 1; i < ids.length; i++) {
+ canonicalTZMap.put(ids[i], ids[0]);
+ }
+ });
}
private static void parseLDMLFile(File srcfile, AbstractLDMLHandler handler) throws Exception {
@@ -658,7 +668,27 @@
handlerMetaZones.get(tzid) == null ||
handlerMetaZones.get(tzid) != null &&
map.get(METAZONE_ID_PREFIX + handlerMetaZones.get(tzid)) == null) {
- // First, check the CLDR meta key
+
+ // First, check the alias
+ String canonID = canonicalTZMap.get(tzid);
+ if (canonID != null && !tzid.equals(canonID)) {
+ Object value = map.get(TIMEZONE_ID_PREFIX + canonID);
+ if (value != null) {
+ names.put(tzid, value);
+ return;
+ } else {
+ String meta = handlerMetaZones.get(canonID);
+ if (meta != null) {
+ value = map.get(METAZONE_ID_PREFIX + meta);
+ if (value != null) {
+ names.put(tzid, meta);
+ return;
+ }
+ }
+ }
+ }
+
+ // Check the CLDR meta key
Optional<Map.Entry<String, String>> cldrMeta =
handlerMetaZones.getData().entrySet().stream()
.filter(me ->
@@ -666,7 +696,7 @@
(String[])map.get(METAZONE_ID_PREFIX + me.getValue())))
.findAny();
cldrMeta.ifPresentOrElse(meta -> names.put(tzid, meta.getValue()), () -> {
- // check the JRE meta key, add if there is not.
+ // Check the JRE meta key, add if there is not.
Optional<Map.Entry<String[], String>> jreMeta =
jreMetaMap.entrySet().stream()
.filter(jm -> Arrays.deepEquals(data, jm.getKey()))
@@ -1024,16 +1054,9 @@
}
private static Stream<String> zidMapEntry() {
- Map<String, String> canonMap = new HashMap<>();
- handlerTimeZone.getData().entrySet().stream()
- .forEach(e -> {
- String[] ids = ((String)e.getValue()).split("\\s");
- for (int i = 1; i < ids.length; i++) {
- canonMap.put(ids[i], ids[0]);
- }});
return ZoneId.getAvailableZoneIds().stream()
.map(id -> {
- String canonId = canonMap.getOrDefault(id, id);
+ String canonId = canonicalTZMap.getOrDefault(id, id);
String meta = handlerMetaZones.get(canonId);
String zone001 = handlerMetaZones.zidMap().get(meta);
return zone001 == null ? "" :
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/sun/util/resources/cldr/Bug8202764.java Fri May 11 10:07:10 2018 -0700
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2018, 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 8202764
+ * @modules jdk.localedata
+ * @summary Checks time zone names are consistent with aliased ids,
+ * between DateFormatSymbols.getZoneStrings() and getDisplayName()
+ * of TimeZone/ZoneId classes
+ * @run testng/othervm Bug8202764
+ */
+
+import static org.testng.Assert.assertEquals;
+
+import java.time.ZoneId;
+import java.time.format.TextStyle;
+import java.text.DateFormatSymbols;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.Set;
+import java.util.TimeZone;
+
+import org.testng.annotations.Test;
+
+public class Bug8202764 {
+
+ @Test
+ public void testAliasedTZs() {
+ Set<String> zoneIds = ZoneId.getAvailableZoneIds();
+ Arrays.stream(DateFormatSymbols.getInstance(Locale.US).getZoneStrings())
+ .forEach(zone -> {
+ System.out.println(zone[0]);
+ TimeZone tz = TimeZone.getTimeZone(zone[0]);
+ assertEquals(zone[1], tz.getDisplayName(false, TimeZone.LONG, Locale.US));
+ assertEquals(zone[2], tz.getDisplayName(false, TimeZone.SHORT, Locale.US));
+ assertEquals(zone[3], tz.getDisplayName(true, TimeZone.LONG, Locale.US));
+ assertEquals(zone[4], tz.getDisplayName(true, TimeZone.SHORT, Locale.US));
+ if (zoneIds.contains(zone[0])) {
+ // Some of the ids, e.g. three-letter ids are not supported in ZoneId
+ ZoneId zi = tz.toZoneId();
+ assertEquals(zone[5], zi.getDisplayName(TextStyle.FULL, Locale.US));
+ assertEquals(zone[6], zi.getDisplayName(TextStyle.SHORT, Locale.US));
+ }
+ });
+ }
+}