--- old/make/CompileToolsJdk.gmk 2020-02-07 13:21:02.000000000 -0800 +++ new/make/CompileToolsJdk.gmk 2020-02-07 13:21:02.000000000 -0800 @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2020, 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 @@ -40,7 +40,6 @@ # Use += to be able to add to this from a custom extension BUILD_TOOLS_SRC_DIRS += \ $(TOPDIR)/make/jdk/src/classes \ - $(BUILDTOOLS_OUTPUTDIR)/interim_cldrconverter_classes \ $(BUILDTOOLS_OUTPUTDIR)/interim_tzdb_classes \ # --- old/make/Main.gmk 2020-02-07 13:21:03.000000000 -0800 +++ new/make/Main.gmk 2020-02-07 13:21:03.000000000 -0800 @@ -75,9 +75,6 @@ interim-rmic: +($(CD) $(TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f CompileInterimRmic.gmk) -interim-cldrconverter: - +($(CD) $(TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f CopyInterimCLDRConverter.gmk) - interim-tzdb: +($(CD) $(TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f CopyInterimTZDB.gmk) @@ -92,7 +89,7 @@ +($(CD) $(TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f CompileToolsHotspot.gmk) ALL_TARGETS += buildtools-langtools interim-langtools \ - interim-rmic interim-cldrconverter interim-tzdb buildtools-jdk buildtools-modules \ + interim-rmic interim-tzdb buildtools-jdk buildtools-modules \ buildtools-hotspot ################################################################################ @@ -677,7 +674,7 @@ interim-langtools: $(INTERIM_LANGTOOLS_GENSRC_TARGETS) - buildtools-jdk: interim-langtools interim-cldrconverter interim-tzdb + buildtools-jdk: interim-langtools interim-tzdb buildtools-hotspot: interim-langtools --- old/make/jdk/src/classes/build/tools/cldrconverter/Bundle.java 2020-02-07 13:21:04.000000000 -0800 +++ new/make/jdk/src/classes/build/tools/cldrconverter/Bundle.java 2020-02-07 13:21:04.000000000 -0800 @@ -307,10 +307,6 @@ it.remove(); continue; } - - if (id.equals("en")) { - fillInJREs(key, nameMap); - } } } for (Iterator it = myMap.keySet().iterator(); it.hasNext();) { @@ -636,42 +632,6 @@ return null; } - static List jreTimeZoneNames = Arrays.asList(TimeZoneNames.getContents()); - private void fillInJREs(String key, Map map) { - String tzid = null; - - if (key.startsWith(CLDRConverter.METAZONE_ID_PREFIX)) { - // Look for tzid - String meta = key.substring(CLDRConverter.METAZONE_ID_PREFIX.length()); - if (meta.equals("GMT")) { - tzid = meta; - } else { - for (String tz : CLDRConverter.handlerMetaZones.keySet()) { - if (CLDRConverter.handlerMetaZones.get(tz).equals(meta)) { - tzid = tz; - break; - } - } - } - } else { - tzid = key.substring(CLDRConverter.TIMEZONE_ID_PREFIX.length()); - } - - if (tzid != null) { - for (Object[] jreZone : jreTimeZoneNames) { - if (jreZone[0].equals(tzid)) { - for (int i = 0; i < ZONE_NAME_KEYS.length; i++) { - if (map.get(ZONE_NAME_KEYS[i]) == null) { - String[] jreNames = (String[])jreZone[1]; - map.put(ZONE_NAME_KEYS[i], jreNames[i]); - } - } - break; - } - } - } - } - /** * Perform a generic conversion of CLDR date-time format pattern letter based * on the support given by the SimpleDateFormat and the j.t.f.DateTimeFormatter --- old/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java 2020-02-07 13:21:05.000000000 -0800 +++ new/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java 2020-02-07 13:21:05.000000000 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2020, 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 @@ -25,7 +25,6 @@ package build.tools.cldrconverter; -import static build.tools.cldrconverter.Bundle.jreTimeZoneNames; import build.tools.cldrconverter.BundleGenerator.BundleType; import java.io.File; import java.io.IOException; @@ -89,7 +88,38 @@ static final String ZONE_NAME_PREFIX = "timezone.displayname."; static final String METAZONE_ID_PREFIX = "metazone.id."; static final String PARENT_LOCALE_PREFIX = "parentLocale."; + static final String META_EMPTY_ZONE_NAME = "EMPTY_ZONE"; static final String[] EMPTY_ZONE = {"", "", "", "", "", ""}; + static final String META_ETCUTC_ZONE_NAME = "ETC_UTC"; + + // Old 3-letter-id mappings for compatibility. Copied from sun.util.calendar.ZoneInfoFile. + private static final String[][] oldMappings = new String[][] { + { "ACT", "Australia/Darwin" }, + { "AET", "Australia/Sydney" }, + { "AGT", "America/Argentina/Buenos_Aires" }, + { "ART", "Africa/Cairo" }, + { "AST", "America/Anchorage" }, + { "BET", "America/Sao_Paulo" }, + { "BST", "Asia/Dhaka" }, + { "CAT", "Africa/Harare" }, + { "CNT", "America/St_Johns" }, + { "CST", "America/Chicago" }, + { "CTT", "Asia/Shanghai" }, + { "EAT", "Africa/Addis_Ababa" }, + { "ECT", "Europe/Paris" }, + { "IET", "America/Indiana/Indianapolis" }, + { "IST", "Asia/Kolkata" }, + { "JST", "Asia/Tokyo" }, + { "MIT", "Pacific/Apia" }, + { "NET", "Asia/Yerevan" }, + { "NST", "Pacific/Auckland" }, + { "PLT", "Asia/Karachi" }, + { "PNT", "America/Phoenix" }, + { "PRT", "America/Puerto_Rico" }, + { "PST", "America/Los_Angeles" }, + { "SST", "Pacific/Guadalcanal" }, + { "VST", "Asia/Ho_Chi_Minh" }, + }; private static SupplementDataParseHandler handlerSuppl; private static LikelySubtagsParseHandler handlerLikelySubtags; @@ -686,60 +716,6 @@ private static Map extractZoneNames(Map map, String id) { Map names = new HashMap<>(); - // Copy over missing time zone ids from JRE for English locale - if (id.equals("en")) { - Map jreMetaMap = new HashMap<>(); - jreTimeZoneNames.stream().forEach(e -> { - String tzid = (String)e[0]; - String[] data = (String[])e[1]; - - if (map.get(TIMEZONE_ID_PREFIX + tzid) == null && - handlerMetaZones.get(tzid) == null || - handlerMetaZones.get(tzid) != null && - map.get(METAZONE_ID_PREFIX + handlerMetaZones.get(tzid)) == null) { - - // 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> cldrMeta = - handlerMetaZones.getData().entrySet().stream() - .filter(me -> - Arrays.deepEquals(data, - (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. - Optional> jreMeta = - jreMetaMap.entrySet().stream() - .filter(jm -> Arrays.deepEquals(data, jm.getKey())) - .findAny(); - jreMeta.ifPresentOrElse(meta -> names.put(tzid, meta.getValue()), () -> { - String metaName = "JRE_" + tzid.replaceAll("[/-]", "_"); - names.put(METAZONE_ID_PREFIX + metaName, data); - names.put(tzid, metaName); - }); - }); - } - }); - } - getAvailableZoneIds().stream().forEach(tzid -> { // If the tzid is deprecated, get the data for the replacement id String tzKey = Optional.ofNullable((String)handlerSupplMeta.get(tzid)) @@ -747,7 +723,14 @@ Object data = map.get(TIMEZONE_ID_PREFIX + tzKey); if (data instanceof String[]) { - names.put(tzid, data); + // Hack for UTC. UTC is an alias to Etc/UTC in CLDR + if (tzid.equals("Etc/UTC") && !map.containsKey(TIMEZONE_ID_PREFIX + "UTC")) { + names.put(METAZONE_ID_PREFIX + META_ETCUTC_ZONE_NAME, data); + names.put(tzid, META_ETCUTC_ZONE_NAME); + names.put("UTC", META_ETCUTC_ZONE_NAME); + } else { + names.put(tzid, data); + } } else { String meta = handlerMetaZones.get(tzKey); if (meta != null) { @@ -764,24 +747,23 @@ // exemplar cities. Map exCities = map.entrySet().stream() - .filter(e -> e.getKey().startsWith(CLDRConverter.EXEMPLAR_CITY_PREFIX)) - .collect(Collectors - .toMap(Map.Entry::getKey, Map.Entry::getValue)); + .filter(e -> e.getKey().startsWith(CLDRConverter.EXEMPLAR_CITY_PREFIX)) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); names.putAll(exCities); - if (!id.equals("en") && - !names.isEmpty()) { - // CLDR does not have UTC entry, so add it here. - names.put("UTC", EMPTY_ZONE); - - // no metazone zones - Arrays.asList(handlerMetaZones.get(MetaZonesParseHandler.NO_METAZONE_KEY) - .split("\\s")).stream() - .forEach(tz -> { - names.put(tz, EMPTY_ZONE); - }); + // If there's no UTC entry at this point, add an empty one + if (!names.isEmpty() && !names.containsKey("UTC")) { + names.putIfAbsent(METAZONE_ID_PREFIX + META_EMPTY_ZONE_NAME, EMPTY_ZONE); + names.put("UTC", META_EMPTY_ZONE_NAME); } + // Finally some compatibility stuff + Arrays.stream(oldMappings) + .filter(oldmap -> !names.containsKey(oldmap[0]) && names.containsKey(oldmap[1])) + .forEach(oldmap -> { + names.put(oldmap[0], names.get(oldmap[1])); + }); + return names; } --- old/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java 2020-02-07 13:21:07.000000000 -0800 +++ new/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java 2020-02-07 13:21:06.000000000 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2020, 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 @@ -4260,9 +4260,15 @@ char nextNextChar = text.charAt(position + 1); if (context.charEquals(nextChar, 'U') && context.charEquals(nextNextChar, 'T')) { if (length >= position + 3 && context.charEquals(text.charAt(position + 2), 'C')) { - return parseOffsetBased(context, text, position, position + 3, OffsetIdPrinterParser.INSTANCE_ID_ZERO); + // There are localized zone texts that start with "UTC", e.g. + // "UTC\u221210:00" (MINUS SIGN instead of HYPHEN-MINUS) in French. + // Exclude those ZoneText cases. + if (!(this instanceof ZoneTextPrinterParser)) { + return parseOffsetBased(context, text, position, position + 3, OffsetIdPrinterParser.INSTANCE_ID_ZERO); + } + } else { + return parseOffsetBased(context, text, position, position + 2, OffsetIdPrinterParser.INSTANCE_ID_ZERO); } - return parseOffsetBased(context, text, position, position + 2, OffsetIdPrinterParser.INSTANCE_ID_ZERO); } else if (context.charEquals(nextChar, 'G') && length >= position + 3 && context.charEquals(nextNextChar, 'M') && context.charEquals(text.charAt(position + 2), 'T')) { if (length >= position + 4 && context.charEquals(text.charAt(position + 3), '0')) { --- old/src/java.base/share/classes/sun/util/cldr/CLDRTimeZoneNameProviderImpl.java 2020-02-07 13:21:08.000000000 -0800 +++ new/src/java.base/share/classes/sun/util/cldr/CLDRTimeZoneNameProviderImpl.java 2020-02-07 13:21:08.000000000 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020, 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 @@ -34,7 +34,6 @@ import java.util.ResourceBundle; import java.util.Set; import java.util.TimeZone; -import java.util.stream.Collectors; import sun.util.calendar.ZoneInfoFile; import sun.util.locale.provider.LocaleProviderAdapter; import sun.util.locale.provider.LocaleResources; @@ -73,8 +72,6 @@ @Override protected String[] getDisplayNameArray(String id, Locale locale) { - // Use English for the ROOT locale - locale = locale.equals(Locale.ROOT) ? Locale.ENGLISH : locale; String[] namesSuper = super.getDisplayNameArray(id, locale); if (namesSuper == null) { @@ -94,12 +91,12 @@ case "": // Fill in empty elements deriveFallbackName(namesSuper, i, locale, - !exists(namesSuper, INDEX_DST_LONG)); + !TimeZone.getTimeZone(id).useDaylightTime()); break; case NO_INHERITANCE_MARKER: // CLDR's "no inheritance marker" namesSuper[i] = toGMTFormat(id, i == INDEX_DST_LONG || i == INDEX_DST_SHORT, - i % 2 != 0, locale); + locale); break; default: break; @@ -121,24 +118,19 @@ @Override protected String[][] getZoneStrings(Locale locale) { - // Use English for the ROOT locale - locale = locale.equals(Locale.ROOT) ? Locale.ENGLISH : locale; String[][] ret = super.getZoneStrings(locale); // Fill in for the empty names. - // English names are prefilled for performance. - if (!locale.equals(Locale.ENGLISH) && - !locale.equals(Locale.US)) { - for (int zoneIndex = 0; zoneIndex < ret.length; zoneIndex++) { - deriveFallbackNames(ret[zoneIndex], locale); - } + for (int zoneIndex = 0; zoneIndex < ret.length; zoneIndex++) { + deriveFallbackNames(ret[zoneIndex], locale); } return ret; } // Derive fallback time zone name according to LDML's logic private void deriveFallbackNames(String[] names, Locale locale) { - boolean noDST = !exists(names, INDEX_DST_LONG); + boolean noDST = !TimeZone.getTimeZone(names[0]).useDaylightTime(); + for (int i = INDEX_STD_LONG; i <= INDEX_GEN_SHORT; i++) { deriveFallbackName(names, i, locale, noDST); } @@ -152,11 +144,25 @@ // CLDR's "no inheritance marker" names[index] = toGMTFormat(id, index == INDEX_DST_LONG || index == INDEX_DST_SHORT, - index % 2 != 0, locale); + locale); } return; } + // Check parent locale first + if (!exists(names, index)) { + CLDRLocaleProviderAdapter clpa = (CLDRLocaleProviderAdapter)LocaleProviderAdapter.forType(Type.CLDR); + var cands = clpa.getCandidateLocales("", locale); + if (cands.size() > 1) { + var parentLoc = cands.get(1); // immediate parent locale + String[] parentNames = super.getDisplayNameArray(id, parentLoc); + if (parentNames != null && !parentNames[index].isEmpty()) { + names[index] = parentNames[index]; + return; + } + } + } + // Check if COMPAT can substitute the name if (LocaleProviderAdapter.getAdapterPreference().contains(Type.JRE)) { String[] compatNames = (String[])LocaleProviderAdapter.forJRE() @@ -173,37 +179,34 @@ } } - // Type Fallback - if (noDST && typeFallback(names, index)) { + // Region Fallback + if (regionFormatFallback(names, index, locale)) { return; } - // Region Fallback - if (regionFormatFallback(names, index, locale)) { + // Type Fallback + if (noDST && typeFallback(names, index)) { return; } // last resort - if (!id.toUpperCase(Locale.ROOT).startsWith("UT")) { - names[index] = toGMTFormat(id, - index == INDEX_DST_LONG || index == INDEX_DST_SHORT, - index % 2 != 0, - locale); - // aliases of "GMT" timezone. - if ((exists(names, INDEX_STD_LONG)) && (id.startsWith("Etc/") - || id.startsWith("GMT") || id.startsWith("Greenwich"))) { - switch (id) { - case "Etc/GMT": - case "Etc/GMT-0": - case "Etc/GMT+0": - case "Etc/GMT0": - case "GMT+0": - case "GMT-0": - case "GMT0": - case "Greenwich": - names[INDEX_DST_LONG] = names[INDEX_GEN_LONG] = names[INDEX_STD_LONG]; - break; - } + names[index] = toGMTFormat(id, + index == INDEX_DST_LONG || index == INDEX_DST_SHORT, + locale); + // aliases of "GMT" timezone. + if ((exists(names, INDEX_STD_LONG)) && (id.startsWith("Etc/") + || id.startsWith("GMT") || id.startsWith("Greenwich"))) { + switch (id) { + case "Etc/GMT": + case "Etc/GMT-0": + case "Etc/GMT+0": + case "Etc/GMT0": + case "GMT+0": + case "GMT-0": + case "GMT0": + case "Greenwich": + names[INDEX_DST_LONG] = names[INDEX_GEN_LONG] = names[INDEX_STD_LONG]; + break; } } } @@ -217,12 +220,12 @@ private boolean typeFallback(String[] names, int index) { // check generic int genIndex = INDEX_GEN_SHORT - index % 2; - if (!exists(names, index) && exists(names, genIndex)) { + if (!exists(names, index) && exists(names, genIndex) && !names[genIndex].startsWith("GMT")) { names[index] = names[genIndex]; } else { // check standard int stdIndex = INDEX_STD_SHORT - index % 2; - if (!exists(names, index) && exists(names, stdIndex)) { + if (!exists(names, index) && exists(names, stdIndex) && !names[stdIndex].startsWith("GMT")) { names[index] = names[stdIndex]; } } @@ -235,6 +238,7 @@ LocaleResources lr = LocaleProviderAdapter.forType(Type.CLDR).getLocaleResources(l); ResourceBundle fd = lr.getJavaTimeFormatData(); + id = TimeZoneNameUtility.canonicalTZID(id).orElse(id); String rgn = (String) lr.getTimeZoneNames("timezone.excity." + id); if (rgn == null && !id.startsWith("Etc") && !id.startsWith("SystemV")) { int slash = id.lastIndexOf('/'); @@ -264,7 +268,7 @@ return exists(names, index); } - private String toGMTFormat(String id, boolean daylight, boolean isShort, Locale l) { + private String toGMTFormat(String id, boolean daylight, Locale l) { TimeZone tz = ZoneInfoFile.getZoneInfo(id); int offset = (tz.getRawOffset() + (daylight ? tz.getDSTSavings() : 0)) / 60000; LocaleResources lr = LocaleProviderAdapter.forType(Type.CLDR).getLocaleResources(l); @@ -283,7 +287,7 @@ offset = -offset; } hourFormat = hourFormat - .replaceFirst("H+", (isShort ? "\\%1\\$d" : "\\%1\\$02d")) + .replaceFirst("H+", "\\%1\\$02d") .replaceFirst("m+", "\\%2\\$02d"); return MessageFormat.format(gmtFormat, String.format(l, hourFormat, offset / 60, offset % 60)); --- old/test/jdk/java/util/TimeZone/CLDRDisplayNamesTest.java 2020-02-07 13:21:09.000000000 -0800 +++ new/test/jdk/java/util/TimeZone/CLDRDisplayNamesTest.java 2020-02-07 13:21:09.000000000 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2020, 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 @@ -24,6 +24,7 @@ /* * @test * @bug 8005471 8008577 8129881 8130845 8136518 8181157 8210490 8220037 + * 8234347 8236548 * @modules jdk.localedata * @run main/othervm -Djava.locale.providers=CLDR CLDRDisplayNamesTest * @summary Make sure that localized time zone names of CLDR are used @@ -95,12 +96,14 @@ } // for 8129881 + /* 8234347: CLDR Converter will not pre-fill short display names from COMPAT anymore. tz = TimeZone.getTimeZone("Europe/Vienna"); String name = tz.getDisplayName(false, SHORT, Locale.ENGLISH); if (!"CET".equals(name)) { System.err.printf("error: got '%s' expected 'CET' %n", name); errors++; } + */ // for 8130845 SimpleDateFormat fmtROOT = new SimpleDateFormat("EEE MMM d hh:mm:ss z yyyy", Locale.ROOT); @@ -109,7 +112,7 @@ Locale originalLocale = Locale.getDefault(); try { Locale.setDefault(Locale.ROOT); - fmtROOT.parse("Thu Nov 13 04:35:51 AKST 2008"); + fmtROOT.parse("Thu Nov 13 04:35:51 GMT-09:00 2008"); fmtUS.parse("Thu Nov 13 04:35:51 AKST 2008"); fmtUK.parse("Thu Nov 13 04:35:51 GMT-09:00 2008"); } catch (ParseException pe) { @@ -154,6 +157,7 @@ // 8220037: Make sure CLDRConverter uniquely produces bundles, regardless of the // source file enumeration order. + /* 8234347: CLDR Converter will not pre-fill short display names from COMPAT anymore. tz = TimeZone.getTimeZone("America/Argentina/La_Rioja"); if (!"ARST".equals(tz.getDisplayName(true, TimeZone.SHORT, new Locale.Builder() @@ -163,6 +167,7 @@ System.err.println("Short display name of \"" + tz.getID() + "\" was not \"ARST\""); errors++; } + */ if (errors > 0) { throw new RuntimeException("test failed"); --- old/test/jdk/sun/util/resources/cldr/Bug8134384.java 2020-02-07 13:21:10.000000000 -0800 +++ new/test/jdk/sun/util/resources/cldr/Bug8134384.java 2020-02-07 13:21:10.000000000 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2020, 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,7 +23,7 @@ /* * @test - * @bug 8134384 + * @bug 8134384 8234347 8236548 * @summary Tests CLDR TimeZoneNames has English names for all tzids * @run main/othervm -Djava.locale.providers=CLDR Bug8134384 */ @@ -43,12 +43,10 @@ String date1 = Date.from(Instant.parse("2015-06-21T00:00:00.00Z")).toString(); testParse(Locale.ENGLISH, date1, tz); testParse(Locale.US, date1, tz); - testParse(Locale.ROOT, date1, tz); // Winter solstice String date2 = Date.from(Instant.parse("2015-12-22T00:00:00.00Z")).toString(); testParse(Locale.ENGLISH, date2, tz); testParse(Locale.US, date2, tz); - testParse(Locale.ROOT, date2, tz); } } finally { TimeZone.setDefault(original); --- old/test/jdk/sun/util/resources/cldr/TimeZoneNamesTest.java 2020-02-07 13:21:11.000000000 -0800 +++ new/test/jdk/sun/util/resources/cldr/TimeZoneNamesTest.java 2020-02-07 13:21:11.000000000 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020, 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,19 +23,22 @@ /* * @test - * @bug 8181157 8202537 + * @bug 8181157 8202537 8234347 8236548 * @modules jdk.localedata * @summary Checks CLDR time zone names are generated correctly at runtime * @run testng/othervm -Djava.locale.providers=CLDR TimeZoneNamesTest */ -import static org.testng.Assert.assertEquals; - +import java.text.DateFormatSymbols; import java.time.ZoneId; import java.time.format.TextStyle; +import java.util.Arrays; import java.util.Locale; +import java.util.Objects; import java.util.TimeZone; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -51,91 +54,126 @@ // on the CLDR data upgrade. // no "metazone" zones - {"Asia/Srednekolymsk", Locale.US, "Srednekolymsk Time", - "SRET", + {"Asia/Srednekolymsk", Locale.US, "Srednekolymsk Standard Time", + "GMT+11:00", "Srednekolymsk Daylight Time", - "SREDT", + "GMT+11:00", "Srednekolymsk Time", - "SRET"}, + "GMT+11:00"}, {"Asia/Srednekolymsk", Locale.FRANCE, "Srednekolymsk (heure standard)", "UTC+11:00", - "Srednekolymsk (heure standard)", + "Srednekolymsk (heure d\u2019\u00e9t\u00e9)", "UTC+11:00", "heure : Srednekolymsk", "UTC+11:00"}, {"America/Punta_Arenas", Locale.US, "Punta Arenas Standard Time", "GMT-03:00", - "Punta Arenas Standard Time", + "Punta Arenas Daylight Time", "GMT-03:00", "Punta Arenas Time", "GMT-03:00"}, {"America/Punta_Arenas", Locale.FRANCE, "Punta Arenas (heure standard)", "UTC\u221203:00", - "Punta Arenas (heure standard)", + "Punta Arenas (heure d\u2019\u00e9t\u00e9)", "UTC\u221203:00", "heure : Punta Arenas", "UTC\u221203:00"}, - {"Asia/Famagusta", Locale.US, "Eastern European Time", - "EET", - "Eastern European Summer Time", - "EEST", - "Eastern European Time", - "EET"}, + {"Asia/Famagusta", Locale.US, "Famagusta Standard Time", + "GMT+02:00", + "Famagusta Daylight Time", + "GMT+03:00", + "Famagusta Time", + "GMT+02:00"}, {"Asia/Famagusta", Locale.FRANCE, "Famagouste (heure standard)", "UTC+02:00", - "Famagouste (heure standard)", + "Famagouste (heure d\u2019\u00e9t\u00e9)", "UTC+03:00", "heure : Famagouste", "UTC+02:00"}, {"Europe/Astrakhan", Locale.US, "Astrakhan Standard Time", "GMT+04:00", - "Astrakhan Standard Time", + "Astrakhan Daylight Time", "GMT+04:00", "Astrakhan Time", "GMT+04:00"}, {"Europe/Astrakhan", Locale.FRANCE, "Astrakhan (heure standard)", "UTC+04:00", - "Astrakhan (heure standard)", + "Astrakhan (heure d\u2019\u00e9t\u00e9)", "UTC+04:00", "heure : Astrakhan", "UTC+04:00"}, {"Europe/Saratov", Locale.US, "Saratov Standard Time", "GMT+04:00", - "Saratov Standard Time", + "Saratov Daylight Time", "GMT+04:00", "Saratov Time", "GMT+04:00"}, {"Europe/Saratov", Locale.FRANCE, "Saratov (heure standard)", "UTC+04:00", - "Saratov (heure standard)", + "Saratov (heure d\u2019\u00e9t\u00e9)", "UTC+04:00", "heure : Saratov", "UTC+04:00"}, {"Europe/Ulyanovsk", Locale.US, "Ulyanovsk Standard Time", "GMT+04:00", - "Ulyanovsk Standard Time", + "Ulyanovsk Daylight Time", "GMT+04:00", "Ulyanovsk Time", "GMT+04:00"}, {"Europe/Ulyanovsk", Locale.FRANCE, "Oulianovsk (heure standard)", "UTC+04:00", - "Oulianovsk (heure standard)", + "Oulianovsk (heure d\u2019\u00e9t\u00e9)", "UTC+04:00", "heure : Oulianovsk", "UTC+04:00"}, {"Pacific/Bougainville", Locale.US, "Bougainville Standard Time", - "BST", + "GMT+11:00", "Bougainville Daylight Time", - "BST", + "GMT+11:00", "Bougainville Time", - "BT"}, + "GMT+11:00"}, {"Pacific/Bougainville", Locale.FRANCE, "Bougainville (heure standard)", "UTC+11:00", - "Bougainville (heure standard)", + "Bougainville (heure d\u2019\u00e9t\u00e9)", "UTC+11:00", "heure : Bougainville", "UTC+11:00"}, - + {"Europe/Istanbul", Locale.US, "Istanbul Standard Time", + "GMT+03:00", + "Istanbul Daylight Time", + "GMT+03:00", + "Istanbul Time", + "GMT+03:00"}, + {"Europe/Istanbul", Locale.FRANCE, "Istanbul (heure standard)", + "UTC+03:00", + "Istanbul (heure d\u2019\u00e9t\u00e9)", + "UTC+03:00", + "heure : Istanbul", + "UTC+03:00"}, + {"Asia/Istanbul", Locale.US, "Istanbul Standard Time", + "GMT+03:00", + "Istanbul Daylight Time", + "GMT+03:00", + "Istanbul Time", + "GMT+03:00"}, + {"Asia/Istanbul", Locale.FRANCE, "Istanbul (heure standard)", + "UTC+03:00", + "Istanbul (heure d\u2019\u00e9t\u00e9)", + "UTC+03:00", + "heure : Istanbul", + "UTC+03:00"}, + {"Turkey", Locale.US, "Istanbul Standard Time", + "GMT+03:00", + "Istanbul Daylight Time", + "GMT+03:00", + "Istanbul Time", + "GMT+03:00"}, + {"Turkey", Locale.FRANCE, "Istanbul (heure standard)", + "UTC+03:00", + "Istanbul (heure d\u2019\u00e9t\u00e9)", + "UTC+03:00", + "heure : Istanbul", + "UTC+03:00"}, }; } @@ -154,4 +192,20 @@ assertEquals(ZoneId.of(tzid).getDisplayName(TextStyle.FULL, locale), lgen); assertEquals(ZoneId.of(tzid).getDisplayName(TextStyle.SHORT, locale), sgen); } + + // Make sure getZoneStrings() returns non-empty string array + @Test + public void test_getZoneStrings() { + assertFalse( + Arrays.stream(Locale.getAvailableLocales()) + .peek(l -> System.out.println("Locale: " + l)) + .map(l -> DateFormatSymbols.getInstance(l).getZoneStrings()) + .flatMap(zs -> Arrays.stream(zs)) + .peek(names -> System.out.println(" tz: " + names[0])) + .flatMap(names -> Arrays.stream(names)) + .filter(name -> Objects.isNull(name) || name.isEmpty()) + .findAny() + .isPresent(), + "getZoneStrings() returned array containing non-empty string element(s)"); + } } --- old/make/CopyInterimCLDRConverter.gmk 2020-02-07 13:21:12.000000000 -0800 +++ /dev/null 2020-02-07 13:21:12.000000000 -0800 @@ -1,52 +0,0 @@ -# -# Copyright (c) 2015, 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. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# 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. -# - -default: all - -include $(SPEC) -include MakeBase.gmk - -########################################################################################## - -### CLDRConverter needs the JRE time zone names from the java.base source. - -define cldrconverter_copytznames - $(call MakeTargetDir) - $(RM) '$@' - $(SED) -e "s/package sun.util.resources/package build.tools.cldrconverter/" \ - -e "s/extends TimeZoneNamesBundle//" \ - -e "s/protected final/static final/" \ - < $(<) > $@ -endef - -$(eval $(call SetupCopyFiles,COPY_INTERIM_CLDRCONVERTER, \ - SRC := $(TOPDIR)/src/java.base/share/classes/sun/util/resources, \ - DEST := $(BUILDTOOLS_OUTPUTDIR)/interim_cldrconverter_classes/build/tools/cldrconverter, \ - FILES := TimeZoneNames.java, \ - MACRO := cldrconverter_copytznames)) - -########################################################################################## - -all: $(COPY_INTERIM_CLDRCONVERTER)