From e71557a2d9e3a3d84fb2d4cea02c4364258f0249 Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Tue, 18 Sep 2018 12:42:40 -0700 Subject: [PATCH] 8209880: tzdb.dat is not reproducibly built Reviewed-by: erikj, rriggs --- .../build/tools/tzdb/TzdbZoneRulesCompiler.java | 11 ++++++----- .../build/tools/tzdb/TzdbZoneRulesProvider.java | 16 +++++++--------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesCompiler.java b/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesCompiler.java index 8cbdd0d44ff..7e5e10d6e72 100644 --- a/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesCompiler.java +++ b/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesCompiler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -65,8 +65,6 @@ import java.nio.file.Paths; 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.TreeMap; 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 @@ public final class TzdbZoneRulesCompiler { 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 488a1add46d..9a687a89b46 100644 --- a/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesProvider.java +++ b/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 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 @@ -33,8 +33,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -43,7 +41,7 @@ import java.util.Objects; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; -import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; import java.time.*; import java.time.Year; import java.time.chrono.IsoChronology; @@ -131,18 +129,18 @@ class TzdbZoneRulesProvider { /** * 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"); @@ -151,8 +149,8 @@ class TzdbZoneRulesProvider { 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 {