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