8202764: api/java_text/SimpleDateFormat/index.html#Format testcases started to fail with JDK11 b12
authornaoto
Fri, 11 May 2018 10:07:10 -0700
changeset 50085 f001977641fb
parent 50084 44b64fc0baa3
child 50086 66b0f0134aad
8202764: api/java_text/SimpleDateFormat/index.html#Format testcases started to fail with JDK11 b12 Reviewed-by: sherman
make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java
test/jdk/sun/util/resources/cldr/Bug8202764.java
--- 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));
+                }
+            });
+    }
+}