From 35a94b769761bd923fe6db03be672f05c1a74c38 Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Wed, 11 Sep 2024 19:27:00 +0000 Subject: [PATCH] 8339803: Acknowledge case insensitive unambiguous keywords in tzdata files Reviewed-by: jlu, coffeys --- .../tools/cldrconverter/CLDRConverter.java | 35 +++++++++---------- .../tools/tzdb/TzdbZoneRulesProvider.java | 20 ++++++----- test/jdk/sun/util/calendar/zi/RuleRec.java | 9 ++--- test/jdk/sun/util/calendar/zi/Zoneinfo.java | 7 ++-- 4 files changed, 37 insertions(+), 34 deletions(-) diff --git a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java index 15251358a01..0ca2a226a96 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java @@ -1372,6 +1372,7 @@ public class CLDRConverter { private static void generateTZDBShortNamesMap() throws IOException { Files.walk(Path.of(tzDataDir), 1, FileVisitOption.FOLLOW_LINKS) .filter(p -> p.toFile().isFile()) + .filter(p -> p.getFileName().toString().matches("africa|antarctica|asia|australasia|backward|etcetera|europe|northamerica|southamerica")) .forEach(p -> { try { String zone = null; @@ -1394,43 +1395,41 @@ public class CLDRConverter { } // remove comments in-line line = line.replaceAll("[ \t]*#.*", ""); - + var tokens = line.split("[ \t]+", -1); + var token0len = tokens.length > 0 ? tokens[0].length() : 0; // Zone line - if (line.startsWith("Zone")) { + if (token0len > 0 && tokens[0].regionMatches(true, 0, "Zone", 0, token0len)) { if (zone != null) { tzdbShortNamesMap.put(zone, format + NBSP + rule); } - var zl = line.split("[ \t]+", -1); - zone = zl[1]; - rule = zl[3]; - format = flipIfNeeded(inVanguard, zl[4]); + zone = tokens[1]; + rule = tokens[3]; + format = flipIfNeeded(inVanguard, tokens[4]); } else { if (zone != null) { - if (line.startsWith("Rule") || - line.startsWith("Link")) { + if (token0len > 0 && + (tokens[0].regionMatches(true, 0, "Rule", 0, token0len) || + tokens[0].regionMatches(true, 0, "Link", 0, token0len))) { tzdbShortNamesMap.put(zone, format + NBSP + rule); zone = null; rule = null; format = null; } else { - var s = line.split("[ \t]+", -1); - rule = s[2]; - format = flipIfNeeded(inVanguard, s[3]); + rule = tokens[2]; + format = flipIfNeeded(inVanguard, tokens[3]); } } } // Rule line - if (line.startsWith("Rule")) { - var rl = line.split("[ \t]+", -1); - tzdbSubstLetters.put(rl[1] + NBSP + (rl[8].equals("0") ? STD : DST), - rl[9].replace(NO_SUBST, "")); + if (token0len > 0 && tokens[0].regionMatches(true, 0, "Rule", 0, token0len)) { + tzdbSubstLetters.put(tokens[1] + NBSP + (tokens[8].equals("0") ? STD : DST), + tokens[9].replace(NO_SUBST, "")); } // Link line - if (line.startsWith("Link")) { - var ll = line.split("[ \t]+", -1); - tzdbLinks.put(ll[2], ll[1]); + if (token0len > 0 && tokens[0].regionMatches(true, 0, "Link", 0, token0len)) { + tzdbLinks.put(tokens[2], tokens[1]); } } diff --git a/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesProvider.java b/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesProvider.java index 760397255b8..ecca3c69c06 100644 --- a/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesProvider.java +++ b/make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesProvider.java @@ -164,7 +164,8 @@ class TzdbZoneRulesProvider { } continue; } - if (line.startsWith("Zone")) { // parse Zone line + int token0len = tokens.length > 0 ? tokens[0].length() : line.length(); + if (line.regionMatches(true, 0, "Zone", 0, token0len)) { // parse Zone line String name = tokens[1]; if (excludedZones.contains(name)){ continue; @@ -182,13 +183,13 @@ class TzdbZoneRulesProvider { if (zLine.parse(tokens, 2)) { openZone = null; } - } else if (line.startsWith("Rule")) { // parse Rule line + } else if (line.regionMatches(true, 0, "Rule", 0, token0len)) { // parse Rule line String name = tokens[1]; if (!rules.containsKey(name)) { rules.put(name, new ArrayList(10)); } rules.get(name).add(new RuleLine().parse(tokens)); - } else if (line.startsWith("Link")) { // parse link line + } else if (line.regionMatches(true, 0, "Link", 0, token0len)) { // parse link line if (tokens.length >= 3) { String realId = tokens[1]; String aliasId = tokens[2]; @@ -304,7 +305,7 @@ class TzdbZoneRulesProvider { month = parseMonth(tokens[off++]); if (off < tokens.length) { String dayRule = tokens[off++]; - if (dayRule.startsWith("last")) { + if (dayRule.regionMatches(true, 0, "last", 0, 4)) { dayOfMonth = -1; dayOfWeek = parseDayOfWeek(dayRule.substring(4)); adjustForwards = false; @@ -355,11 +356,12 @@ class TzdbZoneRulesProvider { } int parseYear(String year, int defaultYear) { - switch (year.toLowerCase()) { - case "min": return 1900; - case "max": return Year.MAX_VALUE; - case "only": return defaultYear; - } + int len = year.length(); + + if (year.regionMatches(true, 0, "minimum", 0, len)) return 1900; + if (year.regionMatches(true, 0, "maximum", 0, len)) return Year.MAX_VALUE; + if (year.regionMatches(true, 0, "only", 0, len)) return defaultYear; + return Integer.parseInt(year); } diff --git a/test/jdk/sun/util/calendar/zi/RuleRec.java b/test/jdk/sun/util/calendar/zi/RuleRec.java index 6d9d4905d6a..e6e18773d16 100644 --- a/test/jdk/sun/util/calendar/zi/RuleRec.java +++ b/test/jdk/sun/util/calendar/zi/RuleRec.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, 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 @@ -168,12 +168,13 @@ class RuleRec { rec.toYear = Integer.parseInt(token); } catch (NumberFormatException e) { // it's not integer - if ("min".equals(token) || "minimum".equals(token)) { + int len = token.length(); + if (token.regionMatches(true, 0, "minimum", 0, len)) { rec.fromYear = Zoneinfo.getMinYear(); - } else if ("max".equals(token) || "maximum".equals(token)) { + } else if (token.regionMatches(true, 0, "maximum", 0, len)) { rec.toYear = Integer.MAX_VALUE; rec.isLastRule = true; - } else if ("only".equals(token)) { + } else if (token.regionMatches(true, 0, "only", 0, len)) { rec.toYear = rec.fromYear; } else { Main.panic("invalid year value: "+token); diff --git a/test/jdk/sun/util/calendar/zi/Zoneinfo.java b/test/jdk/sun/util/calendar/zi/Zoneinfo.java index f395101d865..e125ad2cb87 100644 --- a/test/jdk/sun/util/calendar/zi/Zoneinfo.java +++ b/test/jdk/sun/util/calendar/zi/Zoneinfo.java @@ -240,8 +240,9 @@ class Zoneinfo { continue; } String token = tokens.nextToken(); + int len = token.length(); - if (continued || "Zone".equals(token)) { + if (continued || token.regionMatches(true, 0, "Zone", 0, len)){ if (zone == null) { if (!tokens.hasMoreTokens()) { panic("syntax error: zone no more token"); @@ -268,7 +269,7 @@ class Zoneinfo { } zone = null; } - } else if ("Rule".equals(token)) { + } else if (token.regionMatches(true, 0, "Rule", 0, len)) { if (!tokens.hasMoreTokens()) { panic("syntax error: rule no more token"); } @@ -281,7 +282,7 @@ class Zoneinfo { RuleRec rrec = RuleRec.parse(tokens); rrec.setLine(line); rule.add(rrec); - } else if ("Link".equals(token)) { + } else if (token.regionMatches(true, 0, "Link", 0, len)) { // Link try { String name1 = tokens.nextToken();