Skip to content

Commit

Permalink
8339644: Improve parsing of Day/Month in tzdata rules
Browse files Browse the repository at this point in the history
Backport-of: 86a2f9c7dcb6585cabf03c0940511d11560e85b7
  • Loading branch information
GoeLin committed Sep 19, 2024
1 parent 8183981 commit 5faa0df
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 60 deletions.
50 changes: 26 additions & 24 deletions make/jdk/src/classes/build/tools/tzdb/TzdbZoneRulesProvider.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 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
Expand Down Expand Up @@ -364,33 +364,35 @@ int parseYear(String year, int defaultYear) {
}

Month parseMonth(String mon) {
switch (mon) {
case "Jan": return Month.JANUARY;
case "Feb": return Month.FEBRUARY;
case "Mar": return Month.MARCH;
case "Apr": return Month.APRIL;
case "May": return Month.MAY;
case "Jun": return Month.JUNE;
case "Jul": return Month.JULY;
case "Aug": return Month.AUGUST;
case "Sep": return Month.SEPTEMBER;
case "Oct": return Month.OCTOBER;
case "Nov": return Month.NOVEMBER;
case "Dec": return Month.DECEMBER;
}
int len = mon.length();

if (mon.regionMatches(true, 0, "January", 0, len)) return Month.JANUARY;
if (mon.regionMatches(true, 0, "February", 0, len)) return Month.FEBRUARY;
if (mon.regionMatches(true, 0, "March", 0, len)) return Month.MARCH;
if (mon.regionMatches(true, 0, "April", 0, len)) return Month.APRIL;
if (mon.regionMatches(true, 0, "May", 0, len)) return Month.MAY;
if (mon.regionMatches(true, 0, "June", 0, len)) return Month.JUNE;
if (mon.regionMatches(true, 0, "July", 0, len)) return Month.JULY;
if (mon.regionMatches(true, 0, "August", 0, len)) return Month.AUGUST;
if (mon.regionMatches(true, 0, "September", 0, len)) return Month.SEPTEMBER;
if (mon.regionMatches(true, 0, "October", 0, len)) return Month.OCTOBER;
if (mon.regionMatches(true, 0, "November", 0, len)) return Month.NOVEMBER;
if (mon.regionMatches(true, 0, "December", 0, len)) return Month.DECEMBER;

throw new IllegalArgumentException("Unknown month: " + mon);
}

DayOfWeek parseDayOfWeek(String dow) {
switch (dow) {
case "Mon": return DayOfWeek.MONDAY;
case "Tue": return DayOfWeek.TUESDAY;
case "Wed": return DayOfWeek.WEDNESDAY;
case "Thu": return DayOfWeek.THURSDAY;
case "Fri": return DayOfWeek.FRIDAY;
case "Sat": return DayOfWeek.SATURDAY;
case "Sun": return DayOfWeek.SUNDAY;
}
int len = dow.length();

if (dow.regionMatches(true, 0, "Monday", 0, len)) return DayOfWeek.MONDAY;
if (dow.regionMatches(true, 0, "Tuesday", 0, len)) return DayOfWeek.TUESDAY;
if (dow.regionMatches(true, 0, "Wednesday", 0, len)) return DayOfWeek.WEDNESDAY;
if (dow.regionMatches(true, 0, "Thursday", 0, len)) return DayOfWeek.THURSDAY;
if (dow.regionMatches(true, 0, "Friday", 0, len)) return DayOfWeek.FRIDAY;
if (dow.regionMatches(true, 0, "Saturday", 0, len)) return DayOfWeek.SATURDAY;
if (dow.regionMatches(true, 0, "Sunday", 0, len)) return DayOfWeek.SUNDAY;

throw new IllegalArgumentException("Unknown day-of-week: " + dow);
}

