--- old/src/share/classes/sun/util/calendar/ZoneInfoFile.java 2009-08-25 15:26:32.294757718 +0100 +++ new/src/share/classes/sun/util/calendar/ZoneInfoFile.java 2009-08-25 15:26:32.097693344 +0100 @@ -25,10 +25,12 @@ package sun.util.calendar; +import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.lang.ref.SoftReference; import java.security.AccessController; import java.security.PrivilegedAction; @@ -38,6 +40,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; /** * ZoneInfoFile reads Zone information files in the @@ -465,6 +468,42 @@ */ public static final byte TAG_TZDataVersion = 68; + // Cached location of the TZDATA files + private static final String JAVAZI_DIR = setupZoneInfoDir(); + + private static String setupZoneInfoDir() { + final String homeDir = + AccessController.doPrivileged(new sun.security.action.GetPropertyAction("java.home")); + if (homeDir == null) { + throw new Error("java.home is not set"); + } + final String jdkDir = homeDir + File.separator + "lib" + + File.separator + "zi"; + try { + return AccessController.doPrivileged + (new PrivilegedExceptionAction() { + public String run() throws IOException { + File f = new File(homeDir + File.separator + "lib" + + File.separator + "tz.properties"); + InputStream in = new FileInputStream(f); + BufferedInputStream bin = new BufferedInputStream(in); + Properties props = new Properties(); + props.load(bin); + bin.close(); + String dir = props.getProperty("sun.zoneinfo.dir"); + if (dir == null) + return jdkDir; + File zim = new File(dir, "ZoneInfoMappings"); + if (zim.exists()) + return dir; + return jdkDir; + } + }); + } catch (PrivilegedActionException e) { + return jdkDir; + } + } + /** * Excluded zones item tag. (Added in Mustang) */ @@ -1021,12 +1060,9 @@ byte[] buffer = null; try { - String homeDir = AccessController.doPrivileged( - new sun.security.action.GetPropertyAction("java.home")); - final String fname = homeDir + File.separator + "lib" + File.separator - + "zi" + File.separator + fileName; - buffer = (byte[]) AccessController.doPrivileged(new PrivilegedExceptionAction() { - public Object run() throws IOException { + final String fname = JAVAZI_DIR + File.separator + fileName; + buffer = AccessController.doPrivileged(new PrivilegedExceptionAction() { + public byte[] run() throws IOException { File file = new File(fname); if (!file.canRead()) { return null;