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:
Yuka Kamiya 2008-09-08 15:21:55 +09:00
parent f7ea37f1b9
commit c8b6411661
5 changed files with 266 additions and 2 deletions

View File

@ -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 \

View 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]);
}
}
}

View File

@ -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;
}

View 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);
}
}
}
}
}

View 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}