Expand Down
37 changes: 17 additions & 20 deletions test/jdk/sun/util/calendar/zi/Month.java
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -21,11 +21,6 @@
* questions.
*/

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* Month enum handles month related manipulation.
*
Expand All @@ -47,15 +42,6 @@ enum Month {

private final String abbr;

private static final Map<String,Month> abbreviations
= new HashMap<String,Month>(12);

static {
for (Month m : Month.values()) {
abbreviations.put(m.abbr, m);
}
}

private Month(String abbr) {
this.abbr = abbr;
}
Expand All @@ -70,11 +56,22 @@ int value() {
* @return the Month value
*/
static Month parse(String name) {
Month m = abbreviations.get(name);
if (m != null) {
return m;
}
return null;
int len = name.length();

if (name.regionMatches(true, 0, "January", 0, len)) return Month.JANUARY;
if (name.regionMatches(true, 0, "February", 0, len)) return Month.FEBRUARY;
if (name.regionMatches(true, 0, "March", 0, len)) return Month.MARCH;
if (name.regionMatches(true, 0, "April", 0, len)) return Month.APRIL;
if (name.regionMatches(true, 0, "May", 0, len)) return Month.MAY;
if (name.regionMatches(true, 0, "June", 0, len)) return Month.JUNE;
if (name.regionMatches(true, 0, "July", 0, len)) return Month.JULY;
if (name.regionMatches(true, 0, "August", 0, len)) return Month.AUGUST;
if (name.regionMatches(true, 0, "September", 0, len)) return Month.SEPTEMBER;
if (name.regionMatches(true, 0, "October", 0, len)) return Month.OCTOBER;
if (name.regionMatches(true, 0, "November", 0, len)) return Month.NOVEMBER;
if (name.regionMatches(true, 0, "December", 0, len)) return Month.DECEMBER;

throw new IllegalArgumentException("Unknown month: " + name);
}

/**
Expand Down
30 changes: 14 additions & 16 deletions test/jdk/sun/util/calendar/zi/RuleDay.java
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -21,11 +21,6 @@
* questions.
*/

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* RuleDay class represents the value of the "ON" field. The day of
* week values start from 1 following the {@link java.util.Calendar}
Expand All @@ -34,13 +29,6 @@
* @since 1.4
*/
class RuleDay {
private static final Map<String,DayOfWeek> abbreviations = new HashMap<String,DayOfWeek>(7);
static {
for (DayOfWeek day : DayOfWeek.values()) {
abbreviations.put(day.getAbbr(), day);
}
}

private String dayName = null;
private DayOfWeek dow;
private boolean lastOne = false;
Expand Down Expand Up @@ -166,13 +154,23 @@ String getDayOfWeekForSimpleTimeZone() {
return sign + toString(d);
}

private static DayOfWeek getDOW(String abbr) {
return abbreviations.get(abbr);
private static DayOfWeek getDOW(String name) {
int len = name.length();

if (name.regionMatches(true, 0, "Monday", 0, len)) return DayOfWeek.MONDAY;
if (name.regionMatches(true, 0, "Tuesday", 0, len)) return DayOfWeek.TUESDAY;
if (name.regionMatches(true, 0, "Wednesday", 0, len)) return DayOfWeek.WEDNESDAY;
if (name.regionMatches(true, 0, "Thursday", 0, len)) return DayOfWeek.THURSDAY;
if (name.regionMatches(true, 0, "Friday", 0, len)) return DayOfWeek.FRIDAY;
if (name.regionMatches(true, 0, "Saturday", 0, len)) return DayOfWeek.SATURDAY;
if (name.regionMatches(true, 0, "Sunday", 0, len)) return DayOfWeek.SUNDAY;

throw new IllegalArgumentException("Unknown day-of-week: " + name);
}

/**
* Converts the specified day of week value to the day-of-week
* name defined in {@link java.util.Calenda}.
* name defined in {@link java.util.Calendar}.
* @param dow 1-based day of week value
* @return the Calendar day of week name with "Calendar." prefix.
* @throws IllegalArgumentException if the specified dow value is out of range.
Expand Down

0 comments on commit 5faa0df

Please sign in to comment.