6466476: (tz) Introduction of tzdata2005r can introduce incompatility issues with some JDK1.1 3-letter TZ Ids
Reviewed-by: okutsu
This commit is contained in:
parent
f7ea37f1b9
commit
c8b6411661
@ -209,6 +209,7 @@ JAVA_JAVA_java = \
|
||||
sun/util/TimeZoneNameUtility.java \
|
||||
sun/util/calendar/ZoneInfo.java \
|
||||
sun/util/calendar/ZoneInfoFile.java \
|
||||
sun/util/calendar/TzIDOldMapping.java \
|
||||
java/util/TooManyListenersException.java \
|
||||
java/util/Comparator.java \
|
||||
java/util/Collections.java \
|
||||
|
68
jdk/src/share/classes/sun/util/calendar/TzIDOldMapping.java
Normal file
68
jdk/src/share/classes/sun/util/calendar/TzIDOldMapping.java
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package sun.util.calendar;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
class TzIDOldMapping {
|
||||
static final Map<String, String> MAP = new HashMap<String, String>();
|
||||
static {
|
||||
String[][] oldmap = {
|
||||
{ "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" },
|
||||
{ "EST", "America/New_York" },
|
||||
{ "HST", "Pacific/Honolulu" },
|
||||
{ "IET", "America/Indianapolis" },
|
||||
{ "IST", "Asia/Calcutta" },
|
||||
{ "JST", "Asia/Tokyo" },
|
||||
{ "MIT", "Pacific/Apia" },
|
||||
{ "MST", "America/Denver" },
|
||||
{ "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/Saigon" },
|
||||
};
|
||||
for (String[] pair : oldmap) {
|
||||
MAP.put(pair[0], pair[1]);
|
||||
}
|
||||
}
|
||||
}
|
@ -28,10 +28,12 @@ package sun.util.calendar;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.security.AccessController;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.SimpleTimeZone;
|
||||
import java.util.TimeZone;
|
||||
@ -77,6 +79,14 @@ public class ZoneInfo extends TimeZone {
|
||||
private static final long ABBR_MASK = 0xf00L;
|
||||
private static final int TRANSITION_NSHIFT = 12;
|
||||
|
||||
// Flag for supporting JDK backward compatible IDs, such as "EST".
|
||||
private static final boolean USE_OLDMAPPING;
|
||||
static {
|
||||
String oldmapping = AccessController.doPrivileged(
|
||||
new sun.security.action.GetPropertyAction("sun.timezone.ids.oldmapping", "false")).toLowerCase(Locale.ROOT);
|
||||
USE_OLDMAPPING = (oldmapping.equals("yes") || oldmapping.equals("true"));
|
||||
}
|
||||
|
||||
private static final CalendarSystem gcal = CalendarSystem.getGregorianCalendar();
|
||||
|
||||
/**
|
||||
@ -595,9 +605,21 @@ public class ZoneInfo extends TimeZone {
|
||||
* time zone of the ID.
|
||||
*/
|
||||
public static TimeZone getTimeZone(String ID) {
|
||||
ZoneInfo zi = null;
|
||||
String givenID = null;
|
||||
|
||||
zi = ZoneInfoFile.getZoneInfo(ID);
|
||||
/*
|
||||
* If old JDK compatibility is specified, get the old alias
|
||||
* name.
|
||||
*/
|
||||
if (USE_OLDMAPPING) {
|
||||
String compatibleID = TzIDOldMapping.MAP.get(ID);
|
||||
if (compatibleID != null) {
|
||||
givenID = ID;
|
||||
ID = compatibleID;
|
||||
}
|
||||
}
|
||||
|
||||
ZoneInfo zi = ZoneInfoFile.getZoneInfo(ID);
|
||||
if (zi == null) {
|
||||
// if we can't create an object for the ID, try aliases.
|
||||
try {
|
||||
@ -616,6 +638,10 @@ public class ZoneInfo extends TimeZone {
|
||||
// ignore exceptions
|
||||
}
|
||||
}
|
||||
|
||||
if (givenID != null && zi != null) {
|
||||
zi.setID(givenID);
|
||||
}
|
||||
return zi;
|
||||
}
|
||||
|
||||
|
110
jdk/test/java/util/TimeZone/OldIDMappingTest.java
Normal file
110
jdk/test/java/util/TimeZone/OldIDMappingTest.java
Normal file
@ -0,0 +1,110 @@
|
||||
/*
|
||||
* Copyright 2008 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* See OldMappingTest.sh
|
||||
*/
|
||||
|
||||
import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
|
||||
public class OldIDMappingTest {
|
||||
private static final String MAPPING_PROPERTY_NAME = "sun.timezone.ids.oldmapping";
|
||||
private static final Map<String, String> newmap = new HashMap<String, String>();
|
||||
static {
|
||||
// Add known new mappings
|
||||
newmap.put("EST", "EST");
|
||||
newmap.put("MST", "MST");
|
||||
newmap.put("HST", "HST");
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
boolean useOldMapping = true;
|
||||
String arg = args[0];
|
||||
if (arg.equals("-new")) {
|
||||
useOldMapping = false;
|
||||
} else if (arg.equals("-old")) {
|
||||
useOldMapping = true;
|
||||
} else {
|
||||
throw new RuntimeException("-old or -new must be specified; got " + arg);
|
||||
}
|
||||
|
||||
// Get a Field for TzIDOldMapping in sun.util.calendar.
|
||||
Map<String, String> oldmap = null;
|
||||
try {
|
||||
Class<?> oldmapClass = Class.forName("sun.util.calendar.TzIDOldMapping");
|
||||
Field map = oldmapClass.getDeclaredField("MAP");
|
||||
map.setAccessible(true);
|
||||
oldmap = (Map<String, String>) map.get(null);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("can't get TzIDOldMapping.MAP", e);
|
||||
}
|
||||
|
||||
String prop = System.getProperty(MAPPING_PROPERTY_NAME);
|
||||
System.out.println(MAPPING_PROPERTY_NAME + "=" + prop);
|
||||
|
||||
// Try the test multiple times with modifying TimeZones to
|
||||
// make sure TimeZone instances for the old mapping are
|
||||
// properly copied (defensive copy).
|
||||
for (int count = 0; count < 3; count++) {
|
||||
for (String id : oldmap.keySet()) {
|
||||
TimeZone tzAlias = TimeZone.getTimeZone(id);
|
||||
TimeZone tz = TimeZone.getTimeZone(oldmap.get(id));
|
||||
if (useOldMapping) {
|
||||
if (!tzAlias.hasSameRules(tz)) {
|
||||
throw new RuntimeException("OLDMAP: " + MAPPING_PROPERTY_NAME + "=" + prop + ": "
|
||||
+ id + " isn't an alias of " + oldmap.get(id));
|
||||
}
|
||||
if (count == 0) {
|
||||
System.out.println(" " + id + " => " + oldmap.get(id));
|
||||
}
|
||||
tzAlias.setRawOffset(tzAlias.getRawOffset() * count);
|
||||
} else {
|
||||
if (!newmap.containsKey(id)) {
|
||||
// ignore ids not contained in the new map
|
||||
if (count == 0) {
|
||||
System.out.println(" " + id + " => " + oldmap.get(id));
|
||||
}
|
||||
tzAlias.setRawOffset(tzAlias.getRawOffset() * count);
|
||||
continue;
|
||||
}
|
||||
if (tzAlias.hasSameRules(tz)) {
|
||||
throw new RuntimeException("NEWMAP: " + MAPPING_PROPERTY_NAME + "=" + prop + ": "
|
||||
+ id + " is an alias of " + oldmap.get(id));
|
||||
}
|
||||
tz = TimeZone.getTimeZone(newmap.get(id));
|
||||
if (!tzAlias.hasSameRules(tz)) {
|
||||
throw new RuntimeException("NEWMAP: " + MAPPING_PROPERTY_NAME + "=" + prop + ": "
|
||||
+ id + " isn't an alias of " + newmap.get(id));
|
||||
}
|
||||
if (count == 0) {
|
||||
System.out.println(" " + id + " => " + newmap.get(id));
|
||||
}
|
||||
tzAlias.setRawOffset(tzAlias.getRawOffset() * count);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
59
jdk/test/java/util/TimeZone/OldIDMappingTest.sh
Normal file
59
jdk/test/java/util/TimeZone/OldIDMappingTest.sh
Normal file
@ -0,0 +1,59 @@
|
||||
# Copyright 2003-2004 Sun Microsystems, Inc. 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. Sun designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
# have any questions.
|
||||
|
||||
# @test
|
||||
# @bug 6466476
|
||||
# @summary Compatibility test for the old JDK ID mapping and Olson IDs
|
||||
# @build OldIDMappingTest
|
||||
# @run shell OldIDMappingTest.sh
|
||||
|
||||
: ${TESTJAVA:=${JAVA_HOME}}
|
||||
: ${TESTCLASSES:="`pwd`"}
|
||||
|
||||
JAVA="${TESTJAVA}/bin/java"
|
||||
|
||||
STATUS=0
|
||||
|
||||
# Expecting the new (Olson compatible) mapping (default)
|
||||
for I in "" " " no No NO false False FALSE Hello
|
||||
do
|
||||
if [ x"$I" != x ]; then
|
||||
D="-Dsun.timezone.ids.oldmapping=${I}"
|
||||
fi
|
||||
if ! ${JAVA} ${D} -cp ${TESTCLASSES} OldIDMappingTest -new; then
|
||||
STATUS=1
|
||||
fi
|
||||
done
|
||||
|
||||
# Expecting the old mapping
|
||||
for I in true True TRUE yes Yes YES
|
||||
do
|
||||
if [ "x$I" != x ]; then
|
||||
D="-Dsun.timezone.ids.oldmapping=${I}"
|
||||
fi
|
||||
if ! ${JAVA} ${D} -cp ${TESTCLASSES} OldIDMappingTest -old; then
|
||||
STATUS=1
|
||||
fi
|
||||
done
|
||||
|
||||
exit ${STATUS}
|
Loading…
Reference in New Issue
Block a user