From 2995d0813b774d081cdc02d986985eba3e6c5778 Mon Sep 17 00:00:00 2001 From: Lutz Schmidt Date: Wed, 10 May 2023 14:00:06 +0000 Subject: [PATCH] 8209880: tzdb.dat is not reproducibly built Reviewed-by: clanger Backport-of: e71557a2d9e3a3d84fb2d4cea02c4364258f0249 --- .../build/tools/tzdb/TzdbZoneRulesCompiler.java | 9 +++++---- .../build/tools/tzdb/TzdbZoneRulesProvider.java | 12 ++++++------ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesCompiler.java b/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesCompiler.java index 148cdbc3eca..39aa5e35d6e 100644 --- a/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesCompiler.java +++ b/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesCompiler.java @@ -65,8 +65,6 @@ import java.text.ParsePosition; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; @@ -76,6 +74,7 @@ import java.util.regex.Matcher; import java.util.regex.MatchResult; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * A compiler that reads a set of TZDB time-zone files and builds a single @@ -256,8 +255,10 @@ private void outputFile(Path dstFile, String version, for (String regionId : regionArray) { out.writeUTF(regionId); } - // rules -- hashset -> remove the dup - List rulesList = new ArrayList<>(new HashSet<>(builtZones.values())); + // rules -- remove the dup + List rulesList = builtZones.values().stream() + .distinct() + .collect(Collectors.toList()); out.writeShort(rulesList.size()); ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); for (ZoneRules rules : rulesList) { diff --git a/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesProvider.java b/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesProvider.java index 2622a8f9267..f02537c305d 100644 --- a/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesProvider.java +++ b/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesProvider.java @@ -33,7 +33,7 @@ import java.nio.file.Paths; import java.util.*; import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; import java.time.*; import java.time.Year; import java.time.chrono.IsoChronology; @@ -119,18 +119,18 @@ public ZoneRules getZoneRules(String zoneId) { /** * Zone region to rules mapping */ - private final Map zones = new ConcurrentHashMap<>(); + private final Map zones = new ConcurrentSkipListMap<>(); /** * compatibility list */ - private static HashSet excludedZones; + private static Set excludedZones; static { // (1) exclude EST, HST and MST. They are supported // via the short-id mapping // (2) remove UTC and GMT // (3) remove ROC, which is not supported in j.u.tz - excludedZones = new HashSet<>(10); + excludedZones = new TreeSet<>(); excludedZones.add("EST"); excludedZones.add("HST"); excludedZones.add("MST"); @@ -139,8 +139,8 @@ public ZoneRules getZoneRules(String zoneId) { excludedZones.add("ROC"); } - private Map links = new HashMap<>(150); - private Map> rules = new HashMap<>(500); + private Map links = new TreeMap<>(); + private Map> rules = new TreeMap<>(); private void load(List files) throws IOException {