Merge
This commit is contained in:
commit
f0e73ec3ba
@ -348,7 +348,6 @@ TOOLS = \
|
|||||||
sun/tools/serialver \
|
sun/tools/serialver \
|
||||||
sun/tools/tree \
|
sun/tools/tree \
|
||||||
sun/tools/util \
|
sun/tools/util \
|
||||||
sun/security/tools/jarsigner/JarBASE64Encoder.class \
|
|
||||||
sun/security/tools/jarsigner/Main.class \
|
sun/security/tools/jarsigner/Main.class \
|
||||||
sun/security/tools/jarsigner/JarSignerParameters.class \
|
sun/security/tools/jarsigner/JarSignerParameters.class \
|
||||||
sun/security/tools/jarsigner/Resources.class \
|
sun/security/tools/jarsigner/Resources.class \
|
||||||
@ -576,7 +575,6 @@ $(NOT_RT_JAR_LIST): FRC
|
|||||||
$(ECHO) "sun/tools/serialver/" >> $@
|
$(ECHO) "sun/tools/serialver/" >> $@
|
||||||
$(ECHO) "sun/tools/tree/" >> $@
|
$(ECHO) "sun/tools/tree/" >> $@
|
||||||
$(ECHO) "sun/tools/util/" >> $@
|
$(ECHO) "sun/tools/util/" >> $@
|
||||||
$(ECHO) "sun/security/tools/jarsigner/JarBASE64Encoder.class" >> $@
|
|
||||||
$(ECHO) "sun/security/tools/jarsigner/Main.class" >> $@
|
$(ECHO) "sun/security/tools/jarsigner/Main.class" >> $@
|
||||||
$(ECHO) "sun/security/tools/jarsigner/JarSignerParameters.class" >> $@
|
$(ECHO) "sun/security/tools/jarsigner/JarSignerParameters.class" >> $@
|
||||||
$(ECHO) "sun/security/tools/jarsigner/Resources.class" >> $@
|
$(ECHO) "sun/security/tools/jarsigner/Resources.class" >> $@
|
||||||
|
@ -257,6 +257,7 @@ JAVA_JAVA_java = \
|
|||||||
sun/util/calendar/ZoneInfoFile.java \
|
sun/util/calendar/ZoneInfoFile.java \
|
||||||
java/util/TooManyListenersException.java \
|
java/util/TooManyListenersException.java \
|
||||||
java/util/Comparator.java \
|
java/util/Comparator.java \
|
||||||
|
java/util/Comparators.java \
|
||||||
java/util/Collections.java \
|
java/util/Collections.java \
|
||||||
java/util/Iterator.java \
|
java/util/Iterator.java \
|
||||||
java/util/ListIterator.java \
|
java/util/ListIterator.java \
|
||||||
|
@ -68,6 +68,16 @@ ifeq ($(PLATFORM), solaris)
|
|||||||
FILES_reorder += reorder-$(ARCH)
|
FILES_reorder += reorder-$(ARCH)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
#
|
||||||
|
# Use mapfile unconditionally (even with fastdebug).
|
||||||
|
# JDK's internal zlib is incompatible with stock zlib, because the
|
||||||
|
# size of struct z_stream has been changed, so internal zlib
|
||||||
|
# implementation must not be allowed to leak outside of libzip.so,
|
||||||
|
# else you get hard to debug failures with fastdebug jdk when user
|
||||||
|
# native code includes stock zlib.
|
||||||
|
#
|
||||||
|
FILES_m = mapfile-vers
|
||||||
include $(BUILDDIR)/common/Mapfile-vers.gmk
|
include $(BUILDDIR)/common/Mapfile-vers.gmk
|
||||||
include $(BUILDDIR)/common/Library.gmk
|
include $(BUILDDIR)/common/Library.gmk
|
||||||
|
|
||||||
|
@ -77,6 +77,7 @@ $(call make-launcher, jmap, sun.tools.jmap.JMap, \
|
|||||||
-J-Dsun.jvm.hotspot.debugger.useWindbgDebugger, )
|
-J-Dsun.jvm.hotspot.debugger.useWindbgDebugger, )
|
||||||
$(call make-launcher, jps, sun.tools.jps.Jps, , )
|
$(call make-launcher, jps, sun.tools.jps.Jps, , )
|
||||||
$(call make-launcher, jrunscript, com.sun.tools.script.shell.Main, , )
|
$(call make-launcher, jrunscript, com.sun.tools.script.shell.Main, , )
|
||||||
|
$(call make-launcher, jjs, jdk.nashorn.tools.Shell, , )
|
||||||
$(call make-launcher, jsadebugd, sun.jvm.hotspot.jdi.SADebugServer, , )
|
$(call make-launcher, jsadebugd, sun.jvm.hotspot.jdi.SADebugServer, , )
|
||||||
$(call make-launcher, jstack, sun.tools.jstack.JStack, \
|
$(call make-launcher, jstack, sun.tools.jstack.JStack, \
|
||||||
-J-Dsun.jvm.hotspot.debugger.useProcDebugger \
|
-J-Dsun.jvm.hotspot.debugger.useProcDebugger \
|
||||||
|
@ -28,6 +28,9 @@ PACKAGE = sun.java2d.cmm.lcms
|
|||||||
LIBRARY = lcms
|
LIBRARY = lcms
|
||||||
PRODUCT = sun
|
PRODUCT = sun
|
||||||
|
|
||||||
|
# Use highest level of optimization on this library
|
||||||
|
OPTIMIZATION_LEVEL = HIGHEST
|
||||||
|
|
||||||
include $(BUILDDIR)/common/Defs.gmk
|
include $(BUILDDIR)/common/Defs.gmk
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -27,13 +27,12 @@
|
|||||||
|
|
||||||
SUNWprivate_1.1 {
|
SUNWprivate_1.1 {
|
||||||
global:
|
global:
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_loadProfile;
|
Java_sun_java2d_cmm_lcms_LCMS_loadProfileNative;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_freeProfile;
|
Java_sun_java2d_cmm_lcms_LCMS_freeProfileNative;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_getProfileSize;
|
Java_sun_java2d_cmm_lcms_LCMS_getProfileSize;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_getProfileData;
|
Java_sun_java2d_cmm_lcms_LCMS_getProfileData;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_getTagSize;
|
Java_sun_java2d_cmm_lcms_LCMS_getTagNative;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_getTagData;
|
Java_sun_java2d_cmm_lcms_LCMS_setTagDataNative;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_setTagData;
|
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_colorConvert;
|
Java_sun_java2d_cmm_lcms_LCMS_colorConvert;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_getProfileID;
|
Java_sun_java2d_cmm_lcms_LCMS_getProfileID;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_initLCMS;
|
Java_sun_java2d_cmm_lcms_LCMS_initLCMS;
|
||||||
|
@ -1,43 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 1998, 2005, 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
|
|
||||||
# under the terms of the GNU General Public License version 2 only, as
|
|
||||||
# published by the Free Software Foundation. Oracle designates this
|
|
||||||
# particular file as subject to the "Classpath" exception as provided
|
|
||||||
# by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
# or visit www.oracle.com if you need additional information or have any
|
|
||||||
# questions.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Makefile for building the javazic tool
|
|
||||||
#
|
|
||||||
|
|
||||||
BUILDDIR = ../..
|
|
||||||
PACKAGE = build.tools.javazic
|
|
||||||
PRODUCT = javazic
|
|
||||||
PROGRAM = javazic
|
|
||||||
include $(BUILDDIR)/common/Defs.gmk
|
|
||||||
|
|
||||||
BUILDTOOL_SOURCE_ROOT = $(BUILDDIR)/tools/src
|
|
||||||
BUILDTOOL_MAIN = $(PKGDIR)/Main.java
|
|
||||||
|
|
||||||
#
|
|
||||||
# Build tool jar rules.
|
|
||||||
#
|
|
||||||
include $(BUILDDIR)/common/BuildToolJar.gmk
|
|
||||||
|
|
@ -33,8 +33,3 @@ sun.security.krb5.Realm=sun.security.ssl.krb5.KerberosClientKeyExchangeImpl,comp
|
|||||||
#
|
#
|
||||||
java.beans.PropertyChangeListener=java.util.logging.LogManager,sun.org.mozilla.javascript.internal.Context,compact1,compact2,compact3
|
java.beans.PropertyChangeListener=java.util.logging.LogManager,sun.org.mozilla.javascript.internal.Context,compact1,compact2,compact3
|
||||||
java.beans.PropertyChangeEvent=sun.org.mozilla.javascript.internal.Context,compact3
|
java.beans.PropertyChangeEvent=sun.org.mozilla.javascript.internal.Context,compact3
|
||||||
|
|
||||||
# JFR traces even in builds with JFR disabled
|
|
||||||
com.oracle.jrockit.jfr.FlightRecorder: com.sun.management.MissionControl, compact3
|
|
||||||
com.oracle.jrockit.jfr.management.FlightRecorderMBean: com.sun.management.MissionControl, compact3
|
|
||||||
|
|
||||||
|
@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2004, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <code>BackEnd</code> is an abstract base class for a back-end of compiling
|
|
||||||
* Olson's zoneinfo database and generating Java zoneinfo database.
|
|
||||||
*
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
abstract class BackEnd {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Receives each zone's TimeZone information which was created by
|
|
||||||
* {@link Zoneinfo#parse} in class <code>Zoneinfo</code>,
|
|
||||||
* and processes it.
|
|
||||||
*
|
|
||||||
* @param tz Timezone object for each zone
|
|
||||||
* @return 0 if no error occurred, otherwise 1.
|
|
||||||
*/
|
|
||||||
abstract int processZoneinfo(Timezone tz);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Receives whole information which is generated by JavaZic's front-end
|
|
||||||
* in the form of Mapping object and generates all Java zone information
|
|
||||||
* files.
|
|
||||||
*
|
|
||||||
* @param m Mappings object which is generated by
|
|
||||||
* {@link Main#compile() Main.compile()}.
|
|
||||||
* @return 0 if no error occurred, otherwise 1.
|
|
||||||
*/
|
|
||||||
abstract int generateSrc(Mappings m);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decides which backend class should be used and returns its instance.
|
|
||||||
* @return an instance of backend class
|
|
||||||
*/
|
|
||||||
static BackEnd getBackEnd() {
|
|
||||||
if (Zoneinfo.isYearForTimeZoneDataSpecified) {
|
|
||||||
return new Simple();
|
|
||||||
} else if (Main.outputDoc) {
|
|
||||||
return new GenDoc();
|
|
||||||
} else {
|
|
||||||
return new Gen();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,69 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.util.zip.CRC32;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checksum provides methods for calculating a CRC32 value for a
|
|
||||||
* transitions table.
|
|
||||||
*
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
public class Checksum extends CRC32
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Updates the CRC32 value from each byte of the given int
|
|
||||||
* value. The bytes are used in the big endian order.
|
|
||||||
* @param val the int value
|
|
||||||
*/
|
|
||||||
public void update(int val) {
|
|
||||||
byte[] b = new byte[4];
|
|
||||||
b[0] = (byte)((val >>> 24) & 0xff);
|
|
||||||
b[1] = (byte)((val >>> 16) & 0xff);
|
|
||||||
b[2] = (byte)((val >>> 8) & 0xff);
|
|
||||||
b[3] = (byte)(val & 0xff);
|
|
||||||
update(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the CRC32 value from each byte of the given long
|
|
||||||
* value. The bytes are used in the big endian order.
|
|
||||||
* @param val the long value
|
|
||||||
*/
|
|
||||||
void update(long val) {
|
|
||||||
byte[] b = new byte[8];
|
|
||||||
b[0] = (byte)((val >>> 56) & 0xff);
|
|
||||||
b[1] = (byte)((val >>> 48) & 0xff);
|
|
||||||
b[2] = (byte)((val >>> 40) & 0xff);
|
|
||||||
b[3] = (byte)((val >>> 32) & 0xff);
|
|
||||||
b[4] = (byte)((val >>> 24) & 0xff);
|
|
||||||
b[5] = (byte)((val >>> 16) & 0xff);
|
|
||||||
b[6] = (byte)((val >>> 8) & 0xff);
|
|
||||||
b[7] = (byte)(val & 0xff);
|
|
||||||
update(b);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,347 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2011, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.RandomAccessFile;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import sun.util.calendar.ZoneInfoFile;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <code>Gen</code> is one of back-end classes of javazic, and generates
|
|
||||||
* ZoneInfoMappings and zone-specific file for each zone.
|
|
||||||
*/
|
|
||||||
class Gen extends BackEnd {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates datafile in binary TLV format for each time zone.
|
|
||||||
* Regarding contents of output files, see {@link ZoneInfoFile}.
|
|
||||||
*
|
|
||||||
* @param Timezone
|
|
||||||
* @return 0 if no errors, or 1 if error occurred.
|
|
||||||
*/
|
|
||||||
int processZoneinfo(Timezone tz) {
|
|
||||||
try {
|
|
||||||
int size;
|
|
||||||
String outputDir = Main.getOutputDir();
|
|
||||||
String zonefile = ZoneInfoFile.getFileName(tz.getName());
|
|
||||||
|
|
||||||
/* If outputDir doesn't end with file-separator, adds it. */
|
|
||||||
if (!outputDir.endsWith(File.separator)) {
|
|
||||||
outputDir += File.separatorChar;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If zonefile includes file-separator, it's treated as part of
|
|
||||||
* pathname. And make directory if necessary.
|
|
||||||
*/
|
|
||||||
int index = zonefile.lastIndexOf(File.separatorChar);
|
|
||||||
if (index != -1) {
|
|
||||||
outputDir += zonefile.substring(0, index+1);
|
|
||||||
}
|
|
||||||
File outD = new File(outputDir);
|
|
||||||
outD.mkdirs();
|
|
||||||
|
|
||||||
FileOutputStream fos =
|
|
||||||
new FileOutputStream(outputDir + zonefile.substring(index+1));
|
|
||||||
DataOutputStream dos = new DataOutputStream(fos);
|
|
||||||
|
|
||||||
/* Output Label */
|
|
||||||
dos.write(ZoneInfoFile.JAVAZI_LABEL, 0,
|
|
||||||
ZoneInfoFile.JAVAZI_LABEL.length);
|
|
||||||
|
|
||||||
/* Output Version of ZoneInfoFile */
|
|
||||||
dos.writeByte(ZoneInfoFile.JAVAZI_VERSION);
|
|
||||||
|
|
||||||
List<Long> transitions = tz.getTransitions();
|
|
||||||
if (transitions != null) {
|
|
||||||
List<Integer> dstOffsets = tz.getDstOffsets();
|
|
||||||
List<Integer> offsets = tz.getOffsets();
|
|
||||||
|
|
||||||
if ((dstOffsets == null && offsets != null) ||
|
|
||||||
(dstOffsets != null && offsets == null)) {
|
|
||||||
Main.panic("Data not exist. (dstOffsets or offsets)");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Output Transition records */
|
|
||||||
dos.writeByte(ZoneInfoFile.TAG_Transition);
|
|
||||||
size = transitions.size();
|
|
||||||
dos.writeShort((size * 8) & 0xFFFF);
|
|
||||||
int dstoffset;
|
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
/* if DST offset is 0, this means DST isn't used.
|
|
||||||
* (NOT: offset's index is 0.)
|
|
||||||
*/
|
|
||||||
if ((dstoffset = dstOffsets.get(i).intValue()) == -1) {
|
|
||||||
dstoffset = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
dos.writeLong((transitions.get(i).longValue() << 12)
|
|
||||||
| (dstoffset << 4)
|
|
||||||
| offsets.get(i).intValue());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Output data for GMTOffset */
|
|
||||||
List<Integer> gmtoffset = tz.getGmtOffsets();
|
|
||||||
dos.writeByte(ZoneInfoFile.TAG_Offset);
|
|
||||||
size = gmtoffset.size();
|
|
||||||
dos.writeShort((size * 4) & 0xFFFF);
|
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
dos.writeInt(gmtoffset.get(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Output data for SimpleTimeZone */
|
|
||||||
List<RuleRec> stz = tz.getLastRules();
|
|
||||||
if (stz != null) {
|
|
||||||
RuleRec[] rr = new RuleRec[2];
|
|
||||||
boolean wall = true;
|
|
||||||
|
|
||||||
rr[0] = stz.get(0);
|
|
||||||
rr[1] = stz.get(1);
|
|
||||||
|
|
||||||
dos.writeByte(ZoneInfoFile.TAG_SimpleTimeZone);
|
|
||||||
wall = rr[0].getTime().isWall() && rr[1].getTime().isWall();
|
|
||||||
if (wall) {
|
|
||||||
dos.writeShort(32);
|
|
||||||
} else {
|
|
||||||
dos.writeShort(40);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
dos.writeInt(rr[i].getMonthNum() - 1); // 0-based month number
|
|
||||||
dos.writeInt(rr[i].getDay().getDayForSimpleTimeZone());
|
|
||||||
dos.writeInt(rr[i].getDay().getDayOfWeekForSimpleTimeZoneInt());
|
|
||||||
dos.writeInt((int)rr[i].getTime().getTime());
|
|
||||||
if (!wall) {
|
|
||||||
dos.writeInt((rr[i].getTime().getType() & 0xFF) - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Output RawOffset */
|
|
||||||
dos.writeByte(ZoneInfoFile.TAG_RawOffset);
|
|
||||||
dos.writeShort(4);
|
|
||||||
dos.writeInt(tz.getRawOffset());
|
|
||||||
|
|
||||||
/* Output willGMTOffsetChange flag */
|
|
||||||
if (tz.willGMTOffsetChange()) {
|
|
||||||
dos.writeByte(ZoneInfoFile.TAG_GMTOffsetWillChange);
|
|
||||||
dos.writeShort(1);
|
|
||||||
dos.writeByte(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Output LastDSTSaving */
|
|
||||||
dos.writeByte(ZoneInfoFile.TAG_LastDSTSaving);
|
|
||||||
dos.writeShort(2);
|
|
||||||
dos.writeShort(tz.getLastDSTSaving()/1000);
|
|
||||||
|
|
||||||
/* Output checksum */
|
|
||||||
dos.writeByte(ZoneInfoFile.TAG_CRC32);
|
|
||||||
dos.writeShort(4);
|
|
||||||
dos.writeInt(tz.getCRC32());
|
|
||||||
|
|
||||||
fos.close();
|
|
||||||
dos.close();
|
|
||||||
} catch(IOException e) {
|
|
||||||
Main.panic("IO error: "+e.getMessage());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates ZoneInfoMappings in binary TLV format for each zone.
|
|
||||||
* Regarding contents of output files, see {@link ZoneInfoFile}.
|
|
||||||
*
|
|
||||||
* @param Mappings
|
|
||||||
* @return 0 if no errors, or 1 if error occurred.
|
|
||||||
*/
|
|
||||||
int generateSrc(Mappings map) {
|
|
||||||
try {
|
|
||||||
int index;
|
|
||||||
int block_size;
|
|
||||||
int roi_size;
|
|
||||||
long fp;
|
|
||||||
String outputDir = Main.getOutputDir();
|
|
||||||
|
|
||||||
/* If outputDir doesn't end with file-separator, adds it. */
|
|
||||||
if (!outputDir.endsWith(File.separator)) {
|
|
||||||
outputDir += File.separatorChar;
|
|
||||||
}
|
|
||||||
|
|
||||||
File outD = new File(outputDir);
|
|
||||||
outD.mkdirs();
|
|
||||||
|
|
||||||
/* Open ZoneInfoMapping file to write. */
|
|
||||||
RandomAccessFile raf =
|
|
||||||
new RandomAccessFile(outputDir + ZoneInfoFile.JAVAZM_FILE_NAME, "rw");
|
|
||||||
|
|
||||||
/* Whether rawOffsetIndex list exists or not. */
|
|
||||||
List<Integer> roi = map.getRawOffsetsIndex();
|
|
||||||
if (roi == null) {
|
|
||||||
Main.panic("Data not exist. (rawOffsetsIndex)");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
roi_size = roi.size();
|
|
||||||
|
|
||||||
/* Whether rawOffsetIndexTable list exists or not. */
|
|
||||||
List<Set<String>> roit = map.getRawOffsetsIndexTable();
|
|
||||||
if (roit == null || roit.size() != roi_size) {
|
|
||||||
Main.panic("Data not exist. (rawOffsetsIndexTable) Otherwise, Invalid size");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Output Label */
|
|
||||||
raf.write(ZoneInfoFile.JAVAZM_LABEL, 0,
|
|
||||||
ZoneInfoFile.JAVAZM_LABEL.length);
|
|
||||||
|
|
||||||
/* Output Version */
|
|
||||||
raf.writeByte(ZoneInfoFile.JAVAZM_VERSION);
|
|
||||||
|
|
||||||
index = ZoneInfoFile.JAVAZM_LABEL.length + 2;
|
|
||||||
|
|
||||||
/* Output Version of Olson's tzdata */
|
|
||||||
byte[] b = Main.getVersionName().getBytes("UTF-8");
|
|
||||||
raf.writeByte(ZoneInfoFile.TAG_TZDataVersion);
|
|
||||||
raf.writeShort((b.length+1) & 0xFFFF);
|
|
||||||
raf.write(b);
|
|
||||||
raf.writeByte(0x00);
|
|
||||||
index += b.length + 4;
|
|
||||||
|
|
||||||
/* Output ID list. */
|
|
||||||
raf.writeByte(ZoneInfoFile.TAG_ZoneIDs);
|
|
||||||
block_size = 2;
|
|
||||||
raf.writeShort(block_size & 0xFFFF);
|
|
||||||
short nID = 0;
|
|
||||||
raf.writeShort(nID & 0xFFFF);
|
|
||||||
for (int i = 0; i < roi_size; i++) {
|
|
||||||
for (String key : roit.get(i)) {
|
|
||||||
byte size = (byte)key.getBytes("UTF-8").length;
|
|
||||||
raf.writeByte(size & 0xFF);
|
|
||||||
raf.write(key.getBytes("UTF-8"), 0, size);
|
|
||||||
block_size += 1 + size;
|
|
||||||
nID++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fp = raf.getFilePointer();
|
|
||||||
raf.seek(index);
|
|
||||||
raf.writeShort((block_size) & 0xFFFF);
|
|
||||||
raf.writeShort(nID & 0xFFFF);
|
|
||||||
raf.seek(fp);
|
|
||||||
|
|
||||||
/* Output sorted rawOffset list. */
|
|
||||||
raf.writeByte(ZoneInfoFile.TAG_RawOffsets);
|
|
||||||
index += 3 + block_size;
|
|
||||||
block_size = roi_size * 4;
|
|
||||||
raf.writeShort(block_size & 0xFFFF);
|
|
||||||
for (int i = 0; i < roi_size; i++) {
|
|
||||||
raf.writeInt(Integer.parseInt(roi.get(i).toString()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Output sorted rawOffsetIndex list. */
|
|
||||||
raf.writeByte(ZoneInfoFile.TAG_RawOffsetIndices);
|
|
||||||
index += 3 + block_size;
|
|
||||||
block_size = 0;
|
|
||||||
raf.writeShort(block_size & 0xFFFF);
|
|
||||||
int num;
|
|
||||||
for (int i = 0; i < roi_size; i++) {
|
|
||||||
num = roit.get(i).size();
|
|
||||||
block_size += num;
|
|
||||||
for (int j = 0; j < num; j++) {
|
|
||||||
raf.writeByte(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fp = raf.getFilePointer();
|
|
||||||
raf.seek(index);
|
|
||||||
raf.writeShort((block_size) & 0xFFFF);
|
|
||||||
raf.seek(fp);
|
|
||||||
|
|
||||||
/* Whether alias list exists or not. */
|
|
||||||
Map<String,String> a = map.getAliases();
|
|
||||||
if (a == null) {
|
|
||||||
Main.panic("Data not exist. (aliases)");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Output ID list. */
|
|
||||||
raf.writeByte(ZoneInfoFile.TAG_ZoneAliases);
|
|
||||||
index += 3 + block_size;
|
|
||||||
block_size = 2;
|
|
||||||
raf.writeShort(block_size & 0xFFFF);
|
|
||||||
raf.writeShort(a.size() & 0xFFFF);
|
|
||||||
for (String key : a.keySet()) {
|
|
||||||
String alias = a.get(key);
|
|
||||||
byte key_size = (byte)key.length();
|
|
||||||
byte alias_size = (byte)alias.length();
|
|
||||||
raf.writeByte(key_size & 0xFF);
|
|
||||||
raf.write(key.getBytes("UTF-8"), 0, key_size);
|
|
||||||
raf.writeByte(alias_size & 0xFF);
|
|
||||||
raf.write(alias.getBytes("UTF-8"), 0, alias_size);
|
|
||||||
block_size += 2 + key_size + alias_size;
|
|
||||||
}
|
|
||||||
fp = raf.getFilePointer();
|
|
||||||
raf.seek(index);
|
|
||||||
raf.writeShort((block_size) & 0xFFFF);
|
|
||||||
raf.seek(fp);
|
|
||||||
|
|
||||||
/* Output the exclude list if it exists. */
|
|
||||||
List<String> excludedZones = map.getExcludeList();
|
|
||||||
if (excludedZones != null) {
|
|
||||||
raf.writeByte(ZoneInfoFile.TAG_ExcludedZones);
|
|
||||||
index += 3 + block_size;
|
|
||||||
block_size = 2;
|
|
||||||
raf.writeShort(block_size & 0xFFFF); // place holder
|
|
||||||
raf.writeShort(excludedZones.size()); // the number of excluded zones
|
|
||||||
for (String name : excludedZones) {
|
|
||||||
byte size = (byte) name.length();
|
|
||||||
raf.writeByte(size); // byte length
|
|
||||||
raf.write(name.getBytes("UTF-8"), 0, size); // zone name
|
|
||||||
block_size += 1 + size;
|
|
||||||
}
|
|
||||||
fp = raf.getFilePointer();
|
|
||||||
raf.seek(index);
|
|
||||||
raf.writeShort(block_size & 0xFFFF);
|
|
||||||
raf.seek(fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Close ZoneInfoMapping file. */
|
|
||||||
raf.close();
|
|
||||||
} catch(IOException e) {
|
|
||||||
Main.panic("IO error: "+e.getMessage());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,781 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2001, 2011, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.BufferedWriter;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.FileWriter;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.SortedMap;
|
|
||||||
import java.util.StringTokenizer;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
import sun.util.calendar.ZoneInfoFile;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <code>GenDoc</code> is one of back-end classes of javazic, and generates
|
|
||||||
* index.html and other html files which prints the detailed time zone
|
|
||||||
* information for each zone.
|
|
||||||
*/
|
|
||||||
class GenDoc extends BackEnd {
|
|
||||||
|
|
||||||
private static final String docDir = "doc";
|
|
||||||
|
|
||||||
private static final String header1 =
|
|
||||||
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Frameset//EN\"" +
|
|
||||||
"\"http://www.w3.org/TR/REC-html40/frameset.dtd\">\n" +
|
|
||||||
"<HTML>\n<HEAD>\n<!-- Generated by javazic on ";
|
|
||||||
private static final String header2 =
|
|
||||||
"-->\n<TITLE>\n" +
|
|
||||||
"Java Platform, Standard Edition - TimeZone information based on ";
|
|
||||||
private static final String header3 =
|
|
||||||
"-->\n<TITLE>\n" +
|
|
||||||
"Java Platform, Standard Edition TimeZone - ";
|
|
||||||
private static final String header4 =
|
|
||||||
"</TITLE>\n" +
|
|
||||||
"</HEAD>\n\n";
|
|
||||||
|
|
||||||
private static final String body1 =
|
|
||||||
"<BODY BGCOLOR=\"white\">\n";
|
|
||||||
private static final String body2 =
|
|
||||||
"</BODY>\n";
|
|
||||||
|
|
||||||
private static final String footer =
|
|
||||||
"</HTML>\n";
|
|
||||||
|
|
||||||
|
|
||||||
// list of time zone name and zonefile name/real time zone name
|
|
||||||
// e.g.
|
|
||||||
// key (String) : value (String)
|
|
||||||
// "America/Denver" : "America/Denver.html" (real time zone)
|
|
||||||
// "America/Shiprock" : "America/Denver" (alias)
|
|
||||||
TreeMap<String,String> timezoneList = new TreeMap<String,String>();
|
|
||||||
|
|
||||||
// list of time zone's display name and time zone name
|
|
||||||
// e.g.
|
|
||||||
// key (String) : value (String)
|
|
||||||
// "Tokyo, Asia" : "Asia/Tokyo"
|
|
||||||
// "Marengo, Indiana, America" : "America/Indiana/Marengo"
|
|
||||||
// (aliases included)
|
|
||||||
TreeMap<String,String> displayNameList = new TreeMap<String,String>();
|
|
||||||
|
|
||||||
// list of top level regions
|
|
||||||
// e.g.
|
|
||||||
// key (String) : value (String)
|
|
||||||
// "America" : "America.html"
|
|
||||||
// (including entries in America/Indiana/, America/Kentucky/, ...)
|
|
||||||
TreeMap<String,String> regionList = new TreeMap<String,String>();
|
|
||||||
|
|
||||||
// mapping list from zone name to latitude & longitude
|
|
||||||
// This list is generated from zone.tab.
|
|
||||||
// e.g.
|
|
||||||
// key (String) : value (LatitudeAndLongitude object)
|
|
||||||
// "Asia/Tokyo" : latitude=35.3916, longitude=13.9444
|
|
||||||
// (aliases not included)
|
|
||||||
HashMap<String,LatitudeAndLongitude> mapList = null;
|
|
||||||
|
|
||||||
// SortedMap of zone IDs sorted by their GMT offsets. If zone's GMT
|
|
||||||
// offset will change in the future, its last known offset is
|
|
||||||
// used.
|
|
||||||
SortedMap<Integer, Set<String>> zonesByOffset = new TreeMap<Integer, Set<String>>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates HTML document for each zone.
|
|
||||||
* @param Timezone
|
|
||||||
* @return 0 if no errors, or 1 if error occurred.
|
|
||||||
*/
|
|
||||||
int processZoneinfo(Timezone tz) {
|
|
||||||
try {
|
|
||||||
int size;
|
|
||||||
int index;
|
|
||||||
String outputDir = Main.getOutputDir();
|
|
||||||
String zonename = tz.getName();
|
|
||||||
String zonefile = ZoneInfoFile.getFileName(zonename) + ".html";
|
|
||||||
List<RuleRec> stz = tz.getLastRules();
|
|
||||||
timezoneList.put(zonename, zonefile);
|
|
||||||
displayNameList.put(transform(zonename), zonename);
|
|
||||||
|
|
||||||
// Populate zonesByOffset. (Zones that will change their
|
|
||||||
// GMT offsets are also added to zonesByOffset here.)
|
|
||||||
int lastKnownOffset = tz.getRawOffset();
|
|
||||||
Set<String> set = zonesByOffset.get(lastKnownOffset);
|
|
||||||
if (set == null) {
|
|
||||||
set = new TreeSet<String>();
|
|
||||||
zonesByOffset.put(lastKnownOffset, set);
|
|
||||||
}
|
|
||||||
set.add(zonename);
|
|
||||||
|
|
||||||
/* If outputDir doesn't end with file-separator, adds it. */
|
|
||||||
if (!outputDir.endsWith(File.separator)) {
|
|
||||||
outputDir += File.separatorChar;
|
|
||||||
}
|
|
||||||
outputDir += docDir + File.separatorChar;
|
|
||||||
|
|
||||||
index = zonename.indexOf('/');
|
|
||||||
if (index != -1) {
|
|
||||||
regionList.put(zonename.substring(0, index),
|
|
||||||
zonename.substring(0, index) + ".html");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If zonefile includes file-separator, it's treated as part of
|
|
||||||
* pathname. And make directory if necessary.
|
|
||||||
*/
|
|
||||||
index = zonefile.lastIndexOf('/');
|
|
||||||
if (index != -1) {
|
|
||||||
zonefile.replace('/', File.separatorChar);
|
|
||||||
outputDir += zonefile.substring(0, index+1);
|
|
||||||
}
|
|
||||||
File outD = new File(outputDir);
|
|
||||||
outD.mkdirs();
|
|
||||||
|
|
||||||
/* If mapfile is available, add a link to the appropriate map */
|
|
||||||
if ((mapList == null) && (Main.getMapFile() != null)) {
|
|
||||||
FileReader fr = new FileReader(Main.getMapFile());
|
|
||||||
BufferedReader in = new BufferedReader(fr);
|
|
||||||
mapList = new HashMap<String,LatitudeAndLongitude>();
|
|
||||||
String line;
|
|
||||||
while ((line = in.readLine()) != null) {
|
|
||||||
// skip blank and comment lines
|
|
||||||
if (line.length() == 0 || line.charAt(0) == '#') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
StringTokenizer tokens = new StringTokenizer(line);
|
|
||||||
String token = tokens.nextToken(); /* We don't use the first token. */
|
|
||||||
token = tokens.nextToken();
|
|
||||||
LatitudeAndLongitude location = new LatitudeAndLongitude(token);
|
|
||||||
token = tokens.nextToken();
|
|
||||||
mapList.put(token, location);
|
|
||||||
}
|
|
||||||
in.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open zoneinfo file to write. */
|
|
||||||
FileWriter fw = new FileWriter(outputDir + zonefile.substring(index+1));
|
|
||||||
BufferedWriter out = new BufferedWriter(fw);
|
|
||||||
|
|
||||||
out.write(header1 + new Date() + header3 + zonename + header4);
|
|
||||||
out.write(body1 + "<FONT size=\"+2\"><B>" + zonename + "</B></FONT>");
|
|
||||||
LatitudeAndLongitude location = mapList.get(zonename);
|
|
||||||
if (location != null) {
|
|
||||||
int deg, min, sec;
|
|
||||||
|
|
||||||
deg = location.getLatDeg();
|
|
||||||
min = location.getLatMin();
|
|
||||||
sec = location.getLatSec();
|
|
||||||
if (deg < 0) {
|
|
||||||
min = -min;
|
|
||||||
sec = -sec;
|
|
||||||
} else if (min < 0) {
|
|
||||||
sec = -sec;
|
|
||||||
}
|
|
||||||
out.write(" " +
|
|
||||||
"<A HREF=\"http://www.mapquest.com/maps/map.adp?" +
|
|
||||||
"latlongtype=degrees" +
|
|
||||||
"&latdeg=" + deg +
|
|
||||||
"&latmin=" + min +
|
|
||||||
"&latsec=" + sec);
|
|
||||||
|
|
||||||
deg = location.getLongDeg();
|
|
||||||
min = location.getLongMin();
|
|
||||||
sec = location.getLongSec();
|
|
||||||
if (deg < 0) {
|
|
||||||
min = -min;
|
|
||||||
sec = -sec;
|
|
||||||
} else if (min < 0) {
|
|
||||||
sec = -sec;
|
|
||||||
}
|
|
||||||
out.write("&longdeg=" + deg +
|
|
||||||
"&longmin=" + min +
|
|
||||||
"&longsec=" + sec +
|
|
||||||
"\" target=\"_blank\">[map]</A>");
|
|
||||||
}
|
|
||||||
out.write("\n<P>\n");
|
|
||||||
|
|
||||||
List<ZoneRec> zone = tz.getZones();
|
|
||||||
List<RuleRec> rule = tz.getRules();
|
|
||||||
if (rule != null && zone != null) {
|
|
||||||
out.write("<TABLE BORDER=\"0\" WIDTH=\"100%\" CELLPADDING=\"1\" CELLSPACING=\"0\">\n" +
|
|
||||||
"<TR>\n" +
|
|
||||||
"<TD BGCOLOR=\"#EEEEFF\" WIDTH=\"50%\" ALIGN=\"CENTER\"><BR>" +
|
|
||||||
"<A HREF=\"#Rules\">Rules</A><BR></TD>\n" +
|
|
||||||
"<TD BGCOLOR=\"#EEEEFF\" WIDTH=\"50%\" ALIGN=\"CENTER\">" +
|
|
||||||
"<A HREF=\"#Zone\"><BR>Zone<BR></A></TD>\n" +
|
|
||||||
"</TR>\n</TABLE>\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Output Rule records. */
|
|
||||||
if (rule != null) {
|
|
||||||
size = rule.size();
|
|
||||||
out.write("<P>\n<A NAME=\"Rules\">" +
|
|
||||||
"<FONT SIZE=\"+1\"><B>Rules</B></FONT></A>\n" +
|
|
||||||
"<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" CELLSPACING=\"0\">\n" +
|
|
||||||
"<TR BGCOLOR=\"#CCCCFF\">\n" +
|
|
||||||
"<TD>NAME</TD><TD>FROM</TD><TD>TO</TD><TD>TYPE</TD>" +
|
|
||||||
"<TD>IN</TD><TD>ON</TD><TD>AT</TD><TD>SAVE</TD>" +
|
|
||||||
"<TD>LETTER/S</TD><TD>NOTES</TD>\n</TR>\n");
|
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
out.write("<TR BGCOLOR=\"#FFFFFF\">\n");
|
|
||||||
StringTokenizer st = new StringTokenizer(rule.get(i).getLine());
|
|
||||||
String s;
|
|
||||||
if (st.hasMoreTokens()) { /* RULE - truncated */
|
|
||||||
st.nextToken();
|
|
||||||
}
|
|
||||||
if (st.hasMoreTokens()) { /* NAME */
|
|
||||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
|
||||||
}
|
|
||||||
if (st.hasMoreTokens()) { /* FROM */
|
|
||||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
|
||||||
}
|
|
||||||
if (st.hasMoreTokens()) { /* TO */
|
|
||||||
s = st.nextToken();
|
|
||||||
if (s.equals("min") || s.equals("max")) {
|
|
||||||
out.write("<TD><FONT COLOR=\"red\">" + s + "</FONT></TD>");
|
|
||||||
} else {
|
|
||||||
out.write("<TD>" + s + "</TD>");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (st.hasMoreTokens()) { /* TYPE */
|
|
||||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
|
||||||
}
|
|
||||||
if (st.hasMoreTokens()) { /* IN */
|
|
||||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
|
||||||
}
|
|
||||||
if (st.hasMoreTokens()) { /* ON */
|
|
||||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
|
||||||
}
|
|
||||||
if (st.hasMoreTokens()) { /* AT */
|
|
||||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
|
||||||
}
|
|
||||||
if (st.hasMoreTokens()) { /* SAVE */
|
|
||||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
|
||||||
}
|
|
||||||
if (st.hasMoreTokens()) { /* LETTER/S */
|
|
||||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
|
||||||
}
|
|
||||||
if (st.hasMoreTokens()) { /* NOTES */
|
|
||||||
s = st.nextToken();
|
|
||||||
while (st.hasMoreTokens()) {
|
|
||||||
s += " " + st.nextToken();
|
|
||||||
}
|
|
||||||
index = s.indexOf('#');
|
|
||||||
out.write("<TD>" + s.substring(index+1) + "</TD>\n");
|
|
||||||
} else {
|
|
||||||
out.write("<TD> </TD>\n");
|
|
||||||
}
|
|
||||||
out.write("</TR>\n");
|
|
||||||
}
|
|
||||||
out.write("</TABLE>\n<P> <P>\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Output Zone records. */
|
|
||||||
if (zone != null) {
|
|
||||||
size = zone.size();
|
|
||||||
out.write("<P>\n<A NAME=\"Zone\">" +
|
|
||||||
"<FONT SIZE=\"+1\"><B>Zone</B></FONT></A>\n" +
|
|
||||||
"<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" CELLSPACING=\"0\">\n" +
|
|
||||||
"<TR BGCOLOR=\"#CCCCFF\">\n<TD>GMTOFF</TD>" +
|
|
||||||
"<TD>RULES</TD><TD>FORMAT</TD><TD>UNTIL</TD>" +
|
|
||||||
"<TD>NOTES</TD>\n</TR>\n");
|
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
out.write("<TR>\n");
|
|
||||||
StringTokenizer st = new StringTokenizer(zone.get(i).getLine());
|
|
||||||
String s = st.nextToken();
|
|
||||||
if (s.equals("Zone")) { /* NAME */
|
|
||||||
s = st.nextToken();
|
|
||||||
s = st.nextToken();
|
|
||||||
}
|
|
||||||
out.write("<TD>" + s + "</TD>"); /* GMTOFFSET */
|
|
||||||
if (st.hasMoreTokens()) { /* RULES */
|
|
||||||
out.write("<TD>" + st.nextToken() + "</TD>");
|
|
||||||
}
|
|
||||||
if (st.hasMoreTokens()) { /* FORMAT */
|
|
||||||
s = st.nextToken();
|
|
||||||
index = s.indexOf('#');
|
|
||||||
if (index != -1) {
|
|
||||||
if (index != 0) {
|
|
||||||
out.write("<TD>" + s.substring(0, index-1) +
|
|
||||||
"</TD>"); /* FORMAT */
|
|
||||||
s = s.substring(index+1);
|
|
||||||
} else {
|
|
||||||
out.write("<TD> </TD>"); /* FORMAT */
|
|
||||||
}
|
|
||||||
while (st.hasMoreTokens()) {
|
|
||||||
s += " " + st.nextToken();
|
|
||||||
}
|
|
||||||
out.write("<TD> </TD>"); /* UNTIL */
|
|
||||||
out.write("<TD>" + s + "</TD>\n</TR>\n"); /* NOTES */
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
out.write("<TD>" + s + "</TD>"); /* FORMAT */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (st.hasMoreTokens()) { /* UNTIL */
|
|
||||||
s = st.nextToken();
|
|
||||||
while (st.hasMoreTokens()) {
|
|
||||||
s += " " + st.nextToken();
|
|
||||||
}
|
|
||||||
index = s.indexOf('#');
|
|
||||||
if (index != -1) {
|
|
||||||
if (index != 0) {
|
|
||||||
out.write("<TD>" + s.substring(0, index-1) +
|
|
||||||
"</TD>"); /* UNTIL */
|
|
||||||
} else {
|
|
||||||
out.write("<TD> </TD>"); /* UNTIL */
|
|
||||||
}
|
|
||||||
out.write("<TD>" + s.substring(index+1) +
|
|
||||||
"</TD>\n"); /* NOTES */
|
|
||||||
} else {
|
|
||||||
out.write("<TD>" + s + "</TD>"); /* UNTIL */
|
|
||||||
out.write("<TD> </TD>\n"); /* NOTES */
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
out.write("<TD> </TD>"); /* UNTIL */
|
|
||||||
out.write("<TD> </TD>\n"); /* NOTES */
|
|
||||||
}
|
|
||||||
out.write("</TR>\n");
|
|
||||||
}
|
|
||||||
out.write("</TABLE>\n");
|
|
||||||
}
|
|
||||||
out.write(body2 + footer);
|
|
||||||
|
|
||||||
out.close();
|
|
||||||
fw.close();
|
|
||||||
} catch(IOException e) {
|
|
||||||
Main.panic("IO error: "+e.getMessage());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates index.html and other top-level frame files.
|
|
||||||
* @param Mappings
|
|
||||||
* @return 0 if no errors, or 1 if error occurred.
|
|
||||||
*/
|
|
||||||
int generateSrc(Mappings map) {
|
|
||||||
try {
|
|
||||||
int len;
|
|
||||||
Object o[];
|
|
||||||
String outputDir = Main.getOutputDir();
|
|
||||||
FileWriter fw1, fw2;
|
|
||||||
BufferedWriter out1, out2;
|
|
||||||
|
|
||||||
/* Whether alias list exists or not. */
|
|
||||||
Map<String,String> a = map.getAliases();
|
|
||||||
if (a == null) {
|
|
||||||
Main.panic("Data not exist. (aliases)");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
timezoneList.putAll(a);
|
|
||||||
|
|
||||||
/* If outputDir doesn't end with file-separator, adds it. */
|
|
||||||
if (!outputDir.endsWith(File.separator)) {
|
|
||||||
outputDir += File.separatorChar;
|
|
||||||
}
|
|
||||||
outputDir += docDir + File.separatorChar;
|
|
||||||
|
|
||||||
File outD = new File(outputDir);
|
|
||||||
outD.mkdirs();
|
|
||||||
|
|
||||||
/* Creates index.html */
|
|
||||||
fw1 = new FileWriter(outputDir + "index.html", false);
|
|
||||||
out1 = new BufferedWriter(fw1);
|
|
||||||
|
|
||||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
|
||||||
header4 +
|
|
||||||
"<FRAMESET cols=\"20%,80%\">\n" +
|
|
||||||
"<FRAMESET rows=\"30%,70%\">\n" +
|
|
||||||
"<FRAME src=\"overview-frame.html\" name=\"TimeZoneListFrame\">\n" +
|
|
||||||
"<FRAME src=\"allTimeZone-frame1.html\" name=\"allTimeZoneFrame\">\n" +
|
|
||||||
"</FRAMESET>" +
|
|
||||||
"<FRAME src=\"overview-summary.html\" name=\"rightFrame\">\n" +
|
|
||||||
"</FRAMESET>\n" +
|
|
||||||
"<NOFRAMES>\n" +
|
|
||||||
"<H2>\nFrame Alert\n</H2>\n\n" +
|
|
||||||
"<P>\n\n" +
|
|
||||||
"This document is designed to be viewed using the frames feature. If you see this\n" +
|
|
||||||
"message, you are using a non-frame-capable web client.\n" +
|
|
||||||
"<BR>\n" +
|
|
||||||
"Link to<A HREF=\"overview-summary.html\">Non-frame version.</A>\n" +
|
|
||||||
"</NOFRAMES>\n" + footer);
|
|
||||||
|
|
||||||
out1.close();
|
|
||||||
fw1.close();
|
|
||||||
|
|
||||||
|
|
||||||
/* Creates overview-frame.html */
|
|
||||||
fw1 = new FileWriter(outputDir + "overview-frame.html", false);
|
|
||||||
out1 = new BufferedWriter(fw1);
|
|
||||||
|
|
||||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
|
||||||
header4 + body1 +
|
|
||||||
"<TABLE BORDER=\"0\" WIDTH=\"100%\">\n<TR>\n" +
|
|
||||||
"<TD NOWRAP><FONT size=\"+1\">\n" +
|
|
||||||
"<B>Java<sup><font size=-2>TM</font></sup> Platform<br>Standard Ed.</B></FONT></TD>\n" +
|
|
||||||
"</TR>\n</TABLE>\n\n" +
|
|
||||||
"<TABLE BORDER=\"0\" WIDTH=\"100%\">\n<TR>\n<TD NOWRAP>" +
|
|
||||||
"<P>\n<FONT size=\"+1\">\nAll Time Zones Sorted By:</FONT>\n<BR>\n" +
|
|
||||||
" <A HREF=\"allTimeZone-frame1.html\" TARGET=\"allTimeZoneFrame\">GMT offsets</A></FONT>\n<BR>\n" +
|
|
||||||
" <A HREF=\"allTimeZone-frame2.html\" TARGET=\"allTimeZoneFrame\">Zone names</A></FONT>\n<BR>" +
|
|
||||||
" <A HREF=\"allTimeZone-frame3.html\" TARGET=\"allTimeZoneFrame\">City names</A></FONT>\n" +
|
|
||||||
"<P>\n<FONT size=\"+1\">\nContinents and Oceans</FONT>\n<BR>\n");
|
|
||||||
|
|
||||||
for (String regionKey : regionList.keySet()) {
|
|
||||||
out1.write(" <A HREF=\"" + regionList.get(regionKey) +
|
|
||||||
"\" TARGET=\"allTimeZoneFrame\">" + regionKey +
|
|
||||||
"</A><BR>\n");
|
|
||||||
|
|
||||||
fw2 = new FileWriter(outputDir + regionList.get(regionKey),
|
|
||||||
false);
|
|
||||||
out2 = new BufferedWriter(fw2);
|
|
||||||
|
|
||||||
out2.write(header1 + new Date() + header3 + regionKey +
|
|
||||||
header4 + body1 + "<FONT size=\"+1\"><B>" +
|
|
||||||
regionKey + "</B></FONT>\n<BR>\n<TABLE>\n<TR>\n<TD>");
|
|
||||||
|
|
||||||
boolean found = false;
|
|
||||||
for (String timezoneKey : timezoneList.keySet()) {
|
|
||||||
int regionIndex = timezoneKey.indexOf('/');
|
|
||||||
if (regionIndex == -1 ||
|
|
||||||
!regionKey.equals(timezoneKey.substring(0, regionIndex))) {
|
|
||||||
if (found) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
found = true;
|
|
||||||
if (a.containsKey(timezoneKey)) {
|
|
||||||
Object realName = a.get(timezoneKey);
|
|
||||||
while (a.containsKey(realName)) {
|
|
||||||
realName = a.get(realName);
|
|
||||||
}
|
|
||||||
out2.write(timezoneKey +
|
|
||||||
" (alias for " + "<A HREF=\"" +
|
|
||||||
timezoneList.get(realName) +
|
|
||||||
"\" TARGET=\"rightFrame\">" +
|
|
||||||
realName + "</A>)");
|
|
||||||
} else {
|
|
||||||
out2.write("<A HREF=\"" + timezoneList.get(timezoneKey) +
|
|
||||||
"\" TARGET=\"rightFrame\">" + timezoneKey +
|
|
||||||
"</A>");
|
|
||||||
}
|
|
||||||
out2.write("<BR>\n");
|
|
||||||
}
|
|
||||||
out2.write("</TD>\n</TR>\n</TABLE>\n" + body2 + footer);
|
|
||||||
|
|
||||||
out2.close();
|
|
||||||
fw2.close();
|
|
||||||
}
|
|
||||||
out1.write("</FONT></TD>\n</TR></TABLE>\n" + body2 + footer);
|
|
||||||
|
|
||||||
out1.close();
|
|
||||||
fw1.close();
|
|
||||||
|
|
||||||
|
|
||||||
/* Creates allTimeZone-frame1.html (Sorted by GMT offsets) */
|
|
||||||
fw1 = new FileWriter(outputDir + "allTimeZone-frame1.html", false);
|
|
||||||
out1 = new BufferedWriter(fw1);
|
|
||||||
|
|
||||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
|
||||||
header4 + body1 +
|
|
||||||
"<FONT size=\"+1\"><B>Sorted by GMT offsets</B></FONT>\n" +
|
|
||||||
"<BR>\n\n" + "<TABLE BORDER=\"0\" WIDTH=\"100%\">\n" +
|
|
||||||
"<TR>\n<TD NOWRAP>\n");
|
|
||||||
|
|
||||||
List<Integer> roi = map.getRawOffsetsIndex();
|
|
||||||
List<Set<String>> roit = map.getRawOffsetsIndexTable();
|
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
for (Integer offset : zonesByOffset.keySet()) {
|
|
||||||
int off = roi.get(index);
|
|
||||||
Set<String> perRO = zonesByOffset.get(offset);
|
|
||||||
if (offset == off) {
|
|
||||||
// Merge aliases into zonesByOffset
|
|
||||||
perRO.addAll(roit.get(index));
|
|
||||||
}
|
|
||||||
index++;
|
|
||||||
|
|
||||||
for (String timezoneKey : perRO) {
|
|
||||||
out1.write("<TR>\n<TD><FONT SIZE=\"-1\">(" +
|
|
||||||
Time.toGMTFormat(offset.toString()) +
|
|
||||||
")</FONT></TD>\n<TD>");
|
|
||||||
|
|
||||||
if (a.containsKey(timezoneKey)) {
|
|
||||||
Object realName = a.get(timezoneKey);
|
|
||||||
while (a.containsKey(realName)) {
|
|
||||||
realName = a.get(realName);
|
|
||||||
}
|
|
||||||
out1.write(timezoneKey +
|
|
||||||
" (alias for " + "<A HREF=\"" +
|
|
||||||
timezoneList.get(realName) +
|
|
||||||
"\" TARGET=\"rightFrame\">" + realName +
|
|
||||||
"</A>)");
|
|
||||||
} else {
|
|
||||||
out1.write("<A HREF=\"" + timezoneList.get(timezoneKey) +
|
|
||||||
"\" TARGET=\"rightFrame\">" + timezoneKey +
|
|
||||||
"</A>");
|
|
||||||
}
|
|
||||||
out1.write("</TD>\n</TR>\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out1.write("</FONT></TD>\n</TR>\n</TABLE>\n" + body2 + footer);
|
|
||||||
|
|
||||||
out1.close();
|
|
||||||
fw1.close();
|
|
||||||
|
|
||||||
|
|
||||||
/* Creates allTimeZone-frame2.html (Sorted by zone names) */
|
|
||||||
fw1 = new FileWriter(outputDir + "allTimeZone-frame2.html", false);
|
|
||||||
out1 = new BufferedWriter(fw1);
|
|
||||||
|
|
||||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
|
||||||
header4 + body1 +
|
|
||||||
"<FONT size=\"+1\"><B>Sorted by zone names</B></FONT>\n" +
|
|
||||||
"<BR>\n\n" + "<TABLE BORDER=\"0\" WIDTH=\"100%\">\n" +
|
|
||||||
"<TR>\n<TD NOWRAP>\n");
|
|
||||||
o = timezoneList.keySet().toArray();
|
|
||||||
len = timezoneList.size();
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
Object timezoneKey = o[i];
|
|
||||||
if (a.containsKey(timezoneKey)) {
|
|
||||||
Object realName = a.get(timezoneKey);
|
|
||||||
while (a.containsKey(realName)) {
|
|
||||||
realName = a.get(realName);
|
|
||||||
}
|
|
||||||
out1.write(timezoneKey +
|
|
||||||
" (alias for " +
|
|
||||||
"<A HREF=\"" + timezoneList.get(realName) +
|
|
||||||
"\" TARGET=\"rightFrame\">" + realName +
|
|
||||||
"</A>)");
|
|
||||||
} else {
|
|
||||||
out1.write("<A HREF=\"" + timezoneList.get(timezoneKey) +
|
|
||||||
"\" TARGET=\"rightFrame\">" + timezoneKey +
|
|
||||||
"</A>");
|
|
||||||
}
|
|
||||||
out1.write("<BR> \n");
|
|
||||||
}
|
|
||||||
out1.write("</FONT></TD>\n</TR>\n</TABLE>\n" + body2 + footer);
|
|
||||||
|
|
||||||
out1.close();
|
|
||||||
fw1.close();
|
|
||||||
|
|
||||||
/* Creates allTimeZone-frame3.html (Sorted by city names) */
|
|
||||||
fw1 = new FileWriter(outputDir + "allTimeZone-frame3.html", false);
|
|
||||||
out1 = new BufferedWriter(fw1);
|
|
||||||
|
|
||||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
|
||||||
header4 + body1 +
|
|
||||||
"<FONT size=\"+1\"><B>Sorted by city names</B></FONT>\n" +
|
|
||||||
"<BR>\n\n" + "<TABLE BORDER=\"0\" WIDTH=\"100%\">\n" +
|
|
||||||
"<TR>\n<TD NOWRAP>\n");
|
|
||||||
|
|
||||||
Set<String> aliasSet = a.keySet();
|
|
||||||
len = aliasSet.size();
|
|
||||||
String aliasNames[] = aliasSet.toArray(new String[0]);
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
displayNameList.put(transform(aliasNames[i]),
|
|
||||||
aliasNames[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
o = displayNameList.keySet().toArray();
|
|
||||||
len = displayNameList.size();
|
|
||||||
for (int i = 0; i < len; i++) {
|
|
||||||
Object displayName = o[i];
|
|
||||||
Object timezoneKey = displayNameList.get(o[i]);
|
|
||||||
if (a.containsKey(timezoneKey)) {
|
|
||||||
Object realName = a.get(timezoneKey);
|
|
||||||
while (a.containsKey(realName)) {
|
|
||||||
realName = a.get(realName);
|
|
||||||
}
|
|
||||||
out1.write(displayName +
|
|
||||||
" (alias for " +
|
|
||||||
"<A HREF=\"" + timezoneList.get(realName) +
|
|
||||||
"\" TARGET=\"rightFrame\">" + realName +
|
|
||||||
"</A>)");
|
|
||||||
} else {
|
|
||||||
out1.write("<A HREF=\"" + timezoneList.get(timezoneKey) +
|
|
||||||
"\" TARGET=\"rightFrame\">" + displayName +
|
|
||||||
"</A>");
|
|
||||||
}
|
|
||||||
out1.write("<BR> \n");
|
|
||||||
}
|
|
||||||
|
|
||||||
out1.write("</FONT></TD>\n</TR>\n</TABLE>\n" + body2 + footer);
|
|
||||||
|
|
||||||
out1.close();
|
|
||||||
fw1.close();
|
|
||||||
|
|
||||||
/* Creates overview-summary.html */
|
|
||||||
fw1 = new FileWriter(outputDir + "overview-summary.html", false);
|
|
||||||
out1 = new BufferedWriter(fw1);
|
|
||||||
|
|
||||||
out1.write(header1 + new Date() + header2 + Main.getVersionName() +
|
|
||||||
header4 + body1 +
|
|
||||||
"<p>This is the list of time zones generated from <B>" +
|
|
||||||
Main.getVersionName() + "</B> for Java Platform, " +
|
|
||||||
"Standard Edition. The source code can be obtained " +
|
|
||||||
"from ftp site <a href=\"ftp://elsie.nci.nih.gov/pub/\">" +
|
|
||||||
"ftp://elsie.nci.nih.gov/pub/</a>. A total of <B>" +
|
|
||||||
len +
|
|
||||||
"</B> time zones and aliases are supported " +
|
|
||||||
"in this edition. For the " +
|
|
||||||
"format of rules and zones, refer to the zic " +
|
|
||||||
"(zoneinfo compiler) man page on " +
|
|
||||||
"Solaris or Linux.</p>\n" +
|
|
||||||
"<p>Note that the time zone data is not " +
|
|
||||||
"a public interface of the Java Platform. No " +
|
|
||||||
"applications should rely on the time zone data of " +
|
|
||||||
"this document. Time zone names and data " +
|
|
||||||
"may change without any prior notice.</p>\n" +
|
|
||||||
body2 + footer);
|
|
||||||
|
|
||||||
out1.close();
|
|
||||||
fw1.close();
|
|
||||||
} catch(IOException e) {
|
|
||||||
Main.panic("IO error: "+e.getMessage());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
String transform(String s) {
|
|
||||||
int index = s.lastIndexOf("/");
|
|
||||||
|
|
||||||
/* If the string doesn't include any delimiter, return */
|
|
||||||
if (index == -1) {
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
int lastIndex = index;
|
|
||||||
String str = s.substring(index+1);
|
|
||||||
do {
|
|
||||||
index = s.substring(0, lastIndex).lastIndexOf('/');
|
|
||||||
str += ", " + s.substring(index+1, lastIndex);
|
|
||||||
lastIndex = index;
|
|
||||||
} while (index > -1);
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
static class LatitudeAndLongitude {
|
|
||||||
|
|
||||||
private int latDeg, latMin, latSec, longDeg, longMin, longSec;
|
|
||||||
|
|
||||||
LatitudeAndLongitude(String s) {
|
|
||||||
try {
|
|
||||||
// First of all, check the string has the correct format:
|
|
||||||
// either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS
|
|
||||||
|
|
||||||
if (!s.startsWith("+") && !s.startsWith("-")) {
|
|
||||||
Main.warning("Wrong latitude&longitude data: " + s);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int index;
|
|
||||||
if (((index = s.lastIndexOf("+")) <= 0) &&
|
|
||||||
((index = s.lastIndexOf("-")) <= 0)) {
|
|
||||||
Main.warning("Wrong latitude&longitude data: " + s);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index == 5) {
|
|
||||||
latDeg = Integer.parseInt(s.substring(1, 3));
|
|
||||||
latMin = Integer.parseInt(s.substring(3, 5));
|
|
||||||
latSec = 0;
|
|
||||||
} else if (index == 7) {
|
|
||||||
latDeg = Integer.parseInt(s.substring(1, 3));
|
|
||||||
latMin = Integer.parseInt(s.substring(3, 5));
|
|
||||||
latSec = Integer.parseInt(s.substring(5, 7));
|
|
||||||
} else {
|
|
||||||
Main.warning("Wrong latitude&longitude data: " + s);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (s.startsWith("-")){
|
|
||||||
latDeg = -latDeg;
|
|
||||||
latMin = -latMin;
|
|
||||||
latSec = -latSec;
|
|
||||||
}
|
|
||||||
|
|
||||||
int len = s.length();
|
|
||||||
if (index == 5 && len == 11) {
|
|
||||||
longDeg = Integer.parseInt(s.substring(index+1, index+4));
|
|
||||||
longMin = Integer.parseInt(s.substring(index+4, index+6));
|
|
||||||
longSec = 0;
|
|
||||||
} else if (index == 7 && len == 15) {
|
|
||||||
longDeg = Integer.parseInt(s.substring(index+1, index+4));
|
|
||||||
longMin = Integer.parseInt(s.substring(index+4, index+6));
|
|
||||||
longSec = Integer.parseInt(s.substring(index+6, index+8));
|
|
||||||
} else {
|
|
||||||
Main.warning("Wrong latitude&longitude data: " + s);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (s.charAt(index) == '-'){
|
|
||||||
longDeg = -longDeg;
|
|
||||||
longMin = -longMin;
|
|
||||||
longSec = -longSec;
|
|
||||||
}
|
|
||||||
} catch(Exception e) {
|
|
||||||
Main.warning("LatitudeAndLongitude() Parse error: " + s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int getLatDeg() {
|
|
||||||
return latDeg;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getLatMin() {
|
|
||||||
return latMin;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getLatSec() {
|
|
||||||
return latSec;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getLongDeg() {
|
|
||||||
return longDeg;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getLongMin() {
|
|
||||||
return longMin;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getLongSec() {
|
|
||||||
return longSec;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,238 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2011, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Main class for the javazic time zone data compiler.
|
|
||||||
*
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
public class Main {
|
|
||||||
|
|
||||||
private static boolean verbose = false;
|
|
||||||
static boolean outputDoc = false;
|
|
||||||
|
|
||||||
private List<String> ziFiles = new ArrayList<String>();
|
|
||||||
private static String zoneNamesFile = null;
|
|
||||||
private static String versionName = "unknown";
|
|
||||||
private static String outputDir = "zoneinfo";
|
|
||||||
private static String mapFile = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses the specified arguments and sets up the variables.
|
|
||||||
* @param argv the arguments
|
|
||||||
*/
|
|
||||||
void processArgs(String[] argv) {
|
|
||||||
for (int i = 0; i < argv.length; i++) {
|
|
||||||
String arg = argv[i];
|
|
||||||
if (arg.startsWith("-h")) {
|
|
||||||
usage();
|
|
||||||
System.exit(0);
|
|
||||||
} else if (arg.equals("-d")) {
|
|
||||||
outputDir = argv[++i];
|
|
||||||
} else if (arg.equals("-v")) {
|
|
||||||
verbose = true;
|
|
||||||
} else if (arg.equals("-V")) {
|
|
||||||
versionName = argv[++i];
|
|
||||||
} else if (arg.equals("-doc")) {
|
|
||||||
outputDoc = true;
|
|
||||||
} else if (arg.equals("-map")) {
|
|
||||||
outputDoc = true;
|
|
||||||
mapFile = argv[++i];
|
|
||||||
} else if (arg.equals("-f")) {
|
|
||||||
zoneNamesFile = argv[++i];
|
|
||||||
} else if (arg.equals("-S")) {
|
|
||||||
try {
|
|
||||||
Zoneinfo.setYear(Integer.parseInt(argv[++i]));
|
|
||||||
} catch (Exception e) {
|
|
||||||
error("invalid year: " + argv[i]);
|
|
||||||
usage();
|
|
||||||
System.exit(1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
boolean isStartYear = arg.equals("-s");
|
|
||||||
if (isStartYear || arg.equals("-e")) {
|
|
||||||
try {
|
|
||||||
int year = Integer.parseInt(argv[++i]);
|
|
||||||
if (isStartYear) {
|
|
||||||
Zoneinfo.setStartYear(year);
|
|
||||||
} else {
|
|
||||||
Zoneinfo.setEndYear(year);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
error("invalid year: " + argv[i]);
|
|
||||||
usage();
|
|
||||||
System.exit(1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// the rest of args are zoneinfo source files
|
|
||||||
while (i < argv.length) {
|
|
||||||
ziFiles.add(argv[i++]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses zoneinfo source files
|
|
||||||
*/
|
|
||||||
int compile() {
|
|
||||||
int nFiles = ziFiles.size();
|
|
||||||
int status = 0;
|
|
||||||
Mappings maps = new Mappings();
|
|
||||||
BackEnd backend = BackEnd.getBackEnd();
|
|
||||||
|
|
||||||
for (int i = 0; i < nFiles; i++) {
|
|
||||||
Zoneinfo frontend = Zoneinfo.parse(ziFiles.get(i));
|
|
||||||
|
|
||||||
for (String key : frontend.getZones().keySet()) {
|
|
||||||
info(key);
|
|
||||||
|
|
||||||
Timezone tz = frontend.phase2(key);
|
|
||||||
status |= backend.processZoneinfo(tz);
|
|
||||||
}
|
|
||||||
|
|
||||||
maps.add(frontend);
|
|
||||||
}
|
|
||||||
|
|
||||||
// special code for dealing with the conflicting name "MET"
|
|
||||||
Zone.addMET();
|
|
||||||
|
|
||||||
maps.resolve();
|
|
||||||
|
|
||||||
status |= backend.generateSrc(maps);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] argv) {
|
|
||||||
Main zic = new Main();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Parse args
|
|
||||||
*/
|
|
||||||
zic.processArgs(argv);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read target zone names
|
|
||||||
*/
|
|
||||||
if (zoneNamesFile != null) {
|
|
||||||
Zone.readZoneNames(zoneNamesFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
int status = zic.compile();
|
|
||||||
|
|
||||||
System.exit(status);
|
|
||||||
}
|
|
||||||
|
|
||||||
void usage() {
|
|
||||||
System.err.println("Usage: javazic [options] file...\n"+
|
|
||||||
" -f namefile file containing zone names\n"+
|
|
||||||
" to be generated (ie, generating subset)\n"+
|
|
||||||
" -d dir output directory\n"+
|
|
||||||
" -v verbose\n"+
|
|
||||||
" -V datavers specifies the tzdata version string\n"+
|
|
||||||
" (eg, \"tzdata2000g\")"+
|
|
||||||
" -S year output only SimleTimeZone data of that year\n"+
|
|
||||||
" -s year start year (default: 1900)\n"+
|
|
||||||
" -e year end year (default: 2037)\n"+
|
|
||||||
" -doc generates HTML documents\n"+
|
|
||||||
" -map mapfile generates HTML documents with map information\n"+
|
|
||||||
" file... zoneinfo source file(s)");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the output directory path name
|
|
||||||
*/
|
|
||||||
static String getOutputDir() {
|
|
||||||
return outputDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the map file's path and name
|
|
||||||
*/
|
|
||||||
static String getMapFile() {
|
|
||||||
return mapFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the time zone data version string specified by the -V
|
|
||||||
* option. If it is not specified, "unknown" is returned.
|
|
||||||
* @return the time zone data version string
|
|
||||||
*/
|
|
||||||
static String getVersionName() {
|
|
||||||
return versionName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prints out the specified fatal error message and calls {@link
|
|
||||||
* java.lang.System#exit System.exit(1)}.
|
|
||||||
* @param msg the fatal error message
|
|
||||||
*/
|
|
||||||
static void panic(String msg) {
|
|
||||||
printMessage("fatal error", msg);
|
|
||||||
System.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prints out the specified error message.
|
|
||||||
* @param msg the error message
|
|
||||||
*/
|
|
||||||
static void error(String msg) {
|
|
||||||
printMessage("error", msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prints out the specified warning message.
|
|
||||||
* @param msg the warning message
|
|
||||||
*/
|
|
||||||
static void warning(String msg) {
|
|
||||||
printMessage("warning", msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prints out the informative message.
|
|
||||||
* @param msg the informative message
|
|
||||||
*/
|
|
||||||
static void info(String msg) {
|
|
||||||
if (verbose) {
|
|
||||||
printMessage(null, msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void printMessage(String type, String msg) {
|
|
||||||
if (type != null) {
|
|
||||||
type += ": ";
|
|
||||||
} else {
|
|
||||||
type = "";
|
|
||||||
}
|
|
||||||
System.err.println("javazic: " + type + msg);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,197 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2012, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <code>Mappings</code> generates two Maps and a List which are used by
|
|
||||||
* javazic BackEnd.
|
|
||||||
*
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
class Mappings {
|
|
||||||
// All aliases specified by Link statements. It's alias name to
|
|
||||||
// real name mappings.
|
|
||||||
private Map<String,String> aliases;
|
|
||||||
|
|
||||||
private List<Integer> rawOffsetsIndex;
|
|
||||||
|
|
||||||
private List<Set<String>> rawOffsetsIndexTable;
|
|
||||||
|
|
||||||
// Zone names to be excluded from rawOffset table. Those have GMT
|
|
||||||
// offsets to change some future time.
|
|
||||||
private List<String> excludeList;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor creates some necessary instances.
|
|
||||||
*/
|
|
||||||
Mappings() {
|
|
||||||
aliases = new TreeMap<String,String>();
|
|
||||||
rawOffsetsIndex = new LinkedList<Integer>();
|
|
||||||
rawOffsetsIndexTable = new LinkedList<Set<String>>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates aliases and rawOffsets tables.
|
|
||||||
* @param zi a Zoneinfo containing Zones
|
|
||||||
*/
|
|
||||||
void add(Zoneinfo zi) {
|
|
||||||
Map<String,Zone> zones = zi.getZones();
|
|
||||||
|
|
||||||
for (String zoneName : zones.keySet()) {
|
|
||||||
Zone zone = zones.get(zoneName);
|
|
||||||
String zonename = zone.getName();
|
|
||||||
int rawOffset = zone.get(zone.size()-1).getGmtOffset();
|
|
||||||
|
|
||||||
// If the GMT offset of this Zone will change in some
|
|
||||||
// future time, this Zone is added to the exclude list.
|
|
||||||
boolean isExcluded = false;
|
|
||||||
for (int i = 0; i < zone.size(); i++) {
|
|
||||||
ZoneRec zrec = zone.get(i);
|
|
||||||
if ((zrec.getGmtOffset() != rawOffset)
|
|
||||||
&& (zrec.getUntilTime(0) > Time.getCurrentTime())) {
|
|
||||||
if (excludeList == null) {
|
|
||||||
excludeList = new ArrayList<String>();
|
|
||||||
}
|
|
||||||
excludeList.add(zone.getName());
|
|
||||||
isExcluded = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!rawOffsetsIndex.contains(new Integer(rawOffset))) {
|
|
||||||
// Find the index to insert this raw offset zones
|
|
||||||
int n = rawOffsetsIndex.size();
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
if (rawOffsetsIndex.get(i) > rawOffset) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rawOffsetsIndex.add(i, rawOffset);
|
|
||||||
|
|
||||||
Set<String> perRawOffset = new TreeSet<String>();
|
|
||||||
if (!isExcluded) {
|
|
||||||
perRawOffset.add(zonename);
|
|
||||||
}
|
|
||||||
rawOffsetsIndexTable.add(i, perRawOffset);
|
|
||||||
} else if (!isExcluded) {
|
|
||||||
int i = rawOffsetsIndex.indexOf(new Integer(rawOffset));
|
|
||||||
Set<String> perRawOffset = rawOffsetsIndexTable.get(i);
|
|
||||||
perRawOffset.add(zonename);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String,String> a = zi.getAliases();
|
|
||||||
// If there are time zone names which refer to any of the
|
|
||||||
// excluded zones, add those names to the excluded list.
|
|
||||||
if (excludeList != null) {
|
|
||||||
for (String zoneName : a.keySet()) {
|
|
||||||
String realname = a.get(zoneName);
|
|
||||||
if (excludeList.contains(realname)) {
|
|
||||||
excludeList.add(zoneName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
aliases.putAll(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds valid aliases to one of per-RawOffset table and removes
|
|
||||||
* invalid aliases from aliases List. Aliases referring to
|
|
||||||
* excluded zones are not added to a per-RawOffset table.
|
|
||||||
*/
|
|
||||||
void resolve() {
|
|
||||||
int index = rawOffsetsIndexTable.size();
|
|
||||||
List<String> toBeRemoved = new ArrayList<String>();
|
|
||||||
for (String key : aliases.keySet()) {
|
|
||||||
boolean validname = false;
|
|
||||||
for (int j = 0; j < index; j++) {
|
|
||||||
Set<String> perRO = rawOffsetsIndexTable.get(j);
|
|
||||||
boolean isExcluded = (excludeList == null) ?
|
|
||||||
false : excludeList.contains(key);
|
|
||||||
|
|
||||||
if ((perRO.contains(aliases.get(key)) || isExcluded)
|
|
||||||
&& Zone.isTargetZone(key)) {
|
|
||||||
validname = true;
|
|
||||||
if (!isExcluded) {
|
|
||||||
perRO.add(key);
|
|
||||||
Main.info("Alias <"+key+"> added to the list.");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!validname) {
|
|
||||||
Main.info("Alias <"+key+"> removed from the list.");
|
|
||||||
toBeRemoved.add(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove zones, if any, from the list.
|
|
||||||
for (String key : toBeRemoved) {
|
|
||||||
aliases.remove(key);
|
|
||||||
}
|
|
||||||
// Eliminate any alias-to-alias mappings. For example, if
|
|
||||||
// there are A->B and B->C, A->B is changed to A->C.
|
|
||||||
Map<String, String> newMap = new HashMap<String, String>();
|
|
||||||
for (String key : aliases.keySet()) {
|
|
||||||
String realid = aliases.get(key);
|
|
||||||
String leaf = realid;
|
|
||||||
while (aliases.get(leaf) != null) {
|
|
||||||
leaf = aliases.get(leaf);
|
|
||||||
}
|
|
||||||
if (!realid.equals(leaf)) {
|
|
||||||
newMap.put(key, leaf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
aliases.putAll(newMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String,String> getAliases() {
|
|
||||||
return(aliases);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Integer> getRawOffsetsIndex() {
|
|
||||||
return(rawOffsetsIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Set<String>> getRawOffsetsIndexTable() {
|
|
||||||
return(rawOffsetsIndexTable);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> getExcludeList() {
|
|
||||||
return excludeList;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,94 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2004, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Month enum handles month related manipulation.
|
|
||||||
*
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
enum Month {
|
|
||||||
JANUARY("Jan"),
|
|
||||||
FEBRUARY("Feb"),
|
|
||||||
MARCH("Mar"),
|
|
||||||
APRIL("Apr"),
|
|
||||||
MAY("May"),
|
|
||||||
JUNE("Jun"),
|
|
||||||
JULY("Jul"),
|
|
||||||
AUGUST("Aug"),
|
|
||||||
SEPTEMBER("Sep"),
|
|
||||||
OCTOBER("Oct"),
|
|
||||||
NOVEMBER("Nov"),
|
|
||||||
DECEMBER("Dec");
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
int value() {
|
|
||||||
return ordinal() + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses the specified string as a month abbreviation.
|
|
||||||
* @param name the month abbreviation
|
|
||||||
* @return the Month value
|
|
||||||
*/
|
|
||||||
static Month parse(String name) {
|
|
||||||
Month m = abbreviations.get(name);
|
|
||||||
if (m != null) {
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param month the nunmth number (1-based)
|
|
||||||
* @return the month name in uppercase of the specified month
|
|
||||||
*/
|
|
||||||
static String toString(int month) {
|
|
||||||
if (month >= JANUARY.value() && month <= DECEMBER.value()) {
|
|
||||||
return "Calendar." + Month.values()[month - 1];
|
|
||||||
}
|
|
||||||
throw new IllegalArgumentException("wrong month number: " + month);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,184 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2004, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.StringTokenizer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rule manipulates Rule records.
|
|
||||||
*
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
class Rule {
|
|
||||||
|
|
||||||
private List<RuleRec> list;
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a Rule which consists of a Rule record list. The
|
|
||||||
* specified name is given to this Rule.
|
|
||||||
* @param name the Rule name
|
|
||||||
*/
|
|
||||||
Rule(String name) {
|
|
||||||
this.name = name;
|
|
||||||
list = new ArrayList<RuleRec>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Added a RuleRec to the Rule record list.
|
|
||||||
*/
|
|
||||||
void add(RuleRec rec) {
|
|
||||||
list.add(rec);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the Rule name
|
|
||||||
*/
|
|
||||||
String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets all rule records that cover the given year.
|
|
||||||
*
|
|
||||||
* @param year the year number for which the rule is applicable.
|
|
||||||
* @return rules in List that are collated in time. If no rule is found, an empty
|
|
||||||
* List is returned.
|
|
||||||
*/
|
|
||||||
List<RuleRec> getRules(int year) {
|
|
||||||
List<RuleRec> rules = new ArrayList<RuleRec>(3);
|
|
||||||
for (RuleRec rec : list) {
|
|
||||||
if (year >= rec.getFromYear() && year <= rec.getToYear()) {
|
|
||||||
if ((rec.isOdd() && year % 2 == 0) || (rec.isEven() && year % 2 == 1))
|
|
||||||
continue;
|
|
||||||
rules.add(rec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int n = rules.size();
|
|
||||||
if (n <= 1) {
|
|
||||||
return rules;
|
|
||||||
}
|
|
||||||
if (n == 2) {
|
|
||||||
RuleRec rec1 = rules.get(0);
|
|
||||||
RuleRec rec2 = rules.get(1);
|
|
||||||
if (rec1.getMonthNum() > rec2.getMonthNum()) {
|
|
||||||
rules.set(0, rec2);
|
|
||||||
rules.set(1, rec1);
|
|
||||||
} else if (rec1.getMonthNum() == rec2.getMonthNum()) {
|
|
||||||
// TODO: it's not accurate to ignore time types (STD, WALL, UTC)
|
|
||||||
long t1 = Time.getLocalTime(year, rec1.getMonth(),
|
|
||||||
rec1.getDay(), rec1.getTime().getTime());
|
|
||||||
long t2 = Time.getLocalTime(year, rec2.getMonth(),
|
|
||||||
rec2.getDay(), rec2.getTime().getTime());
|
|
||||||
if (t1 > t2) {
|
|
||||||
rules.set(0, rec2);
|
|
||||||
rules.set(1, rec1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return rules;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int y = year;
|
|
||||||
RuleRec[] recs = new RuleRec[rules.size()];
|
|
||||||
rules.toArray(recs);
|
|
||||||
Arrays.sort(recs, new Comparator<RuleRec>() {
|
|
||||||
public int compare(RuleRec r1, RuleRec r2) {
|
|
||||||
int n = r1.getMonthNum() - r2.getMonthNum();
|
|
||||||
if (n != 0) {
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
// TODO: it's not accurate to ignore time types (STD, WALL, UTC)
|
|
||||||
long t1 = Time.getLocalTime(y, r1.getMonth(),
|
|
||||||
r1.getDay(), r1.getTime().getTime());
|
|
||||||
long t2 = Time.getLocalTime(y, r2.getMonth(),
|
|
||||||
r2.getDay(), r2.getTime().getTime());
|
|
||||||
return (int)(t1 - t2);
|
|
||||||
}
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
return this == o;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
rules.clear();
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
rules.add(recs[i]);
|
|
||||||
}
|
|
||||||
return rules;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets rule records that have either "max" or cover the endYear
|
|
||||||
* value in its DST schedule.
|
|
||||||
*
|
|
||||||
* @return rules that contain last DST schedule. An empty
|
|
||||||
* ArrayList is returned if no last rules are found.
|
|
||||||
*/
|
|
||||||
List<RuleRec> getLastRules() {
|
|
||||||
RuleRec start = null;
|
|
||||||
RuleRec end = null;
|
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
RuleRec rec = list.get(i);
|
|
||||||
if (rec.isLastRule()) {
|
|
||||||
if (rec.getSave() > 0) {
|
|
||||||
start = rec;
|
|
||||||
} else {
|
|
||||||
end = rec;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (start == null || end == null) {
|
|
||||||
int endYear = Zoneinfo.getEndYear();
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
RuleRec rec = list.get(i);
|
|
||||||
if (endYear >= rec.getFromYear() && endYear <= rec.getToYear()) {
|
|
||||||
if (start == null && rec.getSave() > 0) {
|
|
||||||
start = rec;
|
|
||||||
} else {
|
|
||||||
if (end == null && rec.getSave() == 0) {
|
|
||||||
end = rec;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List<RuleRec> r = new ArrayList<RuleRec>(2);
|
|
||||||
if (start == null || end == null) {
|
|
||||||
if (start != null || end != null) {
|
|
||||||
Main.warning("found last rules for "+name+" inconsistent.");
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
r.add(start);
|
|
||||||
r.add(end);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,190 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2010, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
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}
|
|
||||||
* convention.
|
|
||||||
*
|
|
||||||
* @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;
|
|
||||||
private int soonerOrLater = 0;
|
|
||||||
private int thanDayOfMonth; // day of month (e.g., 8 for "Sun>=8")
|
|
||||||
|
|
||||||
RuleDay() {
|
|
||||||
}
|
|
||||||
|
|
||||||
RuleDay(int day) {
|
|
||||||
thanDayOfMonth = day;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getDay() {
|
|
||||||
return thanDayOfMonth;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the day of week value (1-based)
|
|
||||||
*/
|
|
||||||
int getDayOfWeekNum() {
|
|
||||||
return dow.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if this rule day represents the last day of
|
|
||||||
* week. (e.g., lastSun).
|
|
||||||
*/
|
|
||||||
boolean isLast() {
|
|
||||||
return lastOne;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if this rule day represents the day of week on or
|
|
||||||
* later than (after) the {@link #getDay}. (e.g., Sun>=1)
|
|
||||||
*/
|
|
||||||
boolean isLater() {
|
|
||||||
return soonerOrLater > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if this rule day represents the day of week on or
|
|
||||||
* earlier than (before) the {@link #getDay}. (e.g., Sun<=15)
|
|
||||||
*/
|
|
||||||
boolean isEarlier() {
|
|
||||||
return soonerOrLater < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if this rule day represents an exact day.
|
|
||||||
*/
|
|
||||||
boolean isExact() {
|
|
||||||
return soonerOrLater == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses the "ON" field and constructs a RuleDay.
|
|
||||||
* @param day an "ON" field string (e.g., "Sun>=1")
|
|
||||||
* @return a RuleDay representing the given "ON" field
|
|
||||||
*/
|
|
||||||
static RuleDay parse(String day) {
|
|
||||||
RuleDay d = new RuleDay();
|
|
||||||
if (day.startsWith("last")) {
|
|
||||||
d.lastOne = true;
|
|
||||||
d.dayName = day.substring(4);
|
|
||||||
d.dow = getDOW(d.dayName);
|
|
||||||
} else {
|
|
||||||
int index;
|
|
||||||
if ((index = day.indexOf(">=")) != -1) {
|
|
||||||
d.dayName = day.substring(0, index);
|
|
||||||
d.dow = getDOW(d.dayName);
|
|
||||||
d.soonerOrLater = 1; // greater or equal
|
|
||||||
d.thanDayOfMonth = Integer.parseInt(day.substring(index+2));
|
|
||||||
} else if ((index = day.indexOf("<=")) != -1) {
|
|
||||||
d.dayName = day.substring(0, index);
|
|
||||||
d.dow = getDOW(d.dayName);
|
|
||||||
d.soonerOrLater = -1; // less or equal
|
|
||||||
d.thanDayOfMonth = Integer.parseInt(day.substring(index+2));
|
|
||||||
} else {
|
|
||||||
// it should be an integer value.
|
|
||||||
d.thanDayOfMonth = Integer.parseInt(day);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts this RuleDay to the SimpleTimeZone day rule.
|
|
||||||
* @return the converted SimpleTimeZone day rule
|
|
||||||
*/
|
|
||||||
int getDayForSimpleTimeZone() {
|
|
||||||
if (isLast()) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return isEarlier() ? -getDay() : getDay();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts this RuleDay to the SimpleTimeZone day-of-week rule.
|
|
||||||
* @return the SimpleTimeZone day-of-week rule value
|
|
||||||
*/
|
|
||||||
int getDayOfWeekForSimpleTimeZoneInt() {
|
|
||||||
if (isEarlier() || isLater()) {
|
|
||||||
return -getDayOfWeekNum();
|
|
||||||
}
|
|
||||||
return isLast() ? getDayOfWeekNum() : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the string representation of the {@link
|
|
||||||
* #getDayOfWeekForSimpleTimeZoneInt} value
|
|
||||||
*/
|
|
||||||
String getDayOfWeekForSimpleTimeZone() {
|
|
||||||
int d = getDayOfWeekForSimpleTimeZoneInt();
|
|
||||||
if (d == 0) {
|
|
||||||
return "0";
|
|
||||||
}
|
|
||||||
String sign = "";
|
|
||||||
if (d < 0) {
|
|
||||||
sign = "-";
|
|
||||||
d = -d;
|
|
||||||
}
|
|
||||||
return sign + toString(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static DayOfWeek getDOW(String abbr) {
|
|
||||||
return abbreviations.get(abbr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts the specified day of week value to the day-of-week
|
|
||||||
* name defined in {@link java.util.Calenda}.
|
|
||||||
* @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.
|
|
||||||
*/
|
|
||||||
static String toString(int dow) {
|
|
||||||
if (dow >= DayOfWeek.SUNDAY.value() && dow <= DayOfWeek.SATURDAY.value()) {
|
|
||||||
return "Calendar." + DayOfWeek.values()[dow - 1];
|
|
||||||
}
|
|
||||||
throw new IllegalArgumentException("wrong Day_of_Week number: " + dow);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,232 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2004, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.util.StringTokenizer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* RuleRec class represents one record of the Rule set.
|
|
||||||
*
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
class RuleRec {
|
|
||||||
private int fromYear;
|
|
||||||
private int toYear;
|
|
||||||
private String type;
|
|
||||||
private Month inMonth;
|
|
||||||
private RuleDay onDay;
|
|
||||||
private Time atTime;
|
|
||||||
private int save;
|
|
||||||
private String letters;
|
|
||||||
private String line;
|
|
||||||
private boolean isLastRule;
|
|
||||||
|
|
||||||
int getFromYear() {
|
|
||||||
return fromYear;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getToYear() {
|
|
||||||
return toYear;
|
|
||||||
}
|
|
||||||
|
|
||||||
Month getMonth() {
|
|
||||||
return inMonth;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getMonthNum() {
|
|
||||||
return inMonth.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
RuleDay getDay() {
|
|
||||||
return onDay;
|
|
||||||
}
|
|
||||||
|
|
||||||
Time getTime() {
|
|
||||||
return atTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getSave() {
|
|
||||||
return save;
|
|
||||||
}
|
|
||||||
|
|
||||||
String getLine() {
|
|
||||||
return line;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the line from the text file.
|
|
||||||
* @param line the text of the line
|
|
||||||
*/
|
|
||||||
void setLine(String line) {
|
|
||||||
this.line = line;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if the rule type is "odd".
|
|
||||||
*/
|
|
||||||
boolean isOdd() {
|
|
||||||
return "odd".equals(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if the rule type is "even".
|
|
||||||
*/
|
|
||||||
boolean isEven() {
|
|
||||||
return "even".equals(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if this rule record is the last DST schedule rule.
|
|
||||||
*
|
|
||||||
* @return true if this rule record has "max" as TO (year).
|
|
||||||
*/
|
|
||||||
boolean isLastRule() {
|
|
||||||
return isLastRule;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if the unadjusted until time of the specified ZoneRec
|
|
||||||
* is the same as the transition time of this rule in the same
|
|
||||||
* year as the ZoneRec until year.
|
|
||||||
*
|
|
||||||
* @param zrec ZoneRec to compare to
|
|
||||||
* @param save the amount of daylight saving in milliseconds
|
|
||||||
* @param gmtOffset the GMT offset value in milliseconds
|
|
||||||
* @return true if the unadjusted until time is the same as rule's
|
|
||||||
* transition time.
|
|
||||||
*/
|
|
||||||
boolean isSameTransition(ZoneRec zrec, int save, int gmtOffset) {
|
|
||||||
long until, transition;
|
|
||||||
|
|
||||||
if (zrec.getUntilTime().getType() != atTime.getType()) {
|
|
||||||
until = zrec.getLocalUntilTime(save, gmtOffset);
|
|
||||||
transition = Time.getLocalTime(zrec.getUntilYear(),
|
|
||||||
getMonth(),
|
|
||||||
getDay(),
|
|
||||||
save,
|
|
||||||
gmtOffset,
|
|
||||||
atTime);
|
|
||||||
} else {
|
|
||||||
until = zrec.getLocalUntilTime();
|
|
||||||
transition = Time.getLocalTime(zrec.getUntilYear(),
|
|
||||||
getMonth(),
|
|
||||||
getDay(),
|
|
||||||
atTime.getTime());
|
|
||||||
}
|
|
||||||
|
|
||||||
return until == transition;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses a Rule line and returns a RuleRec object.
|
|
||||||
*
|
|
||||||
* @param tokens a StringTokenizer object that should contain a
|
|
||||||
* token for the "FROM" field and the rest.
|
|
||||||
* @return a RuleRec object.
|
|
||||||
*/
|
|
||||||
static RuleRec parse(StringTokenizer tokens) {
|
|
||||||
RuleRec rec = new RuleRec();
|
|
||||||
try {
|
|
||||||
// FROM
|
|
||||||
String token = tokens.nextToken();
|
|
||||||
try {
|
|
||||||
rec.fromYear = Integer.parseInt(token);
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
// it's not integer
|
|
||||||
if ("min".equals(token) || "minimum".equals(token)) {
|
|
||||||
rec.fromYear = Zoneinfo.getMinYear();
|
|
||||||
} else if ("max".equals(token) || "maximum".equals(token)) {
|
|
||||||
rec.fromYear = Zoneinfo.getMaxYear();
|
|
||||||
} else {
|
|
||||||
Main.panic("invalid year value: "+token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TO
|
|
||||||
token = tokens.nextToken();
|
|
||||||
rec.isLastRule = false;
|
|
||||||
try {
|
|
||||||
rec.toYear = Integer.parseInt(token);
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
// it's not integer
|
|
||||||
if ("min".equals(token) || "minimum".equals(token)) {
|
|
||||||
rec.fromYear = Zoneinfo.getMinYear();
|
|
||||||
} else if ("max".equals(token) || "maximum".equals(token)) {
|
|
||||||
rec.toYear = Integer.MAX_VALUE;
|
|
||||||
rec.isLastRule = true;
|
|
||||||
} else if ("only".equals(token)) {
|
|
||||||
rec.toYear = rec.fromYear;
|
|
||||||
} else {
|
|
||||||
Main.panic("invalid year value: "+token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TYPE
|
|
||||||
rec.type = tokens.nextToken();
|
|
||||||
|
|
||||||
// IN
|
|
||||||
rec.inMonth = Month.parse(tokens.nextToken());
|
|
||||||
|
|
||||||
// ON
|
|
||||||
rec.onDay = RuleDay.parse(tokens.nextToken());
|
|
||||||
|
|
||||||
// AT
|
|
||||||
rec.atTime = Time.parse(tokens.nextToken());
|
|
||||||
|
|
||||||
// SAVE
|
|
||||||
rec.save = (int) Time.parse(tokens.nextToken()).getTime();
|
|
||||||
|
|
||||||
// LETTER/S
|
|
||||||
rec.letters = tokens.nextToken();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return rec;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates the transition time of the given year under this rule.
|
|
||||||
* @param year the year value
|
|
||||||
* @param gmtOffset the GMT offset value in milliseconds
|
|
||||||
* @param save the amount of daylight save time
|
|
||||||
* @return the transition time in milliseconds of the given year in UTC.
|
|
||||||
*/
|
|
||||||
long getTransitionTime(int year, int gmtOffset, int save) {
|
|
||||||
long time = Time.getLocalTime(year, getMonth(),
|
|
||||||
getDay(), atTime.getTime());
|
|
||||||
if (atTime.isSTD()) {
|
|
||||||
time -= gmtOffset;
|
|
||||||
} else if (atTime.isWall()) {
|
|
||||||
time -= gmtOffset + save;
|
|
||||||
}
|
|
||||||
return time;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getInt(StringTokenizer tokens) {
|
|
||||||
String token = tokens.nextToken();
|
|
||||||
return Integer.parseInt(token);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,188 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2011, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.io.BufferedWriter;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileWriter;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.SortedMap;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <code>Simple</code> generates TimeZoneData, which had been used as internal
|
|
||||||
* data of TimeZone before J2SDK1.3.
|
|
||||||
* Since J2SDK1.4 doesn't need TimeZoneData, this class is for maintenance
|
|
||||||
* of old JDK release.
|
|
||||||
*/
|
|
||||||
class Simple extends BackEnd {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Zone records which are applied for given year.
|
|
||||||
*/
|
|
||||||
private static Map<String,ZoneRec> lastZoneRecs = new HashMap<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rule records which are applied for given year.
|
|
||||||
*/
|
|
||||||
private static Map<String,List<RuleRec>> lastRules = new TreeMap<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* zone IDs sorted by their GMT offsets. If zone's GMT
|
|
||||||
* offset will change in the future, its last known offset is
|
|
||||||
* used.
|
|
||||||
*/
|
|
||||||
private SortedMap<Integer, Set<String>> zonesByOffset = new TreeMap<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets last Rule records and Zone records for given timezone to
|
|
||||||
* each Map.
|
|
||||||
*
|
|
||||||
* @param tz Timezone object for each zone
|
|
||||||
* @return always 0
|
|
||||||
*/
|
|
||||||
int processZoneinfo(Timezone tz) {
|
|
||||||
String zonename = tz.getName();
|
|
||||||
|
|
||||||
lastRules.put(zonename, tz.getLastRules());
|
|
||||||
lastZoneRecs.put(zonename, tz.getLastZoneRec());
|
|
||||||
|
|
||||||
// Populate zonesByOffset. (Zones that will change their
|
|
||||||
// GMT offsets are also added to zonesByOffset here.)
|
|
||||||
int lastKnownOffset = tz.getRawOffset();
|
|
||||||
Set<String> set = zonesByOffset.get(lastKnownOffset);
|
|
||||||
if (set == null) {
|
|
||||||
set = new TreeSet<>();
|
|
||||||
zonesByOffset.put(lastKnownOffset, set);
|
|
||||||
}
|
|
||||||
set.add(zonename);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates TimeZoneData to output SimpleTimeZone data.
|
|
||||||
* @param map Mappings object which is generated by {@link Main#compile}.
|
|
||||||
* @return 0 if no error occurred, otherwise 1.
|
|
||||||
*/
|
|
||||||
int generateSrc(Mappings map) {
|
|
||||||
try {
|
|
||||||
File outD = new File(Main.getOutputDir());
|
|
||||||
outD.mkdirs();
|
|
||||||
|
|
||||||
FileWriter fw =
|
|
||||||
new FileWriter(new File(outD, "TimeZoneData.java"), false);
|
|
||||||
BufferedWriter out = new BufferedWriter(fw);
|
|
||||||
|
|
||||||
out.write("import java.util.SimpleTimeZone;\n\n");
|
|
||||||
out.write(" static SimpleTimeZone zones[] = {\n");
|
|
||||||
|
|
||||||
Map<String,String> a = map.getAliases();
|
|
||||||
List<Integer> roi = map.getRawOffsetsIndex();
|
|
||||||
List<Set<String>> roit = map.getRawOffsetsIndexTable();
|
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
for (int offset : zonesByOffset.keySet()) {
|
|
||||||
int o = roi.get(index);
|
|
||||||
Set<String> set = zonesByOffset.get(offset);
|
|
||||||
if (offset == o) {
|
|
||||||
// Merge aliases into zonesByOffset
|
|
||||||
set.addAll(roit.get(index));
|
|
||||||
}
|
|
||||||
index++;
|
|
||||||
|
|
||||||
for (String key : set) {
|
|
||||||
ZoneRec zrec;
|
|
||||||
String realname;
|
|
||||||
List<RuleRec> stz;
|
|
||||||
if ((realname = a.get(key)) != null) {
|
|
||||||
// if this alias is not targeted, ignore it.
|
|
||||||
if (!Zone.isTargetZone(key)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
stz = lastRules.get(realname);
|
|
||||||
zrec = lastZoneRecs.get(realname);
|
|
||||||
} else {
|
|
||||||
stz = lastRules.get(key);
|
|
||||||
zrec = lastZoneRecs.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
out.write("\t//--------------------------------------------------------------------\n");
|
|
||||||
String s = Time.toFormedString(offset);
|
|
||||||
out.write("\tnew SimpleTimeZone(" +
|
|
||||||
Time.toFormedString(offset) + ", \"" + key + "\"");
|
|
||||||
if (realname != null) {
|
|
||||||
out.write(" /* " + realname + " */");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stz == null) {
|
|
||||||
out.write("),\n");
|
|
||||||
} else {
|
|
||||||
RuleRec rr0 = stz.get(0);
|
|
||||||
RuleRec rr1 = stz.get(1);
|
|
||||||
|
|
||||||
out.write(",\n\t " + Month.toString(rr0.getMonthNum()) +
|
|
||||||
", " + rr0.getDay().getDayForSimpleTimeZone() + ", " +
|
|
||||||
rr0.getDay().getDayOfWeekForSimpleTimeZone() + ", " +
|
|
||||||
Time.toFormedString((int)rr0.getTime().getTime()) + ", " +
|
|
||||||
rr0.getTime().getTypeForSimpleTimeZone() + ",\n" +
|
|
||||||
|
|
||||||
"\t " + Month.toString(rr1.getMonthNum()) + ", " +
|
|
||||||
rr1.getDay().getDayForSimpleTimeZone() + ", " +
|
|
||||||
rr1.getDay().getDayOfWeekForSimpleTimeZone() + ", " +
|
|
||||||
Time.toFormedString((int)rr1.getTime().getTime())+ ", " +
|
|
||||||
rr1.getTime().getTypeForSimpleTimeZone() + ",\n" +
|
|
||||||
|
|
||||||
"\t " + Time.toFormedString(rr0.getSave()) + "),\n");
|
|
||||||
|
|
||||||
out.write("\t// " + rr0.getLine() + "\n");
|
|
||||||
out.write("\t// " + rr1.getLine() + "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
String zline = zrec.getLine();
|
|
||||||
if (zline.indexOf("Zone") == -1) {
|
|
||||||
zline = "Zone " + key + "\t" + zline.trim();
|
|
||||||
}
|
|
||||||
out.write("\t// " + zline + "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out.write(" };\n");
|
|
||||||
|
|
||||||
out.close();
|
|
||||||
fw.close();
|
|
||||||
} catch(IOException e) {
|
|
||||||
Main.panic("IO error: "+e.getMessage());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,343 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2011, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
import sun.util.calendar.CalendarDate;
|
|
||||||
import sun.util.calendar.CalendarSystem;
|
|
||||||
import sun.util.calendar.Gregorian;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Time class represents the "AT" field and other time related information.
|
|
||||||
*
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
class Time {
|
|
||||||
|
|
||||||
static final Gregorian gcal = CalendarSystem.getGregorianCalendar();
|
|
||||||
|
|
||||||
// type is wall clock time
|
|
||||||
private static final int WALL = 1;
|
|
||||||
|
|
||||||
// type is standard time
|
|
||||||
private static final int STD = 2;
|
|
||||||
|
|
||||||
// type is UTC
|
|
||||||
private static final int UTC = 3;
|
|
||||||
|
|
||||||
// type of representing time
|
|
||||||
private int type;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Time from the EPOCH in milliseconds
|
|
||||||
*/
|
|
||||||
private long time;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Current time in milliseconds
|
|
||||||
*/
|
|
||||||
private static final long currentTime = System.currentTimeMillis();
|
|
||||||
|
|
||||||
Time() {
|
|
||||||
time = 0L;
|
|
||||||
}
|
|
||||||
|
|
||||||
Time(long time) {
|
|
||||||
this.time = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setType(int type) {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
long getTime() {
|
|
||||||
return time;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getType() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static long getCurrentTime() {
|
|
||||||
return currentTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if the time is represented in wall-clock time.
|
|
||||||
*/
|
|
||||||
boolean isWall() {
|
|
||||||
return type == WALL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if the time is represented in standard time.
|
|
||||||
*/
|
|
||||||
boolean isSTD() {
|
|
||||||
return type == STD;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if the time is represented in UTC time.
|
|
||||||
*/
|
|
||||||
boolean isUTC() {
|
|
||||||
return type == UTC;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts the type to a string that represents the type in the
|
|
||||||
* SimpleTimeZone time mode. (e.g., "SimpleTimeZone.WALL_TIME").
|
|
||||||
* @return the converted string or null if the type is undefined.
|
|
||||||
*/
|
|
||||||
String getTypeForSimpleTimeZone() {
|
|
||||||
String stz = "SimpleTimeZone.";
|
|
||||||
if (isWall()) {
|
|
||||||
return stz+"WALL_TIME";
|
|
||||||
}
|
|
||||||
else if (isSTD()) {
|
|
||||||
return stz+"STANDARD_TIME";
|
|
||||||
}
|
|
||||||
else if (isUTC()) {
|
|
||||||
return stz+"UTC_TIME";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts the given Gregorian calendar field values to local time.
|
|
||||||
* Local time is represented by the amount of milliseconds from
|
|
||||||
* January 1, 1970 0:00 GMT.
|
|
||||||
* @param year the year value
|
|
||||||
* @param month the Month value
|
|
||||||
* @param day the day represented by {@link RuleDay}
|
|
||||||
* @param save the amount of daylight time in milliseconds
|
|
||||||
* @param gmtOffset the GMT offset in milliseconds
|
|
||||||
* @param time the time of the day represented by {@link Time}
|
|
||||||
* @return local time
|
|
||||||
*/
|
|
||||||
static long getLocalTime(int year, Month month, RuleDay day, int save,
|
|
||||||
int gmtOffset, Time time) {
|
|
||||||
long t = time.getTime();
|
|
||||||
|
|
||||||
if (time.isSTD())
|
|
||||||
t = time.getTime() + save;
|
|
||||||
else if (time.isUTC())
|
|
||||||
t = time.getTime() + save + gmtOffset;
|
|
||||||
|
|
||||||
return getLocalTime(year, month, day, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts the given Gregorian calendar field values to local time.
|
|
||||||
* Local time is represented by the amount of milliseconds from
|
|
||||||
* January 1, 1970 0:00 GMT.
|
|
||||||
* @param year the year value
|
|
||||||
* @param month the Month value
|
|
||||||
* @param day the day value
|
|
||||||
* @param time the time of the day in milliseconds
|
|
||||||
* @return local time
|
|
||||||
*/
|
|
||||||
static long getLocalTime(int year, Month month, int day, long time) {
|
|
||||||
CalendarDate date = gcal.newCalendarDate(null);
|
|
||||||
date.setDate(year, month.value(), day);
|
|
||||||
long millis = gcal.getTime(date);
|
|
||||||
return millis + time;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Equivalent to <code>getLocalTime(year, month, day, (long)time)</code>.
|
|
||||||
* @param year the year value
|
|
||||||
* @param month the Month value
|
|
||||||
* @param day the day value
|
|
||||||
* @param time the time of the day in milliseconds
|
|
||||||
* @return local time
|
|
||||||
*/
|
|
||||||
static long getLocalTime(int year, Month month, int day, int time) {
|
|
||||||
return getLocalTime(year, month, day, (long)time);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Equivalent to {@link #getLocalTime(int, Month, RuleDay, int)
|
|
||||||
* getLocalTime(year, month, day, (int) time)}.
|
|
||||||
* @param year the year value
|
|
||||||
* @param month the Month value
|
|
||||||
* @param day the day represented by {@link RuleDay}
|
|
||||||
* @param time the time of the day represented by {@link Time}
|
|
||||||
* @return local time
|
|
||||||
*/
|
|
||||||
static long getLocalTime(int year, Month month, RuleDay day, long time) {
|
|
||||||
return getLocalTime(year, month, day, (int) time);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts the given Gregorian calendar field values to local time.
|
|
||||||
* Local time is represented by the amount of milliseconds from
|
|
||||||
* January 1, 1970 0:00 GMT.
|
|
||||||
* @param year the year value
|
|
||||||
* @param month the Month value
|
|
||||||
* @param day the day represented by {@link RuleDay}
|
|
||||||
* @param time the time of the day represented by {@link Time}
|
|
||||||
* @return local time
|
|
||||||
*/
|
|
||||||
static long getLocalTime(int year, Month month, RuleDay day, int time) {
|
|
||||||
CalendarDate cdate = gcal.newCalendarDate(null);
|
|
||||||
int monthValue = month.value();
|
|
||||||
|
|
||||||
if (day.isLast()) { // e.g., "lastSun"
|
|
||||||
cdate.setDate(year, monthValue, 1);
|
|
||||||
cdate.setDayOfMonth(gcal.getMonthLength(cdate));
|
|
||||||
cdate = gcal.getNthDayOfWeek(-1, day.getDayOfWeekNum(), cdate);
|
|
||||||
} else if (day.isLater()) { // e.g., "Sun>=1"
|
|
||||||
cdate.setDate(year, monthValue, day.getDay());
|
|
||||||
cdate = gcal.getNthDayOfWeek(1, day.getDayOfWeekNum(), cdate);
|
|
||||||
} else if (day.isExact()) {
|
|
||||||
cdate.setDate(year, monthValue, day.getDay());
|
|
||||||
} else if (day.isEarlier()) { // e.g., "Sun<=15"
|
|
||||||
cdate.setDate(year, monthValue, day.getDay());
|
|
||||||
cdate = gcal.getNthDayOfWeek(-1, day.getDayOfWeekNum(), cdate);
|
|
||||||
} else {
|
|
||||||
Main.panic("invalid day type: " + day);
|
|
||||||
}
|
|
||||||
return gcal.getTime(cdate) + time;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses the given "AT" field and constructs a Time object.
|
|
||||||
* @param the "AT" field string
|
|
||||||
* @return the Time object
|
|
||||||
*/
|
|
||||||
static Time parse(String time) {
|
|
||||||
int sign;
|
|
||||||
int index = 0;
|
|
||||||
Time tm;
|
|
||||||
|
|
||||||
if (time.charAt(0) == '-') {
|
|
||||||
sign = -1;
|
|
||||||
index++;
|
|
||||||
} else {
|
|
||||||
sign = 1;
|
|
||||||
}
|
|
||||||
int val = 0;
|
|
||||||
int num = 0;
|
|
||||||
int countDelim = 0;
|
|
||||||
while (index < time.length()) {
|
|
||||||
char c = time.charAt(index++);
|
|
||||||
if (c == ':') {
|
|
||||||
val = val * 60 + num;
|
|
||||||
countDelim++;
|
|
||||||
num = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
int d = Character.digit(c, 10);
|
|
||||||
if (d == -1) {
|
|
||||||
--index;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
num = num * 10 + d;
|
|
||||||
}
|
|
||||||
val = val * 60 + num;
|
|
||||||
// convert val to second
|
|
||||||
for (; countDelim < 2; countDelim++) {
|
|
||||||
val *= 60;
|
|
||||||
}
|
|
||||||
tm = new Time((long)val * 1000 * sign);
|
|
||||||
if (index < time.length()) {
|
|
||||||
char c = time.charAt(index++);
|
|
||||||
if (c == 's') {
|
|
||||||
tm.setType(Time.STD);
|
|
||||||
} else if (c == 'u' || c == 'g' || c == 'z') {
|
|
||||||
tm.setType(Time.UTC);
|
|
||||||
} else if (c == 'w') {
|
|
||||||
tm.setType(Time.WALL);
|
|
||||||
} else {
|
|
||||||
Main.panic("unknown time mode: "+c);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tm.setType(Time.WALL);
|
|
||||||
}
|
|
||||||
return tm;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts the given milliseconds string to a "[+-]hh:mm" string.
|
|
||||||
* @param ms the milliseconds string
|
|
||||||
*/
|
|
||||||
static String toGMTFormat(String ms) {
|
|
||||||
long sec = Long.parseLong(ms) / 1000;
|
|
||||||
char sign;
|
|
||||||
if (sec < 0) {
|
|
||||||
sign = '-';
|
|
||||||
sec = -sec;
|
|
||||||
} else {
|
|
||||||
sign = '+';
|
|
||||||
}
|
|
||||||
return String.format((Locale)null, "%c%02d:%02d",
|
|
||||||
sign, sec/3600, (sec%3600)/60);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts the given millisecond value to a string for a
|
|
||||||
* SimpleTimeZone parameter.
|
|
||||||
* @param ms the millisecond value
|
|
||||||
* @return the string in a human readable form
|
|
||||||
*/
|
|
||||||
static String toFormedString(int ms) {
|
|
||||||
StringBuilder s = new StringBuilder();
|
|
||||||
boolean minus = false;
|
|
||||||
|
|
||||||
if (ms < 0) {
|
|
||||||
s.append("-");
|
|
||||||
minus = true;
|
|
||||||
ms = -ms;
|
|
||||||
} else if (ms == 0) {
|
|
||||||
return "0";
|
|
||||||
}
|
|
||||||
|
|
||||||
int hour = ms / (60 * 60 * 1000);
|
|
||||||
ms %= (60 * 60 * 1000);
|
|
||||||
int minute = ms / (60 * 1000);
|
|
||||||
|
|
||||||
if (hour != 0) {
|
|
||||||
if (minus && minute != 0) {
|
|
||||||
s.append("(");
|
|
||||||
}
|
|
||||||
s.append(Integer.toString(hour) + "*ONE_HOUR");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (minute != 0) {
|
|
||||||
if (hour != 0) {
|
|
||||||
s.append("+");
|
|
||||||
}
|
|
||||||
s.append(Integer.toString(minute) + "*ONE_MINUTE");
|
|
||||||
if (minus && hour != 0) {
|
|
||||||
s.append(")");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.toString();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,454 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2004, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Timezone represents all information of a single point of time to
|
|
||||||
* generate its time zone database.
|
|
||||||
*
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
class Timezone {
|
|
||||||
/**
|
|
||||||
* zone name of this time zone
|
|
||||||
*/
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* transition time values in UTC (millisecond)
|
|
||||||
*/
|
|
||||||
private List<Long> transitions;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* All offset values in millisecond
|
|
||||||
* @see sun.util.calendar.ZoneInfo
|
|
||||||
*/
|
|
||||||
private List<Integer> offsets;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Indices of GMT offset values (both raw and raw+saving)
|
|
||||||
* at transitions
|
|
||||||
*/
|
|
||||||
private List<Integer> gmtOffsets;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Indices of regular or "direct" saving time values
|
|
||||||
* at transitions
|
|
||||||
*/
|
|
||||||
private List<Integer> dstOffsets;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Zone records of this time zone
|
|
||||||
*/
|
|
||||||
private List<ZoneRec> usedZoneRecs;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rule records referred to by this time zone
|
|
||||||
*/
|
|
||||||
private List<RuleRec> usedRuleRecs;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Type of DST rules in this time zone
|
|
||||||
*/
|
|
||||||
private int dstType;
|
|
||||||
static final int UNDEF_DST = 0; // DST type not set yet
|
|
||||||
static final int NO_DST = 1; // never observed DST
|
|
||||||
static final int LAST_DST = 2; // last rule ends in DST (all year round DST-only)
|
|
||||||
static final int X_DST = 3; // used to observe DST
|
|
||||||
static final int DST = 4; // observing DST regularly
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Raw GMT offset of this time zone in the last rule
|
|
||||||
*/
|
|
||||||
private int rawOffset;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The CRC32 value of the transitions data
|
|
||||||
*/
|
|
||||||
private int crc32;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The last ZoneRec
|
|
||||||
*/
|
|
||||||
private ZoneRec lastZoneRec;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The last DST rules. lastRules[0] is the DST start
|
|
||||||
* rule. lastRules[1] is the DST end rules.
|
|
||||||
*/
|
|
||||||
private List<RuleRec> lastRules;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The amount of DST saving value (millisecond) in the last DST
|
|
||||||
* rule.
|
|
||||||
*/
|
|
||||||
private int lastSaving;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* true if the raw offset will change in the future time.
|
|
||||||
*/
|
|
||||||
private boolean willRawOffsetChange = false;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constracts a Timezone object with the given zone name.
|
|
||||||
* @param name the zone name
|
|
||||||
*/
|
|
||||||
Timezone(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the number of transitions
|
|
||||||
*/
|
|
||||||
int getNTransitions() {
|
|
||||||
if (transitions == null) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return transitions.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the zone name
|
|
||||||
*/
|
|
||||||
String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the list of all rule records that have been referred to
|
|
||||||
* by this time zone.
|
|
||||||
* @return the rule records list
|
|
||||||
*/
|
|
||||||
List<RuleRec> getRules() {
|
|
||||||
return usedRuleRecs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the list of all zone records that have been referred to
|
|
||||||
* by this time zone.
|
|
||||||
* @return the zone records list
|
|
||||||
*/
|
|
||||||
List<ZoneRec> getZones() {
|
|
||||||
return usedZoneRecs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the transition table (list)
|
|
||||||
*/
|
|
||||||
List<Long> getTransitions() {
|
|
||||||
return transitions;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the offsets list
|
|
||||||
*/
|
|
||||||
List<Integer> getOffsets() {
|
|
||||||
return offsets;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the DST saving offsets list
|
|
||||||
*/
|
|
||||||
List<Integer> getDstOffsets() {
|
|
||||||
return dstOffsets;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the GMT offsets list
|
|
||||||
*/
|
|
||||||
List<Integer> getGmtOffsets() {
|
|
||||||
return gmtOffsets;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the checksum (crc32) value of the trasition table
|
|
||||||
*/
|
|
||||||
int getCRC32() {
|
|
||||||
return crc32;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if the GMT offset of this time zone would change
|
|
||||||
* after the time zone database has been generated, false, otherwise.
|
|
||||||
*/
|
|
||||||
boolean willGMTOffsetChange() {
|
|
||||||
return willRawOffsetChange;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the last known GMT offset value in milliseconds
|
|
||||||
*/
|
|
||||||
int getRawOffset() {
|
|
||||||
return rawOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets time zone's GMT offset to <code>offset</code>.
|
|
||||||
* @param offset the GMT offset value in milliseconds
|
|
||||||
*/
|
|
||||||
void setRawOffset(int offset) {
|
|
||||||
rawOffset = offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets time zone's GMT offset value to <code>offset</code>. If
|
|
||||||
* <code>startTime</code> is future time, then the {@link
|
|
||||||
* #willRawOffsetChange} value is set to true.
|
|
||||||
* @param offset the GMT offset value in milliseconds
|
|
||||||
* @param startTime the UTC time at which the GMT offset is in effective
|
|
||||||
*/
|
|
||||||
void setRawOffset(int offset, long startTime) {
|
|
||||||
// if this rawOffset is for the future time, let the run-time
|
|
||||||
// look for the current GMT offset.
|
|
||||||
if (startTime > Time.getCurrentTime()) {
|
|
||||||
willRawOffsetChange = true;
|
|
||||||
}
|
|
||||||
setRawOffset(offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the specified transition information to the end of the transition table.
|
|
||||||
* @param time the UTC time at which this transition happens
|
|
||||||
* @param offset the total amount of the offset from GMT in milliseconds
|
|
||||||
* @param dstOffset the amount of time in milliseconds saved at this transition
|
|
||||||
*/
|
|
||||||
void addTransition(long time, int offset, int dstOffset) {
|
|
||||||
if (transitions == null) {
|
|
||||||
transitions = new ArrayList<Long>();
|
|
||||||
offsets = new ArrayList<Integer>();
|
|
||||||
dstOffsets = new ArrayList<Integer>();
|
|
||||||
}
|
|
||||||
transitions.add(time);
|
|
||||||
offsets.add(offset);
|
|
||||||
dstOffsets.add(dstOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the type of historical daylight saving time
|
|
||||||
* observation. For example, China used to observed daylight
|
|
||||||
* saving time, but it no longer does. Then, X_DST is set to the
|
|
||||||
* China time zone.
|
|
||||||
* @param type the type of daylight saving time
|
|
||||||
*/
|
|
||||||
void setDSTType(int type) {
|
|
||||||
dstType = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the type of historical daylight saving time
|
|
||||||
* observation.
|
|
||||||
*/
|
|
||||||
int getDSTType() {
|
|
||||||
return dstType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the specified zone record to the zone records list.
|
|
||||||
* @param rec the zone record
|
|
||||||
*/
|
|
||||||
void addUsedRec(ZoneRec rec) {
|
|
||||||
if (usedZoneRecs == null) {
|
|
||||||
usedZoneRecs = new ArrayList<ZoneRec>();
|
|
||||||
}
|
|
||||||
usedZoneRecs.add(rec);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the specified rule record to the rule records list.
|
|
||||||
* @param rec the rule record
|
|
||||||
*/
|
|
||||||
void addUsedRec(RuleRec rec) {
|
|
||||||
if (usedRuleRecs == null) {
|
|
||||||
usedRuleRecs = new ArrayList<RuleRec>();
|
|
||||||
}
|
|
||||||
// if the last used rec is the same as the given rec, avoid
|
|
||||||
// putting the same rule.
|
|
||||||
int n = usedRuleRecs.size();
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
if (usedRuleRecs.get(i).equals(rec)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
usedRuleRecs.add(rec);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the last zone record for this time zone.
|
|
||||||
* @param the last zone record
|
|
||||||
*/
|
|
||||||
void setLastZoneRec(ZoneRec zrec) {
|
|
||||||
lastZoneRec = zrec;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the last zone record for this time zone.
|
|
||||||
*/
|
|
||||||
ZoneRec getLastZoneRec() {
|
|
||||||
return lastZoneRec;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the last rule records for this time zone. Those are used
|
|
||||||
* for generating SimpleTimeZone parameters.
|
|
||||||
* @param rules the last rule records
|
|
||||||
*/
|
|
||||||
void setLastRules(List<RuleRec> rules) {
|
|
||||||
int n = rules.size();
|
|
||||||
if (n > 0) {
|
|
||||||
lastRules = rules;
|
|
||||||
RuleRec rec = rules.get(0);
|
|
||||||
int offset = rec.getSave();
|
|
||||||
if (offset > 0) {
|
|
||||||
setLastDSTSaving(offset);
|
|
||||||
} else {
|
|
||||||
System.err.println("\t No DST starting rule in the last rules.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the last rule records for this time zone.
|
|
||||||
*/
|
|
||||||
List<RuleRec> getLastRules() {
|
|
||||||
return lastRules;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the last daylight saving amount.
|
|
||||||
* @param the daylight saving amount
|
|
||||||
*/
|
|
||||||
void setLastDSTSaving(int offset) {
|
|
||||||
lastSaving = offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the last daylight saving amount.
|
|
||||||
*/
|
|
||||||
int getLastDSTSaving() {
|
|
||||||
return lastSaving;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates the CRC32 value from the transition table and sets
|
|
||||||
* the value to <code>crc32</code>.
|
|
||||||
*/
|
|
||||||
void checksum() {
|
|
||||||
if (transitions == null) {
|
|
||||||
crc32 = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Checksum sum = new Checksum();
|
|
||||||
for (int i = 0; i < transitions.size(); i++) {
|
|
||||||
int offset = offsets.get(i);
|
|
||||||
// adjust back to make the transition in local time
|
|
||||||
sum.update(transitions.get(i) + offset);
|
|
||||||
sum.update(offset);
|
|
||||||
sum.update(dstOffsets.get(i));
|
|
||||||
}
|
|
||||||
crc32 = (int)sum.getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes unnecessary transitions for Java time zone support.
|
|
||||||
*/
|
|
||||||
void optimize() {
|
|
||||||
// if there is only one offset, delete all transitions. This
|
|
||||||
// could happen if only time zone abbreviations changed.
|
|
||||||
if (gmtOffsets.size() == 1) {
|
|
||||||
transitions = null;
|
|
||||||
usedRuleRecs = null;
|
|
||||||
setDSTType(NO_DST);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < (transitions.size() - 2); i++) { // don't remove the last one
|
|
||||||
if (transitions.get(i) == transitions.get(i+1)) {
|
|
||||||
transitions.remove(i);
|
|
||||||
offsets.remove(i);
|
|
||||||
dstOffsets.remove(i);
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < (transitions.size() - 2); i++) { // don't remove the last one
|
|
||||||
if (offsets.get(i) == offsets.get(i+1)
|
|
||||||
&& dstOffsets.get(i) == dstOffsets.get(i+1)) {
|
|
||||||
transitions.remove(i+1);
|
|
||||||
offsets.remove(i+1);
|
|
||||||
dstOffsets.remove(i+1);
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stores the specified offset value from GMT in the GMT offsets
|
|
||||||
* table and returns its index. The offset value includes the base
|
|
||||||
* GMT offset and any additional daylight saving if applicable. If
|
|
||||||
* the same value as the specified offset is already in the table,
|
|
||||||
* its index is returned.
|
|
||||||
* @param offset the offset value in milliseconds
|
|
||||||
* @return the index to the offset value in the GMT offsets table.
|
|
||||||
*/
|
|
||||||
int getOffsetIndex(int offset) {
|
|
||||||
return getOffsetIndex(offset, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stores the specified daylight saving value in the GMT offsets
|
|
||||||
* table and returns its index. If the same value as the specified
|
|
||||||
* offset is already in the table, its index is returned. If 0 is
|
|
||||||
* specified, it's not stored in the table and -1 is returned.
|
|
||||||
* @param offset the offset value in milliseconds
|
|
||||||
* @return the index to the specified offset value in the GMT
|
|
||||||
* offsets table, or -1 if 0 is specified.
|
|
||||||
*/
|
|
||||||
int getDstOffsetIndex(int offset) {
|
|
||||||
if (offset == 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return getOffsetIndex(offset, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getOffsetIndex(int offset, int index) {
|
|
||||||
if (gmtOffsets == null) {
|
|
||||||
gmtOffsets = new ArrayList<Integer>();
|
|
||||||
}
|
|
||||||
for (int i = index; i < gmtOffsets.size(); i++) {
|
|
||||||
if (offset == gmtOffsets.get(i)) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (gmtOffsets.size() < index) {
|
|
||||||
gmtOffsets.add(0);
|
|
||||||
}
|
|
||||||
gmtOffsets.add(offset);
|
|
||||||
return gmtOffsets.size() - 1;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,168 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2004, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.StringTokenizer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Zone holds information corresponding to a "Zone" part of a time
|
|
||||||
* zone definition file.
|
|
||||||
*
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
class Zone {
|
|
||||||
// zone name (e.g., "America/Los_Angeles")
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
// zone records
|
|
||||||
private List<ZoneRec> list;
|
|
||||||
|
|
||||||
// target zone names for this compilation
|
|
||||||
private static Set<String> targetZones;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a Zone with the specified zone name.
|
|
||||||
* @param name the zone name
|
|
||||||
*/
|
|
||||||
Zone(String name) {
|
|
||||||
this.name = name;
|
|
||||||
list = new ArrayList<ZoneRec>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reads time zone names to be generated, called "target zone
|
|
||||||
* name", from the specified text file and creats an internal hash
|
|
||||||
* table to keep those names. It's assumed that one text line
|
|
||||||
* contains a zone name or comments if it starts with
|
|
||||||
* '#'. Comments can't follow a zone name in a single line.
|
|
||||||
* @param fileName the text file name
|
|
||||||
*/
|
|
||||||
static void readZoneNames(String fileName) {
|
|
||||||
if (fileName == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
BufferedReader in = null;
|
|
||||||
try {
|
|
||||||
FileReader fr = new FileReader(fileName);
|
|
||||||
in = new BufferedReader(fr);
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
Main.panic("can't open file: " + fileName);
|
|
||||||
}
|
|
||||||
targetZones = new HashSet<String>();
|
|
||||||
String line;
|
|
||||||
|
|
||||||
try {
|
|
||||||
while ((line = in.readLine()) != null) {
|
|
||||||
line = line.trim();
|
|
||||||
if (line.length() == 0 || line.charAt(0) == '#') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!targetZones.add(line)) {
|
|
||||||
Main.warning("duplicated target zone name: " + line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
in.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
Main.panic("IO error: "+e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines whether the specified zone is one of the target zones.
|
|
||||||
* If no target zones are specified, this method always returns
|
|
||||||
* true for any zone name.
|
|
||||||
* @param zoneName the zone name
|
|
||||||
* @return true if the specified name is a target zone.
|
|
||||||
*/
|
|
||||||
static boolean isTargetZone(String zoneName) {
|
|
||||||
if (targetZones == null) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return targetZones.contains(zoneName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Forces to add "MET" to the target zone table. This is because
|
|
||||||
* there is a conflict between Java zone name "WET" and Olson zone
|
|
||||||
* name.
|
|
||||||
*/
|
|
||||||
static void addMET() {
|
|
||||||
if (targetZones != null) {
|
|
||||||
targetZones.add("MET");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the zone name
|
|
||||||
*/
|
|
||||||
String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the specified zone record to the zone record list.
|
|
||||||
*/
|
|
||||||
void add(ZoneRec rec) {
|
|
||||||
list.add(rec);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param index the index at which the zone record in the list is returned.
|
|
||||||
* @return the zone record specified by the index.
|
|
||||||
*/
|
|
||||||
ZoneRec get(int index) {
|
|
||||||
return list.get(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the size of the zone record list
|
|
||||||
*/
|
|
||||||
int size() {
|
|
||||||
return list.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolves the reference to a rule in each zone record.
|
|
||||||
* @param zi the Zoneinfo object with which the rule reference is
|
|
||||||
* resolved.
|
|
||||||
*/
|
|
||||||
void resolve(Zoneinfo zi) {
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
ZoneRec rec = list.get(i);
|
|
||||||
rec.resolve(zi);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,252 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2004, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.StringTokenizer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ZoneRec hold information of time zone corresponding to each text
|
|
||||||
* line of the "Zone" part.
|
|
||||||
*
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
class ZoneRec {
|
|
||||||
private int gmtOffset;
|
|
||||||
private String ruleName;
|
|
||||||
private int directSave;
|
|
||||||
private Rule ruleRef;
|
|
||||||
private String format;
|
|
||||||
private boolean hasUntil;
|
|
||||||
private int untilYear;
|
|
||||||
private Month untilMonth;
|
|
||||||
private RuleDay untilDay;
|
|
||||||
private Time untilTime;
|
|
||||||
private long untilInMillis;
|
|
||||||
private String line;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the "UNTIL" value in milliseconds
|
|
||||||
*/
|
|
||||||
Time getUntilTime() {
|
|
||||||
return untilTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the GMT offset value in milliseconds
|
|
||||||
*/
|
|
||||||
int getGmtOffset() {
|
|
||||||
return gmtOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the rule name to which this zone record refers
|
|
||||||
*/
|
|
||||||
String getRuleName() {
|
|
||||||
return ruleName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the amount of saving time directly defined in the
|
|
||||||
* "RULES/SAVE" field.
|
|
||||||
*/
|
|
||||||
int getDirectSave() {
|
|
||||||
return directSave;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if this zone record has a reference to a rule
|
|
||||||
*/
|
|
||||||
boolean hasRuleReference() {
|
|
||||||
return ruleRef != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the "FORMAT" field string of this zone record. This
|
|
||||||
* @return the "FORMAT" field
|
|
||||||
*/
|
|
||||||
String getFormat() {
|
|
||||||
return format;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the year in the "UNTIL" field
|
|
||||||
*/
|
|
||||||
int getUntilYear() {
|
|
||||||
return untilYear;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the "UNTIL" field value in milliseconds from Janurary
|
|
||||||
* 1, 1970 0:00 GMT.
|
|
||||||
* @param currentSave the amount of daylight saving in
|
|
||||||
* milliseconds that is used to adjust wall-clock time.
|
|
||||||
* @return the milliseconds value of the "UNTIL" field
|
|
||||||
*/
|
|
||||||
long getUntilTime(int currentSave) {
|
|
||||||
if (untilTime.isWall()) {
|
|
||||||
return untilInMillis - currentSave;
|
|
||||||
}
|
|
||||||
return untilInMillis;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the "UNTIL" time in milliseconds without adjusting GMT
|
|
||||||
* offsets or daylight saving.
|
|
||||||
* @return local "UNTIL" time in milliseconds
|
|
||||||
*/
|
|
||||||
long getLocalUntilTime() {
|
|
||||||
return Time.getLocalTime(untilYear,
|
|
||||||
untilMonth,
|
|
||||||
untilDay,
|
|
||||||
untilTime.getTime());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the "UNTIL" time in milliseconds with adjusting GMT offsets and daylight saving.
|
|
||||||
* @return the "UNTIL" time after the adjustment
|
|
||||||
*/
|
|
||||||
long getLocalUntilTime(int save, int gmtOffset) {
|
|
||||||
return Time.getLocalTime(untilYear,
|
|
||||||
untilMonth,
|
|
||||||
untilDay,
|
|
||||||
save,
|
|
||||||
gmtOffset,
|
|
||||||
untilTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the text line of this zone record
|
|
||||||
*/
|
|
||||||
String getLine() {
|
|
||||||
return line;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the specified text line to this zone record
|
|
||||||
*/
|
|
||||||
void setLine(String line) {
|
|
||||||
this.line = line;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if this zone record has the "UNTIL" field
|
|
||||||
*/
|
|
||||||
boolean hasUntil() {
|
|
||||||
return this.hasUntil;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adjusts the "UNTIL" time to GMT offset if this zone record has
|
|
||||||
* it. <code>untilTime</code> is not adjusted to daylight saving
|
|
||||||
* in this method.
|
|
||||||
*/
|
|
||||||
void adjustTime() {
|
|
||||||
if (!hasUntil()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (untilTime.isSTD() || untilTime.isWall()) {
|
|
||||||
// adjust to gmt offset only here. adjust to real
|
|
||||||
// wall-clock time when tracking rules
|
|
||||||
untilInMillis -= gmtOffset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the reference to the Rule object
|
|
||||||
*/
|
|
||||||
Rule getRuleRef() {
|
|
||||||
return ruleRef;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolves the reference to a Rule and adjusts its "UNTIL" time
|
|
||||||
* to GMT offset.
|
|
||||||
*/
|
|
||||||
void resolve(Zoneinfo zi) {
|
|
||||||
if (ruleName != null && (!"-".equals(ruleName))) {
|
|
||||||
ruleRef = zi.getRule(ruleName);
|
|
||||||
}
|
|
||||||
adjustTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses a Zone text line that is described by a StringTokenizer.
|
|
||||||
* @param tokens represents tokens of a Zone text line
|
|
||||||
* @return the zone record produced by parsing the text
|
|
||||||
*/
|
|
||||||
static ZoneRec parse(StringTokenizer tokens) {
|
|
||||||
ZoneRec rec = new ZoneRec();
|
|
||||||
try {
|
|
||||||
rec.gmtOffset = (int) Time.parse(tokens.nextToken()).getTime();
|
|
||||||
String token = tokens.nextToken();
|
|
||||||
char c = token.charAt(0);
|
|
||||||
if (c >= '0' && c <= '9') {
|
|
||||||
rec.directSave = (int) Time.parse(token).getTime();
|
|
||||||
} else {
|
|
||||||
rec.ruleName = token;
|
|
||||||
}
|
|
||||||
rec.format = tokens.nextToken();
|
|
||||||
if (tokens.hasMoreTokens()) {
|
|
||||||
rec.hasUntil = true;
|
|
||||||
rec.untilYear = Integer.parseInt(tokens.nextToken());
|
|
||||||
if (tokens.hasMoreTokens()) {
|
|
||||||
rec.untilMonth = Month.parse(tokens.nextToken());
|
|
||||||
} else {
|
|
||||||
rec.untilMonth = Month.JANUARY;
|
|
||||||
}
|
|
||||||
if (tokens.hasMoreTokens()) {
|
|
||||||
rec.untilDay = RuleDay.parse(tokens.nextToken());
|
|
||||||
} else {
|
|
||||||
rec.untilDay = new RuleDay(1);
|
|
||||||
}
|
|
||||||
if (tokens.hasMoreTokens()) {
|
|
||||||
rec.untilTime = Time.parse(tokens.nextToken());
|
|
||||||
} else {
|
|
||||||
rec.untilTime = Time.parse("0:00");
|
|
||||||
}
|
|
||||||
rec.untilInMillis = rec.getLocalUntilTime();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
// TODO: error reporting
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return rec;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void panic(String msg) {
|
|
||||||
Main.panic(msg);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,569 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2000, 2011, 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
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.StringTokenizer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Zoneinfo provides javazic compiler front-end functionality.
|
|
||||||
* @since 1.4
|
|
||||||
*/
|
|
||||||
class Zoneinfo {
|
|
||||||
|
|
||||||
private static final int minYear = 1900;
|
|
||||||
private static final int maxYear = 2037;
|
|
||||||
private static final long minTime = Time.getLocalTime(minYear, Month.JANUARY, 1, 0);
|
|
||||||
private static int startYear = minYear;
|
|
||||||
private static int endYear = maxYear;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* True if javazic should generate a list of SimpleTimeZone
|
|
||||||
* instances for the SimpleTimeZone-based time zone support.
|
|
||||||
*/
|
|
||||||
static boolean isYearForTimeZoneDataSpecified = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Zone name to Zone mappings
|
|
||||||
*/
|
|
||||||
private Map<String,Zone> zones;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rule name to Rule mappings
|
|
||||||
*/
|
|
||||||
private Map<String,Rule> rules;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Alias name to real name mappings
|
|
||||||
*/
|
|
||||||
private Map<String,String> aliases;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constracts a Zoneinfo.
|
|
||||||
*/
|
|
||||||
Zoneinfo() {
|
|
||||||
zones = new HashMap<String,Zone>();
|
|
||||||
rules = new HashMap<String,Rule>();
|
|
||||||
aliases = new HashMap<String,String>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the given zone to the list of Zones.
|
|
||||||
* @param zone Zone to be added to the list.
|
|
||||||
*/
|
|
||||||
void add(Zone zone) {
|
|
||||||
String name = zone.getName();
|
|
||||||
zones.put(name, zone);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds the given rule to the list of Rules.
|
|
||||||
* @param rule Rule to be added to the list.
|
|
||||||
*/
|
|
||||||
void add(Rule rule) {
|
|
||||||
String name = rule.getName();
|
|
||||||
rules.put(name, rule);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Puts the specifid name pair to the alias table.
|
|
||||||
* @param name1 an alias time zone name
|
|
||||||
* @param name2 the real time zone of the alias name
|
|
||||||
*/
|
|
||||||
void putAlias(String name1, String name2) {
|
|
||||||
aliases.put(name1, name2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the given year for SimpleTimeZone list output.
|
|
||||||
* This method is called when the -S option is specified.
|
|
||||||
* @param year the year for which SimpleTimeZone list should be generated
|
|
||||||
*/
|
|
||||||
static void setYear(int year) {
|
|
||||||
setStartYear(year);
|
|
||||||
setEndYear(year);
|
|
||||||
isYearForTimeZoneDataSpecified = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the start year.
|
|
||||||
* @param year the start year value
|
|
||||||
* @throws IllegalArgumentException if the specified year value is
|
|
||||||
* smaller than the minimum year or greater than the end year.
|
|
||||||
*/
|
|
||||||
static void setStartYear(int year) {
|
|
||||||
if (year < minYear || year > endYear) {
|
|
||||||
throw new IllegalArgumentException("invalid start year specified: " + year);
|
|
||||||
}
|
|
||||||
startYear = year;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the start year value
|
|
||||||
*/
|
|
||||||
static int getStartYear() {
|
|
||||||
return startYear;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the end year.
|
|
||||||
* @param year the end year value
|
|
||||||
* @throws IllegalArgumentException if the specified year value is
|
|
||||||
* smaller than the start year or greater than the maximum year.
|
|
||||||
*/
|
|
||||||
static void setEndYear(int year) {
|
|
||||||
if (year < startYear || year > maxYear) {
|
|
||||||
throw new IllegalArgumentException();
|
|
||||||
}
|
|
||||||
endYear = year;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the end year value
|
|
||||||
*/
|
|
||||||
static int getEndYear() {
|
|
||||||
return endYear;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the minimum year value
|
|
||||||
*/
|
|
||||||
static int getMinYear() {
|
|
||||||
return minYear;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the maximum year value
|
|
||||||
*/
|
|
||||||
static int getMaxYear() {
|
|
||||||
return maxYear;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the alias table
|
|
||||||
*/
|
|
||||||
Map<String,String> getAliases() {
|
|
||||||
return aliases;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the Zone list
|
|
||||||
*/
|
|
||||||
Map<String,Zone> getZones() {
|
|
||||||
return zones;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return a Zone specified by name.
|
|
||||||
* @param name a zone name
|
|
||||||
*/
|
|
||||||
Zone getZone(String name) {
|
|
||||||
return zones.get(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return a Rule specified by name.
|
|
||||||
* @param name a rule name
|
|
||||||
*/
|
|
||||||
Rule getRule(String name) {
|
|
||||||
return rules.get(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String line;
|
|
||||||
|
|
||||||
private static int lineNum;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses the specified time zone data file and creates a Zoneinfo
|
|
||||||
* that has all Rules, Zones and Links (aliases) information.
|
|
||||||
* @param fname the time zone data file name
|
|
||||||
* @return a Zoneinfo object
|
|
||||||
*/
|
|
||||||
static Zoneinfo parse(String fname) {
|
|
||||||
BufferedReader in = null;
|
|
||||||
try {
|
|
||||||
FileReader fr = new FileReader(fname);
|
|
||||||
in = new BufferedReader(fr);
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
panic("can't open file: "+fname);
|
|
||||||
}
|
|
||||||
Zoneinfo zi = new Zoneinfo();
|
|
||||||
boolean continued = false;
|
|
||||||
Zone zone = null;
|
|
||||||
String l;
|
|
||||||
lineNum = 0;
|
|
||||||
|
|
||||||
try {
|
|
||||||
while ((line = in.readLine()) != null) {
|
|
||||||
lineNum++;
|
|
||||||
// skip blank and comment lines
|
|
||||||
if (line.length() == 0 || line.charAt(0) == '#') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// trim trailing comments
|
|
||||||
int rindex = line.lastIndexOf('#');
|
|
||||||
if (rindex != -1) {
|
|
||||||
// take the data part of the line
|
|
||||||
l = line.substring(0, rindex);
|
|
||||||
} else {
|
|
||||||
l = line;
|
|
||||||
}
|
|
||||||
|
|
||||||
StringTokenizer tokens = new StringTokenizer(l);
|
|
||||||
if (!tokens.hasMoreTokens()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
String token = tokens.nextToken();
|
|
||||||
|
|
||||||
if (continued || "Zone".equals(token)) {
|
|
||||||
if (zone == null) {
|
|
||||||
if (!tokens.hasMoreTokens()) {
|
|
||||||
panic("syntax error: zone no more token");
|
|
||||||
}
|
|
||||||
token = tokens.nextToken();
|
|
||||||
// if the zone name is in "GMT+hh" or "GMT-hh"
|
|
||||||
// format, ignore it due to spec conflict.
|
|
||||||
if (token.startsWith("GMT+") || token.startsWith("GMT-")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
zone = new Zone(token);
|
|
||||||
} else {
|
|
||||||
// no way to push the current token back...
|
|
||||||
tokens = new StringTokenizer(l);
|
|
||||||
}
|
|
||||||
|
|
||||||
ZoneRec zrec = ZoneRec.parse(tokens);
|
|
||||||
zrec.setLine(line);
|
|
||||||
zone.add(zrec);
|
|
||||||
if ((continued = zrec.hasUntil()) == false) {
|
|
||||||
if (Zone.isTargetZone(zone.getName())) {
|
|
||||||
// zone.resolve(zi);
|
|
||||||
zi.add(zone);
|
|
||||||
}
|
|
||||||
zone = null;
|
|
||||||
}
|
|
||||||
} else if ("Rule".equals(token)) {
|
|
||||||
if (!tokens.hasMoreTokens()) {
|
|
||||||
panic("syntax error: rule no more token");
|
|
||||||
}
|
|
||||||
token = tokens.nextToken();
|
|
||||||
Rule rule = zi.getRule(token);
|
|
||||||
if (rule == null) {
|
|
||||||
rule = new Rule(token);
|
|
||||||
zi.add(rule);
|
|
||||||
}
|
|
||||||
RuleRec rrec = RuleRec.parse(tokens);
|
|
||||||
rrec.setLine(line);
|
|
||||||
rule.add(rrec);
|
|
||||||
} else if ("Link".equals(token)) {
|
|
||||||
// Link <newname> <oldname>
|
|
||||||
try {
|
|
||||||
String name1 = tokens.nextToken();
|
|
||||||
String name2 = tokens.nextToken();
|
|
||||||
|
|
||||||
// if the zone name is in "GMT+hh" or "GMT-hh"
|
|
||||||
// format, ignore it due to spec conflict with
|
|
||||||
// custom time zones. Also, ignore "ROC" for
|
|
||||||
// PC-ness.
|
|
||||||
if (name2.startsWith("GMT+") || name2.startsWith("GMT-")
|
|
||||||
|| "ROC".equals(name2)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
zi.putAlias(name2, name1);
|
|
||||||
} catch (Exception e) {
|
|
||||||
panic("syntax error: no more token for Link");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
in.close();
|
|
||||||
} catch (IOException ex) {
|
|
||||||
panic("IO error: " + ex.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
return zi;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interprets a zone and constructs a Timezone object that
|
|
||||||
* contains enough information on GMT offsets and DST schedules to
|
|
||||||
* generate a zone info database.
|
|
||||||
*
|
|
||||||
* @param zoneName the zone name for which a Timezone object is
|
|
||||||
* constructed.
|
|
||||||
*
|
|
||||||
* @return a Timezone object that contains all GMT offsets and DST
|
|
||||||
* rules information.
|
|
||||||
*/
|
|
||||||
Timezone phase2(String zoneName) {
|
|
||||||
Timezone tz = new Timezone(zoneName);
|
|
||||||
Zone zone = getZone(zoneName);
|
|
||||||
zone.resolve(this);
|
|
||||||
|
|
||||||
// TODO: merge phase2's for the regular and SimpleTimeZone ones.
|
|
||||||
if (isYearForTimeZoneDataSpecified) {
|
|
||||||
ZoneRec zrec = zone.get(zone.size()-1);
|
|
||||||
tz.setLastZoneRec(zrec);
|
|
||||||
tz.setRawOffset(zrec.getGmtOffset());
|
|
||||||
if (zrec.hasRuleReference()) {
|
|
||||||
/*
|
|
||||||
* This part assumes that the specified year is covered by
|
|
||||||
* the rules referred to by the last zone record.
|
|
||||||
*/
|
|
||||||
List<RuleRec> rrecs = zrec.getRuleRef().getRules(startYear);
|
|
||||||
|
|
||||||
if (rrecs.size() == 2) {
|
|
||||||
// make sure that one is a start rule and the other is
|
|
||||||
// an end rule.
|
|
||||||
RuleRec r0 = rrecs.get(0);
|
|
||||||
RuleRec r1 = rrecs.get(1);
|
|
||||||
if (r0.getSave() == 0 && r1.getSave() > 0) {
|
|
||||||
rrecs.set(0, r1);
|
|
||||||
rrecs.set(1, r0);
|
|
||||||
} else if (!(r0.getSave() > 0 && r1.getSave() == 0)) {
|
|
||||||
rrecs = null;
|
|
||||||
Main.error(zoneName + ": rules for " + startYear + " not found.");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
rrecs = null;
|
|
||||||
}
|
|
||||||
if (rrecs != null) {
|
|
||||||
tz.setLastRules(rrecs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return tz;
|
|
||||||
}
|
|
||||||
|
|
||||||
int gmtOffset;
|
|
||||||
int year = minYear;
|
|
||||||
int fromYear = year;
|
|
||||||
long fromTime = Time.getLocalTime(startYear,
|
|
||||||
Month.JANUARY,
|
|
||||||
1, 0);
|
|
||||||
|
|
||||||
// take the index 0 for the GMT offset of the last zone record
|
|
||||||
ZoneRec zrec = zone.get(zone.size()-1);
|
|
||||||
tz.getOffsetIndex(zrec.getGmtOffset());
|
|
||||||
|
|
||||||
int currentSave = 0;
|
|
||||||
boolean usedZone;
|
|
||||||
for (int zindex = 0; zindex < zone.size(); zindex++) {
|
|
||||||
zrec = zone.get(zindex);
|
|
||||||
usedZone = false;
|
|
||||||
gmtOffset = zrec.getGmtOffset();
|
|
||||||
int stdOffset = zrec.getDirectSave();
|
|
||||||
|
|
||||||
// If this is the last zone record, take the last rule info.
|
|
||||||
if (!zrec.hasUntil()) {
|
|
||||||
tz.setRawOffset(gmtOffset, fromTime);
|
|
||||||
if (zrec.hasRuleReference()) {
|
|
||||||
tz.setLastRules(zrec.getRuleRef().getLastRules());
|
|
||||||
} else if (stdOffset != 0) {
|
|
||||||
// in case the last rule is all year round DST-only
|
|
||||||
// (Asia/Amman once announced this rule.)
|
|
||||||
tz.setLastDSTSaving(stdOffset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!zrec.hasRuleReference()) {
|
|
||||||
if (!zrec.hasUntil() || zrec.getUntilTime(stdOffset) >= fromTime) {
|
|
||||||
tz.addTransition(fromTime,
|
|
||||||
tz.getOffsetIndex(gmtOffset+stdOffset),
|
|
||||||
tz.getDstOffsetIndex(stdOffset));
|
|
||||||
usedZone = true;
|
|
||||||
}
|
|
||||||
currentSave = stdOffset;
|
|
||||||
// optimization in case the last rule is fixed.
|
|
||||||
if (!zrec.hasUntil()) {
|
|
||||||
if (tz.getNTransitions() > 0) {
|
|
||||||
if (stdOffset == 0) {
|
|
||||||
tz.setDSTType(Timezone.X_DST);
|
|
||||||
} else {
|
|
||||||
tz.setDSTType(Timezone.LAST_DST);
|
|
||||||
}
|
|
||||||
long time = Time.getLocalTime(maxYear,
|
|
||||||
Month.JANUARY, 1, 0);
|
|
||||||
time -= zrec.getGmtOffset();
|
|
||||||
tz.addTransition(time,
|
|
||||||
tz.getOffsetIndex(gmtOffset+stdOffset),
|
|
||||||
tz.getDstOffsetIndex(stdOffset));
|
|
||||||
tz.addUsedRec(zrec);
|
|
||||||
} else {
|
|
||||||
tz.setDSTType(Timezone.NO_DST);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Rule rule = zrec.getRuleRef();
|
|
||||||
boolean fromTimeUsed = false;
|
|
||||||
currentSave = 0;
|
|
||||||
year_loop:
|
|
||||||
for (year = getMinYear(); year <= endYear; year++) {
|
|
||||||
if (zrec.hasUntil() && year > zrec.getUntilYear()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
List<RuleRec> rules = rule.getRules(year);
|
|
||||||
if (rules.size() > 0) {
|
|
||||||
for (int i = 0; i < rules.size(); i++) {
|
|
||||||
RuleRec rrec = rules.get(i);
|
|
||||||
long transition = rrec.getTransitionTime(year,
|
|
||||||
gmtOffset,
|
|
||||||
currentSave);
|
|
||||||
if (zrec.hasUntil()) {
|
|
||||||
if (transition >= zrec.getUntilTime(currentSave)) {
|
|
||||||
break year_loop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fromTimeUsed == false) {
|
|
||||||
if (fromTime <= transition) {
|
|
||||||
fromTimeUsed = true;
|
|
||||||
|
|
||||||
if (fromTime != minTime) {
|
|
||||||
int prevsave;
|
|
||||||
|
|
||||||
ZoneRec prevzrec = zone.get(zindex - 1);
|
|
||||||
|
|
||||||
// See if until time in the previous
|
|
||||||
// ZoneRec is the same thing as the
|
|
||||||
// local time in the next rule.
|
|
||||||
// (examples are Asia/Ashkhabad in 1991,
|
|
||||||
// Europe/Riga in 1989)
|
|
||||||
|
|
||||||
if (i > 0) {
|
|
||||||
prevsave = rules.get(i-1).getSave();
|
|
||||||
} else {
|
|
||||||
List<RuleRec> prevrules = rule.getRules(year-1);
|
|
||||||
|
|
||||||
if (prevrules.size() > 0) {
|
|
||||||
prevsave = prevrules.get(prevrules.size()-1).getSave();
|
|
||||||
} else {
|
|
||||||
prevsave = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rrec.isSameTransition(prevzrec, prevsave, gmtOffset)) {
|
|
||||||
currentSave = rrec.getSave();
|
|
||||||
tz.addTransition(fromTime,
|
|
||||||
tz.getOffsetIndex(gmtOffset+currentSave),
|
|
||||||
tz.getDstOffsetIndex(currentSave));
|
|
||||||
tz.addUsedRec(rrec);
|
|
||||||
usedZone = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!prevzrec.hasRuleReference()
|
|
||||||
|| rule != prevzrec.getRuleRef()
|
|
||||||
|| (rule == prevzrec.getRuleRef()
|
|
||||||
&& gmtOffset != prevzrec.getGmtOffset())) {
|
|
||||||
int save = (fromTime == transition) ? rrec.getSave() : currentSave;
|
|
||||||
tz.addTransition(fromTime,
|
|
||||||
tz.getOffsetIndex(gmtOffset+save),
|
|
||||||
tz.getDstOffsetIndex(save));
|
|
||||||
tz.addUsedRec(rrec);
|
|
||||||
usedZone = true;
|
|
||||||
}
|
|
||||||
} else { // fromTime == minTime
|
|
||||||
int save = rrec.getSave();
|
|
||||||
tz.addTransition(minTime,
|
|
||||||
tz.getOffsetIndex(gmtOffset),
|
|
||||||
tz.getDstOffsetIndex(0));
|
|
||||||
|
|
||||||
tz.addTransition(transition,
|
|
||||||
tz.getOffsetIndex(gmtOffset+save),
|
|
||||||
tz.getDstOffsetIndex(save));
|
|
||||||
|
|
||||||
tz.addUsedRec(rrec);
|
|
||||||
usedZone = true;
|
|
||||||
}
|
|
||||||
} else if (year == fromYear && i == rules.size()-1) {
|
|
||||||
int save = rrec.getSave();
|
|
||||||
tz.addTransition(fromTime,
|
|
||||||
tz.getOffsetIndex(gmtOffset+save),
|
|
||||||
tz.getDstOffsetIndex(save));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
currentSave = rrec.getSave();
|
|
||||||
if (fromTime < transition) {
|
|
||||||
tz.addTransition(transition,
|
|
||||||
tz.getOffsetIndex(gmtOffset+currentSave),
|
|
||||||
tz.getDstOffsetIndex(currentSave));
|
|
||||||
tz.addUsedRec(rrec);
|
|
||||||
usedZone = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (year == fromYear) {
|
|
||||||
tz.addTransition(fromTime,
|
|
||||||
tz.getOffsetIndex(gmtOffset+currentSave),
|
|
||||||
tz.getDstOffsetIndex(currentSave));
|
|
||||||
fromTimeUsed = true;
|
|
||||||
}
|
|
||||||
if (year == endYear && !zrec.hasUntil()) {
|
|
||||||
if (tz.getNTransitions() > 0) {
|
|
||||||
// Assume that this Zone stopped DST
|
|
||||||
tz.setDSTType(Timezone.X_DST);
|
|
||||||
long time = Time.getLocalTime(maxYear, Month.JANUARY,
|
|
||||||
1, 0);
|
|
||||||
time -= zrec.getGmtOffset();
|
|
||||||
tz.addTransition(time,
|
|
||||||
tz.getOffsetIndex(gmtOffset),
|
|
||||||
tz.getDstOffsetIndex(0));
|
|
||||||
usedZone = true;
|
|
||||||
} else {
|
|
||||||
tz.setDSTType(Timezone.NO_DST);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (usedZone) {
|
|
||||||
tz.addUsedRec(zrec);
|
|
||||||
}
|
|
||||||
if (zrec.hasUntil() && zrec.getUntilTime(currentSave) > fromTime) {
|
|
||||||
fromTime = zrec.getUntilTime(currentSave);
|
|
||||||
fromYear = zrec.getUntilYear();
|
|
||||||
year = zrec.getUntilYear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tz.getDSTType() == Timezone.UNDEF_DST) {
|
|
||||||
tz.setDSTType(Timezone.DST);
|
|
||||||
}
|
|
||||||
tz.optimize();
|
|
||||||
tz.checksum();
|
|
||||||
return tz;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void panic(String msg) {
|
|
||||||
Main.panic(msg);
|
|
||||||
}
|
|
||||||
}
|
|
@ -311,6 +311,9 @@ $(eval $(call SetupLauncher,jps,\
|
|||||||
$(eval $(call SetupLauncher,jrunscript,\
|
$(eval $(call SetupLauncher,jrunscript,\
|
||||||
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.script.shell.Main"$(COMMA) }'))
|
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "com.sun.tools.script.shell.Main"$(COMMA) }'))
|
||||||
|
|
||||||
|
$(eval $(call SetupLauncher,jjs,\
|
||||||
|
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "jdk.nashorn.tools.Shell"$(COMMA) }'))
|
||||||
|
|
||||||
$(eval $(call SetupLauncher,jsadebugd,\
|
$(eval $(call SetupLauncher,jsadebugd,\
|
||||||
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.jvm.hotspot.jdi.SADebugServer"$(COMMA) }' \
|
-DJAVA_ARGS='{ "-J-ms8m"$(COMMA) "sun.jvm.hotspot.jdi.SADebugServer"$(COMMA) }' \
|
||||||
-DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }' \
|
-DAPP_CLASSPATH='{ "/lib/tools.jar"$(COMMA) "/lib/sa-jdi.jar"$(COMMA) "/classes" }' \
|
||||||
|
@ -1219,7 +1219,7 @@ ifdef OPENJDK
|
|||||||
OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\
|
OUTPUT_DIR:=$(INSTALL_LIBRARIES_HERE),\
|
||||||
SRC:=$(JDK_TOPDIR)/src/share/native/sun/java2d/cmm/lcms,\
|
SRC:=$(JDK_TOPDIR)/src/share/native/sun/java2d/cmm/lcms,\
|
||||||
LANG:=C,\
|
LANG:=C,\
|
||||||
OPTIMIZATION:=LOW, \
|
OPTIMIZATION:=HIGHEST, \
|
||||||
CFLAGS:=$(filter-out -xc99=%none,$(CFLAGS_JDKLIB)) \
|
CFLAGS:=$(filter-out -xc99=%none,$(CFLAGS_JDKLIB)) \
|
||||||
$(SHARED_LIBRARY_FLAGS) \
|
$(SHARED_LIBRARY_FLAGS) \
|
||||||
-I$(JDK_TOPDIR)/src/share/native/sun/java2d \
|
-I$(JDK_TOPDIR)/src/share/native/sun/java2d \
|
||||||
|
@ -213,28 +213,28 @@ RT_JAR_EXCLUDES += \
|
|||||||
org/relaxng/datatype \
|
org/relaxng/datatype \
|
||||||
sun/awt/HKSCS.class \
|
sun/awt/HKSCS.class \
|
||||||
sun/awt/motif/X11GB2312.class \
|
sun/awt/motif/X11GB2312.class \
|
||||||
sun/awt/motif/X11GB2312\$$$$Decoder.class \
|
sun/awt/motif/X11GB2312\$$Decoder.class \
|
||||||
sun/awt/motif/X11GB2312\$$$$Encoder.class \
|
sun/awt/motif/X11GB2312\$$Encoder.class \
|
||||||
sun/awt/motif/X11GBK.class \
|
sun/awt/motif/X11GBK.class \
|
||||||
sun/awt/motif/X11GBK\$$$$Encoder.class \
|
sun/awt/motif/X11GBK\$$Encoder.class \
|
||||||
sun/awt/motif/X11KSC5601.class \
|
sun/awt/motif/X11KSC5601.class \
|
||||||
sun/awt/motif/X11KSC5601\$$$$Decoder.class \
|
sun/awt/motif/X11KSC5601\$$Decoder.class \
|
||||||
sun/awt/motif/X11KSC5601\$$$$Encoder.class \
|
sun/awt/motif/X11KSC5601\$$Encoder.class \
|
||||||
sun/jvmstat \
|
sun/jvmstat \
|
||||||
sun/net/spi/nameservice/dns \
|
sun/net/spi/nameservice/dns \
|
||||||
sun/nio/cs/ext \
|
sun/nio/cs/ext \
|
||||||
sun/rmi/rmic \
|
sun/rmi/rmic \
|
||||||
sun/security/ec/ECDHKeyAgreement.class \
|
sun/security/ec/ECDHKeyAgreement.class \
|
||||||
sun/security/ec/ECDSASignature.class \
|
sun/security/ec/ECDSASignature.class \
|
||||||
sun/security/ec/ECDSASignature\$$$$Raw.class \
|
sun/security/ec/ECDSASignature\$$Raw.class \
|
||||||
sun/security/ec/ECDSASignature\$$$$SHA1.class \
|
sun/security/ec/ECDSASignature\$$SHA1.class \
|
||||||
sun/security/ec/ECDSASignature\$$$$SHA224.class \
|
sun/security/ec/ECDSASignature\$$SHA224.class \
|
||||||
sun/security/ec/ECDSASignature\$$$$SHA256.class \
|
sun/security/ec/ECDSASignature\$$SHA256.class \
|
||||||
sun/security/ec/ECDSASignature\$$$$SHA384.class \
|
sun/security/ec/ECDSASignature\$$SHA384.class \
|
||||||
sun/security/ec/ECDSASignature\$$$$SHA512.class \
|
sun/security/ec/ECDSASignature\$$SHA512.class \
|
||||||
sun/security/ec/ECKeyFactory.class \
|
sun/security/ec/ECKeyFactory.class \
|
||||||
sun/security/ec/ECKeyPairGenerator.class \
|
sun/security/ec/ECKeyPairGenerator.class \
|
||||||
sun/security/ec/SunEC\$$$$1.class \
|
sun/security/ec/SunEC\$$1.class \
|
||||||
sun/security/ec/SunEC.class \
|
sun/security/ec/SunEC.class \
|
||||||
sun/security/ec/SunECEntries.class \
|
sun/security/ec/SunECEntries.class \
|
||||||
sun/security/internal \
|
sun/security/internal \
|
||||||
@ -1119,6 +1119,14 @@ endif
|
|||||||
|
|
||||||
##########################################################################################
|
##########################################################################################
|
||||||
|
|
||||||
|
# Import nashorn.jar from nashorn dist dir.
|
||||||
|
$(IMAGES_OUTPUTDIR)/lib/ext/nashorn.jar: $(NASHORN_DIST)/nashorn.jar
|
||||||
|
$(install-file)
|
||||||
|
|
||||||
|
JARS += $(IMAGES_OUTPUTDIR)/lib/ext/nashorn.jar
|
||||||
|
|
||||||
|
##########################################################################################
|
||||||
|
|
||||||
-include $(CUSTOM_MAKE_DIR)/CreateJars.gmk
|
-include $(CUSTOM_MAKE_DIR)/CreateJars.gmk
|
||||||
|
|
||||||
##########################################################################################
|
##########################################################################################
|
||||||
|
@ -609,6 +609,7 @@ define create-info-file
|
|||||||
$(call info-file-item, "OS_NAME", "$(REQUIRED_OS_NAME)")
|
$(call info-file-item, "OS_NAME", "$(REQUIRED_OS_NAME)")
|
||||||
$(call info-file-item, "OS_VERSION", "$(REQUIRED_OS_VERSION)")
|
$(call info-file-item, "OS_VERSION", "$(REQUIRED_OS_VERSION)")
|
||||||
$(call info-file-item, "OS_ARCH", "$(OPENJDK_TARGET_CPU_LEGACY)")
|
$(call info-file-item, "OS_ARCH", "$(OPENJDK_TARGET_CPU_LEGACY)")
|
||||||
|
if [ -n "$(JDK_ARCH_ABI_PROP_NAME)" ]; then $(call info-file-item, "SUN_ARCH_ABI", "$(JDK_ARCH_ABI_PROP_NAME)"); fi
|
||||||
$(call info-file-item, "SOURCE", "$(ALL_SOURCE_TIPS)")
|
$(call info-file-item, "SOURCE", "$(ALL_SOURCE_TIPS)")
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
@ -27,13 +27,12 @@
|
|||||||
|
|
||||||
SUNWprivate_1.1 {
|
SUNWprivate_1.1 {
|
||||||
global:
|
global:
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_loadProfile;
|
Java_sun_java2d_cmm_lcms_LCMS_loadProfileNative;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_freeProfile;
|
Java_sun_java2d_cmm_lcms_LCMS_freeProfileNative;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_getProfileSize;
|
Java_sun_java2d_cmm_lcms_LCMS_getProfileSize;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_getProfileData;
|
Java_sun_java2d_cmm_lcms_LCMS_getProfileData;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_getTagSize;
|
Java_sun_java2d_cmm_lcms_LCMS_getTagNative;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_getTagData;
|
Java_sun_java2d_cmm_lcms_LCMS_setTagDataNative;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_setTagData;
|
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_colorConvert;
|
Java_sun_java2d_cmm_lcms_LCMS_colorConvert;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_getProfileID;
|
Java_sun_java2d_cmm_lcms_LCMS_getProfileID;
|
||||||
Java_sun_java2d_cmm_lcms_LCMS_initLCMS;
|
Java_sun_java2d_cmm_lcms_LCMS_initLCMS;
|
||||||
|
@ -349,6 +349,7 @@ PROFILE_3_RTJAR_INCLUDE_PACKAGES := \
|
|||||||
com/sun/rowset/providers \
|
com/sun/rowset/providers \
|
||||||
com/sun/script/javascript \
|
com/sun/script/javascript \
|
||||||
com/sun/script/util \
|
com/sun/script/util \
|
||||||
|
com/sun/security/auth \
|
||||||
com/sun/security/auth/callback \
|
com/sun/security/auth/callback \
|
||||||
com/sun/security/auth/login \
|
com/sun/security/auth/login \
|
||||||
com/sun/security/auth/module \
|
com/sun/security/auth/module \
|
||||||
@ -448,8 +449,7 @@ PROFILE_3_RTJAR_INCLUDE_PACKAGES := \
|
|||||||
sun/tracing \
|
sun/tracing \
|
||||||
sun/tracing/dtrace
|
sun/tracing/dtrace
|
||||||
|
|
||||||
PROFILE_3_RTJAR_INCLUDE_TYPES := \
|
PROFILE_3_RTJAR_INCLUDE_TYPES :=
|
||||||
com/sun/security/auth/*.class
|
|
||||||
|
|
||||||
PROFILE_3_RTJAR_EXCLUDE_TYPES := \
|
PROFILE_3_RTJAR_EXCLUDE_TYPES := \
|
||||||
javax/management/remote/rmi/_RMIConnectionImpl_Tie.class \
|
javax/management/remote/rmi/_RMIConnectionImpl_Tie.class \
|
||||||
@ -457,10 +457,10 @@ PROFILE_3_RTJAR_EXCLUDE_TYPES := \
|
|||||||
javax/management/remote/rmi/_RMIServerImpl_Tie.class \
|
javax/management/remote/rmi/_RMIServerImpl_Tie.class \
|
||||||
javax/management/remote/rmi/_RMIServer_Stub.class \
|
javax/management/remote/rmi/_RMIServer_Stub.class \
|
||||||
com/sun/security/auth/callback/DialogCallbackHandler.class \
|
com/sun/security/auth/callback/DialogCallbackHandler.class \
|
||||||
com/sun/security/auth/callback/DialogCallbackHandler\$$$$1.class \
|
com/sun/security/auth/callback/DialogCallbackHandler\$$1.class \
|
||||||
com/sun/security/auth/callback/DialogCallbackHandler\$$$$2.class \
|
com/sun/security/auth/callback/DialogCallbackHandler\$$2.class \
|
||||||
com/sun/security/auth/callback/DialogCallbackHandler\$$$$Action.class \
|
com/sun/security/auth/callback/DialogCallbackHandler\$$Action.class \
|
||||||
com/sun/security/auth/callback/DialogCallbackHandler\$$$$ConfirmationInfo.class
|
com/sun/security/auth/callback/DialogCallbackHandler\$$ConfirmationInfo.class
|
||||||
|
|
||||||
PROFILE_3_INCLUDE_METAINF_SERVICES := \
|
PROFILE_3_INCLUDE_METAINF_SERVICES := \
|
||||||
META-INF/services/javax.script.ScriptEngineFactory
|
META-INF/services/javax.script.ScriptEngineFactory
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -34,7 +34,6 @@ import javax.swing.border.Border;
|
|||||||
import javax.swing.event.*;
|
import javax.swing.event.*;
|
||||||
import javax.swing.plaf.*;
|
import javax.swing.plaf.*;
|
||||||
import javax.swing.plaf.basic.*;
|
import javax.swing.plaf.basic.*;
|
||||||
import com.apple.laf.ClientPropertyApplicator;
|
|
||||||
import com.apple.laf.ClientPropertyApplicator.Property;
|
import com.apple.laf.ClientPropertyApplicator.Property;
|
||||||
import apple.laf.JRSUIConstants.Size;
|
import apple.laf.JRSUIConstants.Size;
|
||||||
|
|
||||||
@ -142,35 +141,46 @@ public class AquaComboBoxUI extends BasicComboBoxUI implements Sizeable {
|
|||||||
return new AquaComboBoxEditor();
|
return new AquaComboBoxEditor();
|
||||||
}
|
}
|
||||||
|
|
||||||
class AquaComboBoxEditor extends BasicComboBoxEditor implements UIResource, DocumentListener {
|
final class AquaComboBoxEditor extends BasicComboBoxEditor
|
||||||
protected AquaComboBoxEditor() {
|
implements UIResource, DocumentListener {
|
||||||
|
|
||||||
|
AquaComboBoxEditor() {
|
||||||
super();
|
super();
|
||||||
editor = new AquaCustomComboTextField();
|
editor = new AquaCustomComboTextField();
|
||||||
editor.addFocusListener(this);
|
editor.addFocusListener(this);
|
||||||
editor.getDocument().addDocumentListener(this);
|
editor.getDocument().addDocumentListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void focusGained(final FocusEvent e) {
|
public void focusGained(final FocusEvent e) {
|
||||||
arrowButton.repaint();
|
if (arrowButton != null) {
|
||||||
|
arrowButton.repaint();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void focusLost(final FocusEvent e) {
|
public void focusLost(final FocusEvent e) {
|
||||||
arrowButton.repaint();
|
if (arrowButton != null) {
|
||||||
|
arrowButton.repaint();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void changedUpdate(final DocumentEvent e) {
|
public void changedUpdate(final DocumentEvent e) {
|
||||||
editorTextChanged();
|
editorTextChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void insertUpdate(final DocumentEvent e) {
|
public void insertUpdate(final DocumentEvent e) {
|
||||||
editorTextChanged();
|
editorTextChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void removeUpdate(final DocumentEvent e) {
|
public void removeUpdate(final DocumentEvent e) {
|
||||||
editorTextChanged();
|
editorTextChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void editorTextChanged() {
|
private void editorTextChanged() {
|
||||||
if (!popup.isVisible()) return;
|
if (!popup.isVisible()) return;
|
||||||
|
|
||||||
final Object text = editor.getText();
|
final Object text = editor.getText();
|
||||||
|
@ -53,7 +53,7 @@ public abstract class CGraphicsConfig extends GraphicsConfiguration
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Rectangle getBounds() {
|
public Rectangle getBounds() {
|
||||||
final Rectangle2D nativeBounds = nativeGetBounds(device.getCoreGraphicsScreen());
|
final Rectangle2D nativeBounds = nativeGetBounds(device.getCGDisplayID());
|
||||||
return nativeBounds.getBounds(); // does integer rounding
|
return nativeBounds.getBounds(); // does integer rounding
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -25,11 +25,12 @@
|
|||||||
|
|
||||||
package sun.awt;
|
package sun.awt;
|
||||||
|
|
||||||
import java.awt.GraphicsConfiguration;
|
|
||||||
import java.awt.GraphicsDevice;
|
|
||||||
import java.awt.Window;
|
|
||||||
import java.awt.AWTPermission;
|
import java.awt.AWTPermission;
|
||||||
import java.awt.DisplayMode;
|
import java.awt.DisplayMode;
|
||||||
|
import java.awt.GraphicsConfiguration;
|
||||||
|
import java.awt.GraphicsDevice;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import java.awt.Window;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import sun.java2d.opengl.CGLGraphicsConfig;
|
import sun.java2d.opengl.CGLGraphicsConfig;
|
||||||
@ -58,9 +59,12 @@ public final class CGraphicsDevice extends GraphicsDevice {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Returns CGDirectDisplayID, which is the same id as @"NSScreenNumber" in
|
||||||
|
* NSScreen.
|
||||||
|
*
|
||||||
* @return CoreGraphics display id.
|
* @return CoreGraphics display id.
|
||||||
*/
|
*/
|
||||||
public int getCoreGraphicsScreen() {
|
public int getCGDisplayID() {
|
||||||
return displayID;
|
return displayID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,8 +111,9 @@ public final class CGraphicsDevice extends GraphicsDevice {
|
|||||||
return nativeGetYResolution(displayID);
|
return nativeGetYResolution(displayID);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static native double nativeGetXResolution(int displayID);
|
public Insets getScreenInsets() {
|
||||||
private static native double nativeGetYResolution(int displayID);
|
return nativeGetScreenInsets(displayID);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enters full-screen mode, or returns to windowed mode.
|
* Enters full-screen mode, or returns to windowed mode.
|
||||||
@ -214,9 +219,15 @@ public final class CGraphicsDevice extends GraphicsDevice {
|
|||||||
return nativeGetDisplayModes(displayID);
|
return nativeGetDisplayModes(displayID);
|
||||||
}
|
}
|
||||||
|
|
||||||
private native void nativeSetDisplayMode(int displayID, int w, int h, int bpp, int refrate);
|
private static native void nativeSetDisplayMode(int displayID, int w, int h, int bpp, int refrate);
|
||||||
|
|
||||||
private native DisplayMode nativeGetDisplayMode(int displayID);
|
private static native DisplayMode nativeGetDisplayMode(int displayID);
|
||||||
|
|
||||||
private native DisplayMode[] nativeGetDisplayModes(int displayID);
|
private static native DisplayMode[] nativeGetDisplayModes(int displayID);
|
||||||
|
|
||||||
|
private static native double nativeGetXResolution(int displayID);
|
||||||
|
|
||||||
|
private static native double nativeGetYResolution(int displayID);
|
||||||
|
|
||||||
|
private static native Insets nativeGetScreenInsets(int displayID);
|
||||||
}
|
}
|
||||||
|
@ -500,7 +500,10 @@ public class CStrike extends FontStrike {
|
|||||||
final Iterator<Long> i = generalCache.values().iterator();
|
final Iterator<Long> i = generalCache.values().iterator();
|
||||||
while (i.hasNext()) {
|
while (i.hasNext()) {
|
||||||
final long longValue = i.next().longValue();
|
final long longValue = i.next().longValue();
|
||||||
if (longValue != -1 && longValue != 0) StrikeCache.freeLongPointer(longValue);
|
if (longValue != -1 && longValue != 0) {
|
||||||
|
removeGlyphInfoFromCache(longValue);
|
||||||
|
StrikeCache.freeLongPointer(longValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -512,7 +515,10 @@ public class CStrike extends FontStrike {
|
|||||||
private static void disposeLongArray(final long[] longArray) {
|
private static void disposeLongArray(final long[] longArray) {
|
||||||
for (int i = 0; i < longArray.length; i++) {
|
for (int i = 0; i < longArray.length; i++) {
|
||||||
final long ptr = longArray[i];
|
final long ptr = longArray[i];
|
||||||
if (ptr != 0 && ptr != -1) StrikeCache.freeLongPointer(ptr); // free's the native struct pointer
|
if (ptr != 0 && ptr != -1) {
|
||||||
|
removeGlyphInfoFromCache(ptr);
|
||||||
|
StrikeCache.freeLongPointer(ptr); // free's the native struct pointer
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,4 +85,6 @@ class CStrikeDisposer extends FontStrikeDisposer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private native void freeNativeScalerContext(long pContext);
|
private native void freeNativeScalerContext(long pContext);
|
||||||
|
|
||||||
|
protected static native void removeGlyphInfoFromCache(long glyphInfo);
|
||||||
}
|
}
|
||||||
|
@ -80,10 +80,8 @@ public final class CGLGraphicsConfig extends CGraphicsConfig
|
|||||||
private ContextCapabilities oglCaps;
|
private ContextCapabilities oglCaps;
|
||||||
private OGLContext context;
|
private OGLContext context;
|
||||||
private final Object disposerReferent = new Object();
|
private final Object disposerReferent = new Object();
|
||||||
|
|
||||||
public static native int getDefaultPixFmt(int screennum);
|
|
||||||
private static native boolean initCGL();
|
private static native boolean initCGL();
|
||||||
private static native long getCGLConfigInfo(int screennum, int visualnum,
|
private static native long getCGLConfigInfo(int displayID, int visualnum,
|
||||||
int swapInterval);
|
int swapInterval);
|
||||||
private static native int getOGLCapabilities(long configInfo);
|
private static native int getOGLCapabilities(long configInfo);
|
||||||
|
|
||||||
@ -137,15 +135,16 @@ public final class CGLGraphicsConfig extends CGraphicsConfig
|
|||||||
// Java-level context and flush the queue...
|
// Java-level context and flush the queue...
|
||||||
OGLContext.invalidateCurrentContext();
|
OGLContext.invalidateCurrentContext();
|
||||||
|
|
||||||
cfginfo = getCGLConfigInfo(device.getCoreGraphicsScreen(), pixfmt,
|
cfginfo = getCGLConfigInfo(device.getCGDisplayID(), pixfmt,
|
||||||
kOpenGLSwapInterval);
|
kOpenGLSwapInterval);
|
||||||
|
if (cfginfo != 0L) {
|
||||||
OGLContext.setScratchSurface(cfginfo);
|
OGLContext.setScratchSurface(cfginfo);
|
||||||
rq.flushAndInvokeNow(new Runnable() {
|
rq.flushAndInvokeNow(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
ids[0] = OGLContext.getOGLIdString();
|
ids[0] = OGLContext.getOGLIdString();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
rq.unlock();
|
rq.unlock();
|
||||||
}
|
}
|
||||||
@ -253,8 +252,8 @@ public final class CGLGraphicsConfig extends CGraphicsConfig
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
int screen = getDevice().getCoreGraphicsScreen();
|
int displayID = getDevice().getCGDisplayID();
|
||||||
return ("CGLGraphicsConfig[dev="+screen+",pixfmt="+pixfmt+"]");
|
return ("CGLGraphicsConfig[dev="+displayID+",pixfmt="+pixfmt+"]");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -413,8 +412,8 @@ public final class CGLGraphicsConfig extends CGraphicsConfig
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addDeviceEventListener(AccelDeviceEventListener l) {
|
public void addDeviceEventListener(AccelDeviceEventListener l) {
|
||||||
int screen = getDevice().getCoreGraphicsScreen();
|
int displayID = getDevice().getCGDisplayID();
|
||||||
AccelDeviceEventNotifier.addListener(l, screen);
|
AccelDeviceEventNotifier.addListener(l, displayID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -439,7 +439,7 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final Graphics getGraphics() {
|
public Graphics getGraphics() {
|
||||||
final Graphics g = getOnscreenGraphics();
|
final Graphics g = getOnscreenGraphics();
|
||||||
if (g != null) {
|
if (g != null) {
|
||||||
synchronized (getPeerTreeLock()){
|
synchronized (getPeerTreeLock()){
|
||||||
@ -1227,10 +1227,10 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void sendEventToDelegate(final AWTEvent e) {
|
protected void sendEventToDelegate(final AWTEvent e) {
|
||||||
|
if (getDelegate() == null || !isShowing() || !isEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
synchronized (getDelegateLock()) {
|
synchronized (getDelegateLock()) {
|
||||||
if (getDelegate() == null || !isShowing() || !isEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
AWTEvent delegateEvent = createDelegateEvent(e);
|
AWTEvent delegateEvent = createDelegateEvent(e);
|
||||||
if (delegateEvent != null) {
|
if (delegateEvent != null) {
|
||||||
AWTAccessor.getComponentAccessor()
|
AWTAccessor.getComponentAccessor()
|
||||||
@ -1244,7 +1244,12 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected AWTEvent createDelegateEvent(AWTEvent e) {
|
/**
|
||||||
|
* Changes the target of the AWTEvent from awt component to appropriate
|
||||||
|
* swing delegate.
|
||||||
|
*/
|
||||||
|
private AWTEvent createDelegateEvent(final AWTEvent e) {
|
||||||
|
// TODO modifiers should be changed to getModifiers()|getModifiersEx()?
|
||||||
AWTEvent delegateEvent = null;
|
AWTEvent delegateEvent = null;
|
||||||
if (e instanceof MouseWheelEvent) {
|
if (e instanceof MouseWheelEvent) {
|
||||||
MouseWheelEvent me = (MouseWheelEvent) e;
|
MouseWheelEvent me = (MouseWheelEvent) e;
|
||||||
|
115
jdk/src/macosx/classes/sun/lwawt/LWLightweightFramePeer.java
Normal file
115
jdk/src/macosx/classes/sun/lwawt/LWLightweightFramePeer.java
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2013, 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
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation. Oracle designates this
|
||||||
|
* particular file as subject to the "Classpath" exception as provided
|
||||||
|
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.lwawt;
|
||||||
|
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.awt.Window;
|
||||||
|
import java.awt.dnd.DropTarget;
|
||||||
|
|
||||||
|
import sun.awt.CausedFocusEvent;
|
||||||
|
import sun.awt.LightweightFrame;
|
||||||
|
|
||||||
|
public class LWLightweightFramePeer extends LWWindowPeer {
|
||||||
|
|
||||||
|
public LWLightweightFramePeer(LightweightFrame target,
|
||||||
|
PlatformComponent platformComponent,
|
||||||
|
PlatformWindow platformWindow)
|
||||||
|
{
|
||||||
|
super(target, platformComponent, platformWindow, LWWindowPeer.PeerType.LW_FRAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
private LightweightFrame getLwTarget() {
|
||||||
|
return (LightweightFrame)getTarget();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Graphics getGraphics() {
|
||||||
|
return getLwTarget().getGraphics();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setVisibleImpl(final boolean visible) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean requestWindowFocus(CausedFocusEvent.Cause cause) {
|
||||||
|
if (!focusAllowedFor()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (getPlatformWindow().rejectFocusRequest(cause)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window opposite = LWKeyboardFocusManagerPeer.getInstance().
|
||||||
|
getCurrentFocusedWindow();
|
||||||
|
|
||||||
|
changeFocusedWindow(true, opposite);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Point getLocationOnScreen() {
|
||||||
|
Rectangle bounds = getBounds();
|
||||||
|
return new Point(bounds.x, bounds.y); // todo
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Insets getInsets() {
|
||||||
|
return new Insets(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBounds(int x, int y, int w, int h, int op) {
|
||||||
|
setBounds(x, y, w, h, op, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateCursorImmediately() {
|
||||||
|
// TODO: tries to switch to the awt/fx toolkit thread and causes a deadlock on macosx
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addDropTarget(DropTarget dt) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeDropTarget(DropTarget dt) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void grab() {
|
||||||
|
getLwTarget().grabFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void ungrab() {
|
||||||
|
getLwTarget().ungrabFocus();
|
||||||
|
}
|
||||||
|
}
|
@ -218,6 +218,23 @@ public abstract class LWToolkit extends SunToolkit implements Runnable {
|
|||||||
return peer;
|
return peer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private LWLightweightFramePeer createDelegatedLwPeer(LightweightFrame target,
|
||||||
|
PlatformComponent platformComponent,
|
||||||
|
PlatformWindow platformWindow)
|
||||||
|
{
|
||||||
|
LWLightweightFramePeer peer = new LWLightweightFramePeer(target, platformComponent, platformWindow);
|
||||||
|
targetCreatedPeer(target, peer);
|
||||||
|
peer.initialize();
|
||||||
|
return peer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FramePeer createLightweightFrame(LightweightFrame target) {
|
||||||
|
PlatformComponent platformComponent = createLwPlatformComponent();
|
||||||
|
PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.LW_FRAME);
|
||||||
|
return createDelegatedLwPeer(target, platformComponent, platformWindow);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WindowPeer createWindow(Window target) {
|
public WindowPeer createWindow(Window target) {
|
||||||
PlatformComponent platformComponent = createPlatformComponent();
|
PlatformComponent platformComponent = createPlatformComponent();
|
||||||
@ -502,6 +519,8 @@ public abstract class LWToolkit extends SunToolkit implements Runnable {
|
|||||||
|
|
||||||
protected abstract PlatformComponent createPlatformComponent();
|
protected abstract PlatformComponent createPlatformComponent();
|
||||||
|
|
||||||
|
protected abstract PlatformComponent createLwPlatformComponent();
|
||||||
|
|
||||||
protected abstract FileDialogPeer createFileDialogPeer(FileDialog target);
|
protected abstract FileDialogPeer createFileDialogPeer(FileDialog target);
|
||||||
|
|
||||||
// ---- UTILITY METHODS ---- //
|
// ---- UTILITY METHODS ---- //
|
||||||
|
@ -48,7 +48,8 @@ public class LWWindowPeer
|
|||||||
FRAME,
|
FRAME,
|
||||||
DIALOG,
|
DIALOG,
|
||||||
EMBEDDED_FRAME,
|
EMBEDDED_FRAME,
|
||||||
VIEW_EMBEDDED_FRAME
|
VIEW_EMBEDDED_FRAME,
|
||||||
|
LW_FRAME
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final PlatformLogger focusLog = PlatformLogger.getLogger("sun.lwawt.focus.LWWindowPeer");
|
private static final PlatformLogger focusLog = PlatformLogger.getLogger("sun.lwawt.focus.LWWindowPeer");
|
||||||
@ -1090,7 +1091,7 @@ public class LWWindowPeer
|
|||||||
return platformWindow.requestWindowFocus();
|
return platformWindow.requestWindowFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean focusAllowedFor() {
|
protected boolean focusAllowedFor() {
|
||||||
Window window = getTarget();
|
Window window = getTarget();
|
||||||
// TODO: check if modal blocked
|
// TODO: check if modal blocked
|
||||||
return window.isVisible() && window.isEnabled() && isFocusableWindow();
|
return window.isVisible() && window.isEnabled() && isFocusableWindow();
|
||||||
@ -1113,10 +1114,15 @@ public class LWWindowPeer
|
|||||||
return !(window instanceof Dialog || window instanceof Frame);
|
return !(window instanceof Dialog || window instanceof Frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void emulateActivation(boolean activate) {
|
||||||
|
changeFocusedWindow(activate, null);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Changes focused window on java level.
|
* Changes focused window on java level.
|
||||||
*/
|
*/
|
||||||
private void changeFocusedWindow(boolean becomesFocused, Window opposite) {
|
protected void changeFocusedWindow(boolean becomesFocused, Window opposite) {
|
||||||
if (focusLog.isLoggable(PlatformLogger.FINE)) {
|
if (focusLog.isLoggable(PlatformLogger.FINE)) {
|
||||||
focusLog.fine((becomesFocused?"gaining":"loosing") + " focus window: " + this);
|
focusLog.fine((becomesFocused?"gaining":"loosing") + " focus window: " + this);
|
||||||
}
|
}
|
||||||
|
@ -128,6 +128,15 @@ final class CDropTargetContextPeer extends SunDropTargetContextPeer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int postDropTargetEvent(Component component, int x, int y, int dropAction,
|
||||||
|
int actions, long[] formats, long nativeCtxt, int eventID,
|
||||||
|
boolean dispatchType) {
|
||||||
|
// On MacOS X all the DnD events should be synchronous
|
||||||
|
return super.postDropTargetEvent(component, x, y, dropAction, actions, formats, nativeCtxt,
|
||||||
|
eventID, SunDropTargetContextPeer.DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
// Signal drop complete:
|
// Signal drop complete:
|
||||||
protected void doDropDone(boolean success, int dropAction, boolean isLocal) {
|
protected void doDropDone(boolean success, int dropAction, boolean isLocal) {
|
||||||
long nativeDropTarget = this.getNativeDragContext();
|
long nativeDropTarget = this.getNativeDragContext();
|
||||||
|
@ -35,7 +35,7 @@ import sun.lwawt.PlatformWindow;
|
|||||||
* On OSX {@code CPlatformComponent} stores pointer to the native CAlayer which
|
* On OSX {@code CPlatformComponent} stores pointer to the native CAlayer which
|
||||||
* can be used from JAWT.
|
* can be used from JAWT.
|
||||||
*/
|
*/
|
||||||
final class CPlatformComponent extends CFRetainedResource
|
class CPlatformComponent extends CFRetainedResource
|
||||||
implements PlatformComponent {
|
implements PlatformComponent {
|
||||||
|
|
||||||
private volatile PlatformWindow platformWindow;
|
private volatile PlatformWindow platformWindow;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -23,34 +23,31 @@
|
|||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package build.tools.javazic;
|
|
||||||
|
|
||||||
/**
|
package sun.lwawt.macosx;
|
||||||
* Day of week enum.
|
|
||||||
*
|
|
||||||
* @since 1.6
|
|
||||||
*/
|
|
||||||
|
|
||||||
enum DayOfWeek {
|
import sun.lwawt.PlatformWindow;
|
||||||
SUNDAY("Sun"),
|
|
||||||
MONDAY("Mon"),
|
|
||||||
TUESDAY("Tue"),
|
|
||||||
WEDNESDAY("Wed"),
|
|
||||||
THURSDAY("Thu"),
|
|
||||||
FRIDAY("Fri"),
|
|
||||||
SATURDAY("Sat");
|
|
||||||
|
|
||||||
private final String abbr;
|
class CPlatformLWComponent extends CPlatformComponent {
|
||||||
|
|
||||||
private DayOfWeek(String abbr) {
|
CPlatformLWComponent() {
|
||||||
this.abbr = abbr;
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
String getAbbr() {
|
@Override
|
||||||
return abbr;
|
public long getPointer() {
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int value() {
|
@Override
|
||||||
return ordinal() + 1;
|
public void initialize(final PlatformWindow platformWindow) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBounds(final int x, final int y, final int w, final int h) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
}
|
}
|
||||||
}
|
}
|
82
jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformLWView.java
Normal file
82
jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformLWView.java
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2013, 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
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation. Oracle designates this
|
||||||
|
* particular file as subject to the "Classpath" exception as provided
|
||||||
|
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.lwawt.macosx;
|
||||||
|
|
||||||
|
import sun.lwawt.LWWindowPeer;
|
||||||
|
import sun.java2d.SurfaceData;
|
||||||
|
|
||||||
|
public class CPlatformLWView extends CPlatformView {
|
||||||
|
|
||||||
|
public CPlatformLWView() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize(LWWindowPeer peer, CPlatformResponder responder) {
|
||||||
|
initializeBase(peer, responder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getAWTView() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isOpaque() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBounds(int x, int y, int width, int height) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enterFullScreenMode() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exitFullScreenMode() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SurfaceData replaceSurfaceData() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SurfaceData getSurfaceData() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getWindowLayerPtr() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
202
jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformLWWindow.java
Normal file
202
jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformLWWindow.java
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2013, 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
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation. Oracle designates this
|
||||||
|
* particular file as subject to the "Classpath" exception as provided
|
||||||
|
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.lwawt.macosx;
|
||||||
|
|
||||||
|
import java.awt.Font;
|
||||||
|
import java.awt.FontMetrics;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.GraphicsDevice;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import java.awt.MenuBar;
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.awt.Window;
|
||||||
|
import sun.awt.CausedFocusEvent;
|
||||||
|
import sun.java2d.SurfaceData;
|
||||||
|
import sun.lwawt.LWWindowPeer;
|
||||||
|
import sun.lwawt.PlatformWindow;
|
||||||
|
|
||||||
|
public class CPlatformLWWindow extends CPlatformWindow {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize(Window target, LWWindowPeer peer, PlatformWindow owner) {
|
||||||
|
initializeBase(target, peer, owner, new CPlatformLWView());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toggleFullScreen() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setMenuBar(MenuBar mb) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FontMetrics getFontMetrics(Font f) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Insets getInsets() {
|
||||||
|
return new Insets(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Point getLocationOnScreen() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GraphicsDevice getGraphicsDevice() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SurfaceData getScreenSurface() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SurfaceData replaceSurfaceData() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setBounds(int x, int y, int w, int h) {
|
||||||
|
if (getPeer() != null) {
|
||||||
|
getPeer().notifyReshape(x, y, w, h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setVisible(boolean visible) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTitle(String title) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateIconImages() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getNSWindowPtr() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SurfaceData getSurfaceData() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toBack() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void toFront() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setResizable(final boolean resizable) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSizeConstraints(int minW, int minH, int maxW, int maxH) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean rejectFocusRequest(CausedFocusEvent.Cause cause) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean requestWindowFocus() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isActive() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateFocusableWindowState() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Graphics transformGraphics(Graphics g) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAlwaysOnTop(boolean isAlwaysOnTop) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PlatformWindow getTopmostPlatformWindowUnderMouse(){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setOpacity(float opacity) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setOpaque(boolean isOpaque) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enterFullScreenMode() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exitFullScreenMode() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setWindowState(int windowState) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LWWindowPeer getPeer() {
|
||||||
|
return super.getPeer();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CPlatformView getContentView() {
|
||||||
|
return super.getContentView();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getLayerPtr() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
@ -54,8 +54,7 @@ public class CPlatformView extends CFRetainedResource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void initialize(LWWindowPeer peer, CPlatformResponder responder) {
|
public void initialize(LWWindowPeer peer, CPlatformResponder responder) {
|
||||||
this.peer = peer;
|
initializeBase(peer, responder);
|
||||||
this.responder = responder;
|
|
||||||
|
|
||||||
if (!LWCToolkit.getSunAwtDisableCALayers()) {
|
if (!LWCToolkit.getSunAwtDisableCALayers()) {
|
||||||
this.windowLayer = new CGLLayer(peer);
|
this.windowLayer = new CGLLayer(peer);
|
||||||
@ -63,6 +62,11 @@ public class CPlatformView extends CFRetainedResource {
|
|||||||
setPtr(nativeCreateView(0, 0, 0, 0, getWindowLayerPtr()));
|
setPtr(nativeCreateView(0, 0, 0, 0, getWindowLayerPtr()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void initializeBase(LWWindowPeer peer, CPlatformResponder responder) {
|
||||||
|
this.peer = peer;
|
||||||
|
this.responder = responder;
|
||||||
|
}
|
||||||
|
|
||||||
public long getAWTView() {
|
public long getAWTView() {
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ import java.awt.Dialog.ModalityType;
|
|||||||
import java.awt.event.*;
|
import java.awt.event.*;
|
||||||
import java.awt.peer.WindowPeer;
|
import java.awt.peer.WindowPeer;
|
||||||
import java.beans.*;
|
import java.beans.*;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
@ -44,7 +45,7 @@ import com.apple.laf.*;
|
|||||||
import com.apple.laf.ClientPropertyApplicator.Property;
|
import com.apple.laf.ClientPropertyApplicator.Property;
|
||||||
import com.sun.awt.AWTUtilities;
|
import com.sun.awt.AWTUtilities;
|
||||||
|
|
||||||
public final class CPlatformWindow extends CFRetainedResource implements PlatformWindow {
|
public class CPlatformWindow extends CFRetainedResource implements PlatformWindow {
|
||||||
private native long nativeCreateNSWindow(long nsViewPtr, long styleBits, double x, double y, double w, double h);
|
private native long nativeCreateNSWindow(long nsViewPtr, long styleBits, double x, double y, double w, double h);
|
||||||
private static native void nativeSetNSWindowStyleBits(long nsWindowPtr, int mask, int data);
|
private static native void nativeSetNSWindowStyleBits(long nsWindowPtr, int mask, int data);
|
||||||
private static native void nativeSetNSWindowMenuBar(long nsWindowPtr, long menuBarPtr);
|
private static native void nativeSetNSWindowMenuBar(long nsWindowPtr, long menuBarPtr);
|
||||||
@ -218,11 +219,7 @@ public final class CPlatformWindow extends CFRetainedResource implements Platfor
|
|||||||
*/
|
*/
|
||||||
@Override // PlatformWindow
|
@Override // PlatformWindow
|
||||||
public void initialize(Window _target, LWWindowPeer _peer, PlatformWindow _owner) {
|
public void initialize(Window _target, LWWindowPeer _peer, PlatformWindow _owner) {
|
||||||
this.peer = _peer;
|
initializeBase(_target, _peer, _owner, new CPlatformView());
|
||||||
this.target = _target;
|
|
||||||
if (_owner instanceof CPlatformWindow) {
|
|
||||||
this.owner = (CPlatformWindow)_owner;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int styleBits = getInitialStyleBits();
|
final int styleBits = getInitialStyleBits();
|
||||||
|
|
||||||
@ -231,7 +228,6 @@ public final class CPlatformWindow extends CFRetainedResource implements Platfor
|
|||||||
String warningString = target.getWarningString();
|
String warningString = target.getWarningString();
|
||||||
|
|
||||||
responder = new CPlatformResponder(peer, false);
|
responder = new CPlatformResponder(peer, false);
|
||||||
contentView = new CPlatformView();
|
|
||||||
contentView.initialize(peer, responder);
|
contentView.initialize(peer, responder);
|
||||||
|
|
||||||
final long nativeWindowPtr = nativeCreateNSWindow(contentView.getAWTView(), styleBits, 0, 0, 0, 0);
|
final long nativeWindowPtr = nativeCreateNSWindow(contentView.getAWTView(), styleBits, 0, 0, 0, 0);
|
||||||
@ -253,6 +249,15 @@ public final class CPlatformWindow extends CFRetainedResource implements Platfor
|
|||||||
validateSurface();
|
validateSurface();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void initializeBase(Window target, LWWindowPeer peer, PlatformWindow owner, CPlatformView view) {
|
||||||
|
this.peer = peer;
|
||||||
|
this.target = target;
|
||||||
|
if (owner instanceof CPlatformWindow) {
|
||||||
|
this.owner = (CPlatformWindow)owner;
|
||||||
|
}
|
||||||
|
this.contentView = view;
|
||||||
|
}
|
||||||
|
|
||||||
private int getInitialStyleBits() {
|
private int getInitialStyleBits() {
|
||||||
// defaults style bits
|
// defaults style bits
|
||||||
int styleBits = DECORATED | HAS_SHADOW | CLOSEABLE | MINIMIZABLE | ZOOMABLE | RESIZABLE;
|
int styleBits = DECORATED | HAS_SHADOW | CLOSEABLE | MINIMIZABLE | ZOOMABLE | RESIZABLE;
|
||||||
@ -857,7 +862,16 @@ public final class CPlatformWindow extends CFRetainedResource implements Platfor
|
|||||||
|
|
||||||
private void flushBuffers() {
|
private void flushBuffers() {
|
||||||
if (isVisible() && !nativeBounds.isEmpty()) {
|
if (isVisible() && !nativeBounds.isEmpty()) {
|
||||||
LWCToolkit.getLWCToolkit().flushPendingEventsOnAppkit(target);
|
try {
|
||||||
|
LWCToolkit.invokeAndWait(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
//Posting an empty to flush the EventQueue without blocking the main thread
|
||||||
|
}
|
||||||
|
}, target);
|
||||||
|
} catch (InterruptedException | InvocationTargetException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ class CRobot implements RobotPeer {
|
|||||||
mouseLastX = x;
|
mouseLastX = x;
|
||||||
mouseLastY = y;
|
mouseLastY = y;
|
||||||
|
|
||||||
mouseEvent(fDevice.getCoreGraphicsScreen(), mouseLastX, mouseLastY,
|
mouseEvent(fDevice.getCGDisplayID(), mouseLastX, mouseLastY,
|
||||||
mouseButtonsState, true, true);
|
mouseButtonsState, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ class CRobot implements RobotPeer {
|
|||||||
public void mousePress(int buttons) {
|
public void mousePress(int buttons) {
|
||||||
mouseButtonsState |= buttons;
|
mouseButtonsState |= buttons;
|
||||||
|
|
||||||
mouseEvent(fDevice.getCoreGraphicsScreen(), mouseLastX, mouseLastY,
|
mouseEvent(fDevice.getCGDisplayID(), mouseLastX, mouseLastY,
|
||||||
buttons, true, false);
|
buttons, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ class CRobot implements RobotPeer {
|
|||||||
public void mouseRelease(int buttons) {
|
public void mouseRelease(int buttons) {
|
||||||
mouseButtonsState &= ~buttons;
|
mouseButtonsState &= ~buttons;
|
||||||
|
|
||||||
mouseEvent(fDevice.getCoreGraphicsScreen(), mouseLastX, mouseLastY,
|
mouseEvent(fDevice.getCGDisplayID(), mouseLastX, mouseLastY,
|
||||||
buttons, false, false);
|
buttons, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ class CRobot implements RobotPeer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private native void initRobot();
|
private native void initRobot();
|
||||||
private native void mouseEvent(int screen, int lastX, int lastY,
|
private native void mouseEvent(int displayID, int lastX, int lastY,
|
||||||
int buttonsState,
|
int buttonsState,
|
||||||
boolean isButtonsDownState,
|
boolean isButtonsDownState,
|
||||||
boolean isMouseMove);
|
boolean isMouseMove);
|
||||||
|
@ -25,27 +25,33 @@
|
|||||||
|
|
||||||
package sun.lwawt.macosx;
|
package sun.lwawt.macosx;
|
||||||
|
|
||||||
|
import sun.awt.Mutex;
|
||||||
import sun.awt.datatransfer.ToolkitThreadBlockedHandler;
|
import sun.awt.datatransfer.ToolkitThreadBlockedHandler;
|
||||||
|
|
||||||
final class CToolkitThreadBlockedHandler implements ToolkitThreadBlockedHandler {
|
final class CToolkitThreadBlockedHandler extends Mutex implements ToolkitThreadBlockedHandler {
|
||||||
private final LWCToolkit toolkit = (LWCToolkit)java.awt.Toolkit.getDefaultToolkit();
|
private long awtRunLoopMediator = 0;
|
||||||
|
private final boolean processEvents;
|
||||||
|
|
||||||
public void lock() {
|
CToolkitThreadBlockedHandler() {
|
||||||
}
|
super();
|
||||||
|
this.processEvents = true;
|
||||||
public void unlock() {
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isOwned() {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void enter() {
|
public void enter() {
|
||||||
// Execute the next AppKit event while we are waiting for system to
|
if (!isOwned()) {
|
||||||
// finish our request - this will save us from biting our own tail
|
throw new IllegalMonitorStateException();
|
||||||
toolkit.executeNextAppKitEvent();
|
}
|
||||||
|
awtRunLoopMediator = LWCToolkit.createAWTRunLoopMediator();
|
||||||
|
unlock();
|
||||||
|
LWCToolkit.doAWTRunLoop(awtRunLoopMediator, processEvents);
|
||||||
|
lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void exit() {
|
public void exit() {
|
||||||
|
if (!isOwned()) {
|
||||||
|
throw new IllegalMonitorStateException();
|
||||||
|
}
|
||||||
|
LWCToolkit.stopAWTRunLoop(awtRunLoopMediator);
|
||||||
|
awtRunLoopMediator = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -63,8 +63,6 @@ public final class LWCToolkit extends LWToolkit {
|
|||||||
|
|
||||||
private static native void initIDs();
|
private static native void initIDs();
|
||||||
|
|
||||||
static native void executeNextAppKitEvent();
|
|
||||||
|
|
||||||
private static CInputMethodDescriptor sInputMethodDescriptor;
|
private static CInputMethodDescriptor sInputMethodDescriptor;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@ -160,6 +158,8 @@ public final class LWCToolkit extends LWToolkit {
|
|||||||
return new CPlatformEmbeddedFrame();
|
return new CPlatformEmbeddedFrame();
|
||||||
} else if (peerType == PeerType.VIEW_EMBEDDED_FRAME) {
|
} else if (peerType == PeerType.VIEW_EMBEDDED_FRAME) {
|
||||||
return new CViewPlatformEmbeddedFrame();
|
return new CViewPlatformEmbeddedFrame();
|
||||||
|
} else if (peerType == PeerType.LW_FRAME) {
|
||||||
|
return new CPlatformLWWindow();
|
||||||
} else {
|
} else {
|
||||||
assert (peerType == PeerType.SIMPLEWINDOW || peerType == PeerType.DIALOG || peerType == PeerType.FRAME);
|
assert (peerType == PeerType.SIMPLEWINDOW || peerType == PeerType.DIALOG || peerType == PeerType.FRAME);
|
||||||
return new CPlatformWindow();
|
return new CPlatformWindow();
|
||||||
@ -171,6 +171,11 @@ public final class LWCToolkit extends LWToolkit {
|
|||||||
return new CPlatformComponent();
|
return new CPlatformComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected PlatformComponent createLwPlatformComponent() {
|
||||||
|
return new CPlatformLWComponent();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected FileDialogPeer createFileDialogPeer(FileDialog target) {
|
protected FileDialogPeer createFileDialogPeer(FileDialog target) {
|
||||||
return new CFileDialog(target);
|
return new CFileDialog(target);
|
||||||
@ -346,22 +351,7 @@ public final class LWCToolkit extends LWToolkit {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Insets getScreenInsets(final GraphicsConfiguration gc) {
|
public Insets getScreenInsets(final GraphicsConfiguration gc) {
|
||||||
final CGraphicsConfig cgc = (CGraphicsConfig) gc;
|
return ((CGraphicsConfig) gc).getDevice().getScreenInsets();
|
||||||
final int displayId = cgc.getDevice().getCoreGraphicsScreen();
|
|
||||||
Rectangle fullScreen, workArea;
|
|
||||||
final long screen = CWrapper.NSScreen.screenByDisplayId(displayId);
|
|
||||||
try {
|
|
||||||
fullScreen = CWrapper.NSScreen.frame(screen).getBounds();
|
|
||||||
workArea = CWrapper.NSScreen.visibleFrame(screen).getBounds();
|
|
||||||
} finally {
|
|
||||||
CWrapper.NSObject.release(screen);
|
|
||||||
}
|
|
||||||
// Convert between Cocoa's coordinate system and Java.
|
|
||||||
int bottom = workArea.y - fullScreen.y;
|
|
||||||
int top = fullScreen.height - workArea.height - bottom;
|
|
||||||
int left = workArea.x - fullScreen.x;
|
|
||||||
int right = fullScreen.width - workArea.width - left;
|
|
||||||
return new Insets(top, left, bottom, right);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -495,30 +485,6 @@ public final class LWCToolkit extends LWToolkit {
|
|||||||
synchronized(ret) { return ret[0]; }
|
synchronized(ret) { return ret[0]; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Just a wrapper for LWCToolkit.invokeAndWait. Posts an empty event to the
|
|
||||||
* appropriate event queue and waits for it to finish.
|
|
||||||
*/
|
|
||||||
public static void flushPendingEventsOnAppkit(final Component component) {
|
|
||||||
try {
|
|
||||||
invokeAndWait(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
}
|
|
||||||
}, component);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Kicks an event over to the appropriate eventqueue and waits for it to finish
|
|
||||||
// To avoid deadlocking, we manually run the NSRunLoop while waiting
|
|
||||||
// Any selector invoked using ThreadUtilities performOnMainThread will be processed in doAWTRunLoop
|
|
||||||
// The CInvocationEvent will call LWCToolkit.stopAWTRunLoop() when finished, which will stop our manual runloop
|
|
||||||
public static void invokeAndWait(Runnable event, Component component) throws InterruptedException, InvocationTargetException {
|
|
||||||
invokeAndWait(event, component, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> T invokeAndWait(final Callable<T> callable, Component component) throws Exception {
|
public static <T> T invokeAndWait(final Callable<T> callable, Component component) throws Exception {
|
||||||
final CallableWrapper<T> wrapper = new CallableWrapper<T>(callable);
|
final CallableWrapper<T> wrapper = new CallableWrapper<T>(callable);
|
||||||
invokeAndWait(wrapper, component);
|
invokeAndWait(wrapper, component);
|
||||||
@ -548,10 +514,27 @@ public final class LWCToolkit extends LWToolkit {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void invokeAndWait(Runnable event, Component component, boolean detectDeadlocks) throws InterruptedException, InvocationTargetException {
|
// Kicks an event over to the appropriate eventqueue and waits for it to finish
|
||||||
long mediator = createAWTRunLoopMediator();
|
// To avoid deadlocking, we manually run the NSRunLoop while waiting
|
||||||
|
// Any selector invoked using ThreadUtilities performOnMainThread will be processed in doAWTRunLoop
|
||||||
|
// The InvocationEvent will call LWCToolkit.stopAWTRunLoop() when finished, which will stop our manual runloop
|
||||||
|
// Does not dispatch native events while in the loop
|
||||||
|
public static void invokeAndWait(Runnable event, Component component) throws InterruptedException, InvocationTargetException {
|
||||||
|
final long mediator = createAWTRunLoopMediator();
|
||||||
|
|
||||||
InvocationEvent invocationEvent = new CPeerEvent(event, mediator);
|
InvocationEvent invocationEvent =
|
||||||
|
new InvocationEvent(component != null ? component : Toolkit.getDefaultToolkit(), event) {
|
||||||
|
@Override
|
||||||
|
public void dispatch() {
|
||||||
|
try {
|
||||||
|
super.dispatch();
|
||||||
|
} finally {
|
||||||
|
if (mediator != 0) {
|
||||||
|
stopAWTRunLoop(mediator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if (component != null) {
|
if (component != null) {
|
||||||
AppContext appContext = SunToolkit.targetToAppContext(component);
|
AppContext appContext = SunToolkit.targetToAppContext(component);
|
||||||
@ -564,7 +547,7 @@ public final class LWCToolkit extends LWToolkit {
|
|||||||
((LWCToolkit)Toolkit.getDefaultToolkit()).getSystemEventQueueForInvokeAndWait().postEvent(invocationEvent);
|
((LWCToolkit)Toolkit.getDefaultToolkit()).getSystemEventQueueForInvokeAndWait().postEvent(invocationEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
doAWTRunLoop(mediator, true, detectDeadlocks);
|
doAWTRunLoop(mediator, false);
|
||||||
|
|
||||||
Throwable eventException = invocationEvent.getException();
|
Throwable eventException = invocationEvent.getException();
|
||||||
if (eventException != null) {
|
if (eventException != null) {
|
||||||
@ -576,7 +559,8 @@ public final class LWCToolkit extends LWToolkit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void invokeLater(Runnable event, Component component) throws InvocationTargetException {
|
public static void invokeLater(Runnable event, Component component) throws InvocationTargetException {
|
||||||
final InvocationEvent invocationEvent = new CPeerEvent(event, 0);
|
final InvocationEvent invocationEvent =
|
||||||
|
new InvocationEvent(component != null ? component : Toolkit.getDefaultToolkit(), event);
|
||||||
|
|
||||||
if (component != null) {
|
if (component != null) {
|
||||||
final AppContext appContext = SunToolkit.targetToAppContext(component);
|
final AppContext appContext = SunToolkit.targetToAppContext(component);
|
||||||
@ -681,31 +665,6 @@ public final class LWCToolkit extends LWToolkit {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extends PeerEvent because we want to pass long an ObjC mediator object and because we want these events to be posted early
|
|
||||||
// Typically, rather than relying on the notifier to call notifyAll(), we use the mediator to stop the runloop
|
|
||||||
public static class CPeerEvent extends PeerEvent {
|
|
||||||
private long _mediator = 0;
|
|
||||||
|
|
||||||
public CPeerEvent(Runnable runnable, long mediator) {
|
|
||||||
super(Toolkit.getDefaultToolkit(), runnable, null, true, 0);
|
|
||||||
_mediator = mediator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void dispatch() {
|
|
||||||
try {
|
|
||||||
super.dispatch();
|
|
||||||
} finally {
|
|
||||||
if (_mediator != 0) {
|
|
||||||
LWCToolkit.stopAWTRunLoop(_mediator);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call through to native methods
|
|
||||||
public static void doAWTRunLoop(long mediator, boolean awtMode) { doAWTRunLoop(mediator, awtMode, true); }
|
|
||||||
public static void doAWTRunLoop(long mediator) { doAWTRunLoop(mediator, true); }
|
|
||||||
|
|
||||||
private static Boolean sunAwtDisableCALayers = null;
|
private static Boolean sunAwtDisableCALayers = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -730,12 +689,20 @@ public final class LWCToolkit extends LWToolkit {
|
|||||||
* Native methods section
|
* Native methods section
|
||||||
************************/
|
************************/
|
||||||
|
|
||||||
// These are public because they are accessed from WebKitPluginObject in JavaDeploy
|
static native long createAWTRunLoopMediator();
|
||||||
// Basic usage:
|
/**
|
||||||
// createAWTRunLoopMediator. Start client code on another thread. doAWTRunLoop. When client code is finished, stopAWTRunLoop.
|
* Method to run a nested run-loop. The nested loop is spinned in the javaRunLoop mode, so selectors sent
|
||||||
public static native long createAWTRunLoopMediator();
|
* by [JNFRunLoop performOnMainThreadWaiting] are processed.
|
||||||
public static native void doAWTRunLoop(long mediator, boolean awtMode, boolean detectDeadlocks);
|
* @param mediator a native pointer to the mediator object created by createAWTRunLoopMediator
|
||||||
public static native void stopAWTRunLoop(long mediator);
|
* @param processEvents if true - dispatches event while in the nested loop. Used in DnD.
|
||||||
|
* Additional attention is needed when using this feature as we short-circuit normal event
|
||||||
|
* processing which could break Appkit.
|
||||||
|
* (One known example is when the window is resized with the mouse)
|
||||||
|
*
|
||||||
|
* if false - all events come after exit form the nested loop
|
||||||
|
*/
|
||||||
|
static native void doAWTRunLoop(long mediator, boolean processEvents);
|
||||||
|
static native void stopAWTRunLoop(long mediator);
|
||||||
|
|
||||||
private native boolean nativeSyncQueue(long timeout);
|
private native boolean nativeSyncQueue(long timeout);
|
||||||
|
|
||||||
|
@ -227,7 +227,7 @@ AWT_ASSERT_APPKIT_THREAD;
|
|||||||
|
|
||||||
- (void) mouseMoved: (NSEvent *)event {
|
- (void) mouseMoved: (NSEvent *)event {
|
||||||
// TODO: better way to redirect move events to the "under" view
|
// TODO: better way to redirect move events to the "under" view
|
||||||
|
|
||||||
NSPoint eventLocation = [event locationInWindow];
|
NSPoint eventLocation = [event locationInWindow];
|
||||||
NSPoint localPoint = [self convertPoint: eventLocation fromView: nil];
|
NSPoint localPoint = [self convertPoint: eventLocation fromView: nil];
|
||||||
|
|
||||||
@ -668,7 +668,7 @@ AWT_ASSERT_APPKIT_THREAD;
|
|||||||
|
|
||||||
- (void) setDropTarget:(CDropTarget *)target {
|
- (void) setDropTarget:(CDropTarget *)target {
|
||||||
self._dropTarget = target;
|
self._dropTarget = target;
|
||||||
[ThreadUtilities performOnMainThread:@selector(controlModelControlValid) onObject:self._dropTarget withObject:nil waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(controlModelControlValid) on:self._dropTarget withObject:nil waitUntilDone:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************** BEGIN NSDraggingSource Interface ********************************/
|
/******************************** BEGIN NSDraggingSource Interface ********************************/
|
||||||
@ -1215,7 +1215,7 @@ JNF_CLASS_CACHE(jc_CInputMethod, "sun/lwawt/macosx/CInputMethod");
|
|||||||
fprintf(stderr, "AWTView InputMethod Selector Called : [abandonInput]\n");
|
fprintf(stderr, "AWTView InputMethod Selector Called : [abandonInput]\n");
|
||||||
#endif // IM_DEBUG
|
#endif // IM_DEBUG
|
||||||
|
|
||||||
[ThreadUtilities performOnMainThread:@selector(markedTextAbandoned:) onObject:[NSInputManager currentInputManager] withObject:self waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(markedTextAbandoned:) on:[NSInputManager currentInputManager] withObject:self waitUntilDone:YES];
|
||||||
[self unmarkText];
|
[self unmarkText];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -567,10 +567,9 @@ JNIEXPORT void JNICALL Java_com_apple_eawt__1AppEventHandler_nativeRegisterForNo
|
|||||||
{
|
{
|
||||||
JNF_COCOA_ENTER(env);
|
JNF_COCOA_ENTER(env);
|
||||||
[ThreadUtilities performOnMainThread:@selector(_registerForNotification:)
|
[ThreadUtilities performOnMainThread:@selector(_registerForNotification:)
|
||||||
onObject:[ApplicationDelegate class]
|
on:[ApplicationDelegate class]
|
||||||
withObject:[NSNumber numberWithInt:notificationType]
|
withObject:[NSNumber numberWithInt:notificationType]
|
||||||
waitUntilDone:NO
|
waitUntilDone:NO]; // AWT_THREADING Safe (non-blocking)
|
||||||
awtMode:NO]; // AWT_THREADING Safe (non-blocking)
|
|
||||||
JNF_COCOA_EXIT(env);
|
JNF_COCOA_EXIT(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ static CClipboard *sClipboard = nil;
|
|||||||
fClipboardOwner = JNFNewGlobalRef(inEnv, inClipboard);
|
fClipboardOwner = JNFNewGlobalRef(inEnv, inClipboard);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[ThreadUtilities performOnMainThread:@selector(_nativeDeclareTypes:) onObject:self withObject:inTypes waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(_nativeDeclareTypes:) on:self withObject:inTypes waitUntilDone:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) _nativeDeclareTypes:(NSArray *)inTypes {
|
- (void) _nativeDeclareTypes:(NSArray *)inTypes {
|
||||||
@ -135,7 +135,7 @@ static CClipboard *sClipboard = nil;
|
|||||||
- (NSArray *) javaGetTypes {
|
- (NSArray *) javaGetTypes {
|
||||||
|
|
||||||
NSMutableArray *args = [NSMutableArray arrayWithCapacity:1];
|
NSMutableArray *args = [NSMutableArray arrayWithCapacity:1];
|
||||||
[ThreadUtilities performOnMainThread:@selector(_nativeGetTypes:) onObject:self withObject:args waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(_nativeGetTypes:) on:self withObject:args waitUntilDone:YES];
|
||||||
|
|
||||||
//NSLog(@"CClipboard getTypes returns %@", [args lastObject]);
|
//NSLog(@"CClipboard getTypes returns %@", [args lastObject]);
|
||||||
return [args lastObject];
|
return [args lastObject];
|
||||||
@ -152,7 +152,7 @@ static CClipboard *sClipboard = nil;
|
|||||||
- (void) javaSetData:(NSData *)inData forType:(NSString *) inFormat {
|
- (void) javaSetData:(NSData *)inData forType:(NSString *) inFormat {
|
||||||
|
|
||||||
CClipboardUpdate *newUpdate = [[CClipboardUpdate alloc] initWithData:inData withFormat:inFormat];
|
CClipboardUpdate *newUpdate = [[CClipboardUpdate alloc] initWithData:inData withFormat:inFormat];
|
||||||
[ThreadUtilities performOnMainThread:@selector(_nativeSetData:) onObject:self withObject:newUpdate waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(_nativeSetData:) on:self withObject:newUpdate waitUntilDone:YES];
|
||||||
[newUpdate release];
|
[newUpdate release];
|
||||||
|
|
||||||
//NSLog(@"CClipboard javaSetData forType %@", inFormat);
|
//NSLog(@"CClipboard javaSetData forType %@", inFormat);
|
||||||
@ -170,7 +170,7 @@ static CClipboard *sClipboard = nil;
|
|||||||
- (NSData *) javaGetDataForType:(NSString *) inFormat {
|
- (NSData *) javaGetDataForType:(NSString *) inFormat {
|
||||||
|
|
||||||
NSMutableArray *args = [NSMutableArray arrayWithObject:inFormat];
|
NSMutableArray *args = [NSMutableArray arrayWithObject:inFormat];
|
||||||
[ThreadUtilities performOnMainThread:@selector(_nativeGetDataForType:) onObject:self withObject:args waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(_nativeGetDataForType:) on:self withObject:args waitUntilDone:YES];
|
||||||
|
|
||||||
//NSLog(@"CClipboard javaGetDataForType %@ returns an NSData", inFormat);
|
//NSLog(@"CClipboard javaGetDataForType %@ returns an NSData", inFormat);
|
||||||
return [args lastObject];
|
return [args lastObject];
|
||||||
|
@ -390,8 +390,7 @@ extern JNFClassInfo jc_CDropTargetContextPeer;
|
|||||||
|
|
||||||
// Release dragging data if any when Java's AWT event thread is all finished.
|
// Release dragging data if any when Java's AWT event thread is all finished.
|
||||||
// Make sure dragging data is released on the native event thread.
|
// Make sure dragging data is released on the native event thread.
|
||||||
[ThreadUtilities performOnMainThread:@selector(safeReleaseDraggingData:) onObject:self
|
[ThreadUtilities performOnMainThread:@selector(safeReleaseDraggingData:) on:self withObject:draggingSequenceNumberID waitUntilDone:NO];
|
||||||
withObject:draggingSequenceNumberID waitUntilDone:NO awtMode:NO];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (jint)currentJavaActions {
|
- (jint)currentJavaActions {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -23,7 +23,8 @@
|
|||||||
* questions.
|
* questions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "LWCToolkit.h"
|
#import "LWCToolkit.h"
|
||||||
|
#import "ThreadUtilities.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert the mode string to the more convinient bits per pixel value
|
* Convert the mode string to the more convinient bits per pixel value
|
||||||
@ -146,6 +147,47 @@ Java_sun_awt_CGraphicsDevice_nativeGetYResolution
|
|||||||
return dpi;
|
return dpi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: sun_awt_CGraphicsDevice
|
||||||
|
* Method: nativeGetScreenInsets
|
||||||
|
* Signature: (I)D
|
||||||
|
*/
|
||||||
|
JNIEXPORT jobject JNICALL
|
||||||
|
Java_sun_awt_CGraphicsDevice_nativeGetScreenInsets
|
||||||
|
(JNIEnv *env, jclass class, jint displayID)
|
||||||
|
{
|
||||||
|
jobject ret = NULL;
|
||||||
|
__block NSRect frame = NSZeroRect;
|
||||||
|
__block NSRect visibleFrame = NSZeroRect;
|
||||||
|
JNF_COCOA_ENTER(env);
|
||||||
|
|
||||||
|
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
|
||||||
|
NSArray *screens = [NSScreen screens];
|
||||||
|
for (NSScreen *screen in screens) {
|
||||||
|
NSDictionary *screenInfo = [screen deviceDescription];
|
||||||
|
NSNumber *screenID = [screenInfo objectForKey:@"NSScreenNumber"];
|
||||||
|
if ([screenID pointerValue] == displayID){
|
||||||
|
frame = [screen frame];
|
||||||
|
visibleFrame = [screen visibleFrame];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
// Convert between Cocoa's coordinate system and Java.
|
||||||
|
jint bottom = visibleFrame.origin.y - frame.origin.y;
|
||||||
|
jint top = frame.size.height - visibleFrame.size.height - bottom;
|
||||||
|
jint left = visibleFrame.origin.x - frame.origin.x;
|
||||||
|
jint right = frame.size.width - visibleFrame.size.width - left;
|
||||||
|
|
||||||
|
static JNF_CLASS_CACHE(jc_Insets, "java/awt/Insets");
|
||||||
|
static JNF_CTOR_CACHE(jc_Insets_ctor, jc_Insets, "(IIII)V");
|
||||||
|
ret = JNFNewObject(env, jc_Insets_ctor, top, left, bottom, right);
|
||||||
|
|
||||||
|
JNF_COCOA_EXIT(env);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: sun_awt_CGraphicsDevice
|
* Class: sun_awt_CGraphicsDevice
|
||||||
* Method: nativeSetDisplayMode
|
* Method: nativeSetDisplayMode
|
||||||
|
@ -55,11 +55,11 @@ AWT_ASSERT_APPKIT_THREAD;
|
|||||||
//- (void)finalize { [super finalize]; }
|
//- (void)finalize { [super finalize]; }
|
||||||
|
|
||||||
- (void)addJavaSubmenu:(CMenu *)submenu {
|
- (void)addJavaSubmenu:(CMenu *)submenu {
|
||||||
[ThreadUtilities performOnMainThread:@selector(addNativeItem_OnAppKitThread:) onObject:self withObject:submenu waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(addNativeItem_OnAppKitThread:) on:self withObject:submenu waitUntilDone:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)addJavaMenuItem:(CMenuItem *)theMenuItem {
|
- (void)addJavaMenuItem:(CMenuItem *)theMenuItem {
|
||||||
[ThreadUtilities performOnMainThread:@selector(addNativeItem_OnAppKitThread:) onObject:self withObject:theMenuItem waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(addNativeItem_OnAppKitThread:) on:self withObject:theMenuItem waitUntilDone:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)addNativeItem_OnAppKitThread:(CMenuItem *)itemModified {
|
- (void)addNativeItem_OnAppKitThread:(CMenuItem *)itemModified {
|
||||||
@ -70,7 +70,7 @@ AWT_ASSERT_APPKIT_THREAD;
|
|||||||
- (void)setJavaMenuTitle:(NSString *)title {
|
- (void)setJavaMenuTitle:(NSString *)title {
|
||||||
|
|
||||||
if (title) {
|
if (title) {
|
||||||
[ThreadUtilities performOnMainThread:@selector(setNativeMenuTitle_OnAppKitThread:) onObject:self withObject:title waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(setNativeMenuTitle_OnAppKitThread:) on:self withObject:title waitUntilDone:YES];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ AWT_ASSERT_APPKIT_THREAD;
|
|||||||
|
|
||||||
- (void)deleteJavaItem:(jint)index {
|
- (void)deleteJavaItem:(jint)index {
|
||||||
|
|
||||||
[ThreadUtilities performOnMainThread:@selector(deleteNativeJavaItem_OnAppKitThread:) onObject:self withObject:[NSNumber numberWithInt:index] waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(deleteNativeJavaItem_OnAppKitThread:) on:self withObject:[NSNumber numberWithInt:index] waitUntilDone:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)deleteNativeJavaItem_OnAppKitThread:(NSNumber *)number {
|
- (void)deleteNativeJavaItem_OnAppKitThread:(NSNumber *)number {
|
||||||
@ -139,7 +139,7 @@ CMenu * createCMenu (jobject cPeerObjGlobal) {
|
|||||||
// We use an array here only to be able to get a return value
|
// We use an array here only to be able to get a return value
|
||||||
NSMutableArray *args = [[NSMutableArray alloc] initWithObjects:[NSValue valueWithBytes:&cPeerObjGlobal objCType:@encode(jobject)], nil];
|
NSMutableArray *args = [[NSMutableArray alloc] initWithObjects:[NSValue valueWithBytes:&cPeerObjGlobal objCType:@encode(jobject)], nil];
|
||||||
|
|
||||||
[ThreadUtilities performOnMainThread:@selector(_create_OnAppKitThread:) onObject:[CMenu alloc] withObject:args waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(_create_OnAppKitThread:) on:[CMenu alloc] withObject:args waitUntilDone:YES];
|
||||||
|
|
||||||
aCMenu = (CMenu *)[args objectAtIndex: 0];
|
aCMenu = (CMenu *)[args objectAtIndex: 0];
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ static BOOL sSetupHelpMenu = NO;
|
|||||||
|
|
||||||
if (self == sActiveMenuBar) {
|
if (self == sActiveMenuBar) {
|
||||||
NSArray *args = [[NSArray alloc] initWithObjects:theMenu, [NSNumber numberWithInt:-1], nil];
|
NSArray *args = [[NSArray alloc] initWithObjects:theMenu, [NSNumber numberWithInt:-1], nil];
|
||||||
[ThreadUtilities performOnMainThread:@selector(nativeAddMenuAtIndex_OnAppKitThread:) onObject:self withObject:args waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(nativeAddMenuAtIndex_OnAppKitThread:) on:self withObject:args waitUntilDone:YES];
|
||||||
[args release];
|
[args release];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -216,7 +216,7 @@ static BOOL sSetupHelpMenu = NO;
|
|||||||
|
|
||||||
if (self == sActiveMenuBar) {
|
if (self == sActiveMenuBar) {
|
||||||
NSArray *args = [[NSArray alloc] initWithObjects:theMenu, [NSNumber numberWithInt:index], nil];
|
NSArray *args = [[NSArray alloc] initWithObjects:theMenu, [NSNumber numberWithInt:index], nil];
|
||||||
[ThreadUtilities performOnMainThread:@selector(nativeAddMenuAtIndex_OnAppKitThread:) onObject:self withObject:args waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(nativeAddMenuAtIndex_OnAppKitThread:) on:self withObject:args waitUntilDone:YES];
|
||||||
[args release];
|
[args release];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -286,7 +286,7 @@ static BOOL sSetupHelpMenu = NO;
|
|||||||
|
|
||||||
- (void) javaDeleteMenu: (jint)index {
|
- (void) javaDeleteMenu: (jint)index {
|
||||||
if (self == sActiveMenuBar) {
|
if (self == sActiveMenuBar) {
|
||||||
[ThreadUtilities performOnMainThread:@selector(nativeDeleteMenu_OnAppKitThread:) onObject:self withObject:[NSNumber numberWithInt:index] waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(nativeDeleteMenu_OnAppKitThread:) on:self withObject:[NSNumber numberWithInt:index] waitUntilDone:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
@synchronized(self) {
|
@synchronized(self) {
|
||||||
@ -388,7 +388,7 @@ Java_sun_lwawt_macosx_CMenuBar_nativeCreateMenuBar
|
|||||||
// We use an array here only to be able to get a return value
|
// We use an array here only to be able to get a return value
|
||||||
NSMutableArray *args = [[NSMutableArray alloc] initWithObjects:[NSValue valueWithBytes:&cPeerObjGlobal objCType:@encode(jobject)], nil];
|
NSMutableArray *args = [[NSMutableArray alloc] initWithObjects:[NSValue valueWithBytes:&cPeerObjGlobal objCType:@encode(jobject)], nil];
|
||||||
|
|
||||||
[ThreadUtilities performOnMainThread:@selector(_create_OnAppKitThread:) onObject:[CMenuBar alloc] withObject:args waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(_create_OnAppKitThread:) on:[CMenuBar alloc] withObject:args waitUntilDone:YES];
|
||||||
|
|
||||||
aCMenuBar = (CMenuBar *)[args objectAtIndex: 0];
|
aCMenuBar = (CMenuBar *)[args objectAtIndex: 0];
|
||||||
|
|
||||||
|
@ -386,7 +386,7 @@ JNF_COCOA_ENTER(env);
|
|||||||
args = [[NSMutableArray alloc] initWithObjects:[NSValue valueWithBytes:&cPeerObjGlobal objCType:@encode(jobject)], [NSNumber numberWithBool:NO], nil];
|
args = [[NSMutableArray alloc] initWithObjects:[NSValue valueWithBytes:&cPeerObjGlobal objCType:@encode(jobject)], [NSNumber numberWithBool:NO], nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
[ThreadUtilities performOnMainThread:@selector(_createMenuItem_OnAppKitThread:) onObject:[CMenuItem alloc] withObject:args waitUntilDone:YES awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(_createMenuItem_OnAppKitThread:) on:[CMenuItem alloc] withObject:args waitUntilDone:YES];
|
||||||
|
|
||||||
aCMenuItem = (CMenuItem *)[args objectAtIndex: 0];
|
aCMenuItem = (CMenuItem *)[args objectAtIndex: 0];
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ Java_sun_lwawt_macosx_CRobot_initRobot
|
|||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_sun_lwawt_macosx_CRobot_mouseEvent
|
Java_sun_lwawt_macosx_CRobot_mouseEvent
|
||||||
(JNIEnv *env, jobject peer,
|
(JNIEnv *env, jobject peer,
|
||||||
jint screenIndex, jint mouseLastX, jint mouseLastY, jint buttonsState,
|
jint displayID, jint mouseLastX, jint mouseLastY, jint buttonsState,
|
||||||
jboolean isButtonsDownState, jboolean isMouseMove)
|
jboolean isButtonsDownState, jboolean isMouseMove)
|
||||||
{
|
{
|
||||||
JNF_COCOA_ENTER(env);
|
JNF_COCOA_ENTER(env);
|
||||||
@ -149,8 +149,6 @@ Java_sun_lwawt_macosx_CRobot_mouseEvent
|
|||||||
|
|
||||||
CGError err = kCGErrorSuccess;
|
CGError err = kCGErrorSuccess;
|
||||||
|
|
||||||
CGDirectDisplayID displayID =
|
|
||||||
FindCGDirectDisplayIDForScreenIndex(screenIndex);
|
|
||||||
CGRect globalDeviceBounds = CGDisplayBounds(displayID);
|
CGRect globalDeviceBounds = CGDisplayBounds(displayID);
|
||||||
|
|
||||||
// Set unknown mouse location, if needed.
|
// Set unknown mouse location, if needed.
|
||||||
|
@ -1113,18 +1113,10 @@ static NSObject *sAttributeNamesLOCK = nil;
|
|||||||
JNIEnv *env = [ThreadUtilities getJNIEnv];
|
JNIEnv *env = [ThreadUtilities getJNIEnv];
|
||||||
id value = nil;
|
id value = nil;
|
||||||
|
|
||||||
// This code frequently gets called indirectly by Java when VoiceOver is active.
|
jobject focused = JNFCallStaticObjectMethod(env, jm_getFocusOwner, fComponent); // AWT_THREADING Safe (AWTRunLoop)
|
||||||
// Basically, we just have to know when we going to be a bad state, and do something "special".
|
if (focused != NULL) {
|
||||||
// Note that while NSApplication isn't technically correct, we post a focus changed notification
|
if (JNFIsInstanceOf(env, focused, &sjc_Accessible)) {
|
||||||
// (which will call this method, but with the correct codepath) shortly afterwards. See +postFocusChanged.
|
value = [JavaComponentAccessibility createWithAccessible:focused withEnv:env withView:fView];
|
||||||
if (sInPerformFromJava) {
|
|
||||||
return [NSApplication sharedApplication];
|
|
||||||
} else {
|
|
||||||
jobject focused = JNFCallStaticObjectMethod(env, jm_getFocusOwner, fComponent); // AWT_THREADING Safe (AWTRunLoop)
|
|
||||||
if (focused != NULL) {
|
|
||||||
if (JNFIsInstanceOf(env, focused, &sjc_Accessible)) {
|
|
||||||
value = [JavaComponentAccessibility createWithAccessible:focused withEnv:env withView:fView];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1149,7 +1141,7 @@ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CAccessibility_focusChanged
|
|||||||
{
|
{
|
||||||
|
|
||||||
JNF_COCOA_ENTER(env);
|
JNF_COCOA_ENTER(env);
|
||||||
[ThreadUtilities performOnMainThread:@selector(postFocusChanged:) onObject:[JavaComponentAccessibility class] withObject:nil waitUntilDone:NO awtMode:NO];
|
[ThreadUtilities performOnMainThread:@selector(postFocusChanged:) on:[JavaComponentAccessibility class] withObject:nil waitUntilDone:NO];
|
||||||
JNF_COCOA_EXIT(env);
|
JNF_COCOA_EXIT(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1164,7 +1156,7 @@ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CAccessible_valueChanged
|
|||||||
(JNIEnv *env, jclass jklass, jlong element)
|
(JNIEnv *env, jclass jklass, jlong element)
|
||||||
{
|
{
|
||||||
JNF_COCOA_ENTER(env);
|
JNF_COCOA_ENTER(env);
|
||||||
[ThreadUtilities performOnMainThread:@selector(postValueChanged) onObject:(JavaComponentAccessibility *)jlong_to_ptr(element) withObject:nil waitUntilDone:NO awtMode:NO];
|
[ThreadUtilities performOnMainThread:@selector(postValueChanged) on:(JavaComponentAccessibility *)jlong_to_ptr(element) withObject:nil waitUntilDone:NO];
|
||||||
JNF_COCOA_EXIT(env);
|
JNF_COCOA_EXIT(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1177,7 +1169,7 @@ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CAccessible_selectionChanged
|
|||||||
(JNIEnv *env, jclass jklass, jlong element)
|
(JNIEnv *env, jclass jklass, jlong element)
|
||||||
{
|
{
|
||||||
JNF_COCOA_ENTER(env);
|
JNF_COCOA_ENTER(env);
|
||||||
[ThreadUtilities performOnMainThread:@selector(postSelectionChanged) onObject:(JavaComponentAccessibility *)jlong_to_ptr(element) withObject:nil waitUntilDone:NO awtMode:NO];
|
[ThreadUtilities performOnMainThread:@selector(postSelectionChanged) on:(JavaComponentAccessibility *)jlong_to_ptr(element) withObject:nil waitUntilDone:NO];
|
||||||
JNF_COCOA_EXIT(env);
|
JNF_COCOA_EXIT(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1191,7 +1183,7 @@ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CAccessible_unregisterFromCocoaAXSy
|
|||||||
(JNIEnv *env, jclass jklass, jlong element)
|
(JNIEnv *env, jclass jklass, jlong element)
|
||||||
{
|
{
|
||||||
JNF_COCOA_ENTER(env);
|
JNF_COCOA_ENTER(env);
|
||||||
[ThreadUtilities performOnMainThread:@selector(unregisterFromCocoaAXSystem) onObject:(JavaComponentAccessibility *)jlong_to_ptr(element) withObject:nil waitUntilDone:NO awtMode:NO];
|
[ThreadUtilities performOnMainThread:@selector(unregisterFromCocoaAXSystem) on:(JavaComponentAccessibility *)jlong_to_ptr(element) withObject:nil waitUntilDone:NO];
|
||||||
JNF_COCOA_EXIT(env);
|
JNF_COCOA_EXIT(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,8 +44,6 @@ extern jint* gButtonDownMasks;
|
|||||||
+ (void) eventCountPlusPlus;
|
+ (void) eventCountPlusPlus;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
CGDirectDisplayID FindCGDirectDisplayIDForScreenIndex(jint screenIndex);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Utility Macros
|
* Utility Macros
|
||||||
*/
|
*/
|
||||||
|
@ -177,39 +177,6 @@ Java_sun_lwawt_macosx_LWCToolkit_beep
|
|||||||
NSBeep(); // produces both sound and visual flash, if configured in System Preferences
|
NSBeep(); // produces both sound and visual flash, if configured in System Preferences
|
||||||
}
|
}
|
||||||
|
|
||||||
CGDirectDisplayID
|
|
||||||
FindCGDirectDisplayIDForScreenIndex(jint screenIndex)
|
|
||||||
{
|
|
||||||
// most common case - just one monitor
|
|
||||||
CGDirectDisplayID screenID = CGMainDisplayID();
|
|
||||||
|
|
||||||
CGDisplayCount displayCount = 0;
|
|
||||||
CGGetOnlineDisplayList(0, NULL, &displayCount);
|
|
||||||
|
|
||||||
if ((displayCount > 1) &&
|
|
||||||
(screenIndex >= 0) &&
|
|
||||||
(screenIndex < (jint)displayCount))
|
|
||||||
{
|
|
||||||
if (displayCount < 10) {
|
|
||||||
// stack allocated optimization for less than 10 monitors
|
|
||||||
CGDirectDisplayID onlineDisplays[displayCount];
|
|
||||||
CGGetOnlineDisplayList(displayCount, onlineDisplays, &displayCount);
|
|
||||||
screenID = (CGDirectDisplayID)onlineDisplays[screenIndex];
|
|
||||||
} else {
|
|
||||||
CGDirectDisplayID *onlineDisplays =
|
|
||||||
malloc(displayCount*sizeof(CGDirectDisplayID));
|
|
||||||
if (onlineDisplays != NULL) {
|
|
||||||
CGGetOnlineDisplayList(displayCount, onlineDisplays,
|
|
||||||
&displayCount);
|
|
||||||
screenID = (CGDirectDisplayID)onlineDisplays[screenIndex];
|
|
||||||
free(onlineDisplays);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return screenID;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: sun_lwawt_macosx_LWCToolkit
|
* Class: sun_lwawt_macosx_LWCToolkit
|
||||||
* Method: initIDs
|
* Method: initIDs
|
||||||
@ -332,7 +299,7 @@ AWT_ASSERT_APPKIT_THREAD;
|
|||||||
* Signature: (JZZ)V
|
* Signature: (JZZ)V
|
||||||
*/
|
*/
|
||||||
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_doAWTRunLoop
|
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_doAWTRunLoop
|
||||||
(JNIEnv *env, jclass clz, jlong mediator, jboolean awtMode, jboolean detectDeadlocks)
|
(JNIEnv *env, jclass clz, jlong mediator, jboolean processEvents)
|
||||||
{
|
{
|
||||||
AWT_ASSERT_APPKIT_THREAD;
|
AWT_ASSERT_APPKIT_THREAD;
|
||||||
JNF_COCOA_ENTER(env);
|
JNF_COCOA_ENTER(env);
|
||||||
@ -341,26 +308,25 @@ JNF_COCOA_ENTER(env);
|
|||||||
|
|
||||||
if (mediatorObject == nil) return;
|
if (mediatorObject == nil) return;
|
||||||
|
|
||||||
if (!sInPerformFromJava || !detectDeadlocks) {
|
// Don't use acceptInputForMode because that doesn't setup autorelease pools properly
|
||||||
|
BOOL isRunning = true;
|
||||||
|
while (![mediatorObject shouldEndRunLoop] && isRunning) {
|
||||||
|
isRunning = [[NSRunLoop currentRunLoop] runMode:[JNFRunLoop javaRunLoopMode]
|
||||||
|
beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.010]];
|
||||||
|
if (processEvents) {
|
||||||
|
//We do not spin a runloop here as date is nil, so does not matter which mode to use
|
||||||
|
NSEvent *event;
|
||||||
|
if ((event = [NSApp nextEventMatchingMask:NSAnyEventMask
|
||||||
|
untilDate:nil
|
||||||
|
inMode:NSDefaultRunLoopMode
|
||||||
|
dequeue:YES]) != nil) {
|
||||||
|
[NSApp sendEvent:event];
|
||||||
|
}
|
||||||
|
|
||||||
NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
|
|
||||||
NSDate *distantFuture = [NSDate distantFuture];
|
|
||||||
NSString *mode = (awtMode) ? [JNFRunLoop javaRunLoopMode] : NSDefaultRunLoopMode;
|
|
||||||
|
|
||||||
BOOL isRunning = YES;
|
|
||||||
while (isRunning && ![mediatorObject shouldEndRunLoop]) {
|
|
||||||
// Don't use acceptInputForMode because that doesn't setup autorelease pools properly
|
|
||||||
isRunning = [currentRunLoop runMode:mode beforeDate:distantFuture];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
#ifndef PRODUCT_BUILD
|
|
||||||
if (sInPerformFromJava) {
|
|
||||||
NSLog(@"Apple AWT: Short-circuiting CToolkit.invokeAndWait trampoline deadlock!!!!!");
|
|
||||||
NSLog(@"\tPlease file a bug report with this message and a reproducible test case.");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
CFRelease(mediatorObject);
|
CFRelease(mediatorObject);
|
||||||
|
|
||||||
JNF_COCOA_EXIT(env);
|
JNF_COCOA_EXIT(env);
|
||||||
@ -379,7 +345,7 @@ JNF_COCOA_ENTER(env);
|
|||||||
|
|
||||||
AWTRunLoopObject* mediatorObject = (AWTRunLoopObject*)jlong_to_ptr(mediator);
|
AWTRunLoopObject* mediatorObject = (AWTRunLoopObject*)jlong_to_ptr(mediator);
|
||||||
|
|
||||||
[ThreadUtilities performOnMainThread:@selector(endRunLoop) onObject:mediatorObject withObject:nil waitUntilDone:NO awtMode:YES];
|
[ThreadUtilities performOnMainThread:@selector(endRunLoop) on:mediatorObject withObject:nil waitUntilDone:NO];
|
||||||
|
|
||||||
CFRelease(mediatorObject);
|
CFRelease(mediatorObject);
|
||||||
|
|
||||||
@ -463,20 +429,3 @@ Java_sun_font_FontManager_populateFontFileNameMap
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: sun_lwawt_macosx_LWCToolkit
|
|
||||||
* Method: executeNextAppKitEvent
|
|
||||||
* Signature: ()V
|
|
||||||
*/
|
|
||||||
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_executeNextAppKitEvent
|
|
||||||
(JNIEnv *env, jclass cls)
|
|
||||||
{
|
|
||||||
// Simply get the next event in native loop and pass it to execution
|
|
||||||
// We'll be called repeatedly so there's no need to block here
|
|
||||||
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
|
|
||||||
NSApplication * app = [NSApplication sharedApplication];
|
|
||||||
NSEvent * event = [app nextEventMatchingMask: 0xFFFFFFFF untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES];
|
|
||||||
if (event != nil) {
|
|
||||||
[app sendEvent: event];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -27,11 +27,13 @@
|
|||||||
#import "java_awt_geom_PathIterator.h"
|
#import "java_awt_geom_PathIterator.h"
|
||||||
#import "sun_awt_SunHints.h"
|
#import "sun_awt_SunHints.h"
|
||||||
#import "sun_font_CStrike.h"
|
#import "sun_font_CStrike.h"
|
||||||
|
#import "sun_font_CStrikeDisposer.h"
|
||||||
#import "CGGlyphImages.h"
|
#import "CGGlyphImages.h"
|
||||||
#import "CGGlyphOutlines.h"
|
#import "CGGlyphOutlines.h"
|
||||||
#import "AWTStrike.h"
|
#import "AWTStrike.h"
|
||||||
#import "CoreTextSupport.h"
|
#import "CoreTextSupport.h"
|
||||||
//#import "jni_util.h"
|
//#import "jni_util.h"
|
||||||
|
#include "fontscalerdefs.h"
|
||||||
|
|
||||||
/* Use THIS_FILE when it is available. */
|
/* Use THIS_FILE when it is available. */
|
||||||
#ifndef THIS_FILE
|
#ifndef THIS_FILE
|
||||||
@ -423,3 +425,19 @@ JNF_COCOA_EXIT(env);
|
|||||||
|
|
||||||
return metrics;
|
return metrics;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void AccelGlyphCache_RemoveAllInfos(GlyphInfo* glyph);
|
||||||
|
/*
|
||||||
|
* Class: sun_font_CStrikeDisposer
|
||||||
|
* Method: removeGlyphInfoFromCache
|
||||||
|
* Signature: (J)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_sun_font_CStrikeDisposer_removeGlyphInfoFromCache
|
||||||
|
(JNIEnv *env, jclass cls, jlong glyphInfo)
|
||||||
|
{
|
||||||
|
JNF_COCOA_ENTER(env);
|
||||||
|
|
||||||
|
AccelGlyphCache_RemoveAllCellInfos((GlyphInfo*)jlong_to_ptr(glyphInfo));
|
||||||
|
|
||||||
|
JNF_COCOA_EXIT(env);
|
||||||
|
}
|
||||||
|
@ -192,12 +192,12 @@ Java_sun_java2d_opengl_CGLGraphicsConfig_initCGL
|
|||||||
JNIEXPORT jlong JNICALL
|
JNIEXPORT jlong JNICALL
|
||||||
Java_sun_java2d_opengl_CGLGraphicsConfig_getCGLConfigInfo
|
Java_sun_java2d_opengl_CGLGraphicsConfig_getCGLConfigInfo
|
||||||
(JNIEnv *env, jclass cglgc,
|
(JNIEnv *env, jclass cglgc,
|
||||||
jint screennum, jint pixfmt, jint swapInterval)
|
jint displayID, jint pixfmt, jint swapInterval)
|
||||||
{
|
{
|
||||||
jlong ret = 0L;
|
jlong ret = 0L;
|
||||||
JNF_COCOA_ENTER(env);
|
JNF_COCOA_ENTER(env);
|
||||||
NSMutableArray * retArray = [NSMutableArray arrayWithCapacity:3];
|
NSMutableArray * retArray = [NSMutableArray arrayWithCapacity:3];
|
||||||
[retArray addObject: [NSNumber numberWithInt: (int)screennum]];
|
[retArray addObject: [NSNumber numberWithInt: (int)displayID]];
|
||||||
[retArray addObject: [NSNumber numberWithInt: (int)pixfmt]];
|
[retArray addObject: [NSNumber numberWithInt: (int)pixfmt]];
|
||||||
[retArray addObject: [NSNumber numberWithInt: (int)swapInterval]];
|
[retArray addObject: [NSNumber numberWithInt: (int)swapInterval]];
|
||||||
if ([NSThread isMainThread]) {
|
if ([NSThread isMainThread]) {
|
||||||
@ -217,7 +217,7 @@ Java_sun_java2d_opengl_CGLGraphicsConfig_getCGLConfigInfo
|
|||||||
+ (void) _getCGLConfigInfo: (NSMutableArray *)argValue {
|
+ (void) _getCGLConfigInfo: (NSMutableArray *)argValue {
|
||||||
AWT_ASSERT_APPKIT_THREAD;
|
AWT_ASSERT_APPKIT_THREAD;
|
||||||
|
|
||||||
jint screennum = (jint)[(NSNumber *)[argValue objectAtIndex: 0] intValue];
|
jint displayID = (jint)[(NSNumber *)[argValue objectAtIndex: 0] intValue];
|
||||||
jint pixfmt = (jint)[(NSNumber *)[argValue objectAtIndex: 1] intValue];
|
jint pixfmt = (jint)[(NSNumber *)[argValue objectAtIndex: 1] intValue];
|
||||||
jint swapInterval = (jint)[(NSNumber *)[argValue objectAtIndex: 2] intValue];
|
jint swapInterval = (jint)[(NSNumber *)[argValue objectAtIndex: 2] intValue];
|
||||||
JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
|
JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
|
||||||
@ -230,16 +230,11 @@ Java_sun_java2d_opengl_CGLGraphicsConfig_getCGLConfigInfo
|
|||||||
CGOpenGLDisplayMask glMask = (CGOpenGLDisplayMask)pixfmt;
|
CGOpenGLDisplayMask glMask = (CGOpenGLDisplayMask)pixfmt;
|
||||||
if (sharedContext == NULL) {
|
if (sharedContext == NULL) {
|
||||||
if (glMask == 0) {
|
if (glMask == 0) {
|
||||||
CGDirectDisplayID id =
|
glMask = CGDisplayIDToOpenGLDisplayMask(displayID);
|
||||||
FindCGDirectDisplayIDForScreenIndex(screennum);
|
|
||||||
glMask = CGDisplayIDToOpenGLDisplayMask(id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NSOpenGLPixelFormatAttribute attrs[] = {
|
NSOpenGLPixelFormatAttribute attrs[] = {
|
||||||
NSOpenGLPFAClosestPolicy,
|
NSOpenGLPFAClosestPolicy,
|
||||||
NSOpenGLPFANoRecovery,
|
|
||||||
NSOpenGLPFAAccelerated,
|
|
||||||
NSOpenGLPFAFullScreen,
|
|
||||||
NSOpenGLPFAWindow,
|
NSOpenGLPFAWindow,
|
||||||
NSOpenGLPFAPixelBuffer,
|
NSOpenGLPFAPixelBuffer,
|
||||||
NSOpenGLPFADoubleBuffer,
|
NSOpenGLPFADoubleBuffer,
|
||||||
@ -412,7 +407,7 @@ Java_sun_java2d_opengl_CGLGraphicsConfig_getCGLConfigInfo
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
memset(cglinfo, 0, sizeof(CGLGraphicsConfigInfo));
|
memset(cglinfo, 0, sizeof(CGLGraphicsConfigInfo));
|
||||||
cglinfo->screen = screennum;
|
cglinfo->screen = displayID;
|
||||||
cglinfo->pixfmt = sharedPixelFormat;
|
cglinfo->pixfmt = sharedPixelFormat;
|
||||||
cglinfo->context = oglc;
|
cglinfo->context = oglc;
|
||||||
|
|
||||||
@ -422,17 +417,6 @@ Java_sun_java2d_opengl_CGLGraphicsConfig_getCGLConfigInfo
|
|||||||
}
|
}
|
||||||
@end //GraphicsConfigUtil
|
@end //GraphicsConfigUtil
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL
|
|
||||||
Java_sun_java2d_opengl_CGLGraphicsConfig_getDefaultPixFmt
|
|
||||||
(JNIEnv *env, jclass cglgc, jint screennum)
|
|
||||||
{
|
|
||||||
J2dTraceLn(J2D_TRACE_INFO, "CGLGraphicsConfig_getDefaultPixFmt");
|
|
||||||
|
|
||||||
CGDirectDisplayID id = FindCGDirectDisplayIDForScreenIndex(screennum);
|
|
||||||
return (jint)CGDisplayIDToOpenGLDisplayMask(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL
|
JNIEXPORT jint JNICALL
|
||||||
Java_sun_java2d_opengl_CGLGraphicsConfig_getOGLCapabilities
|
Java_sun_java2d_opengl_CGLGraphicsConfig_getOGLCapabilities
|
||||||
(JNIEnv *env, jclass cglgc, jlong configInfo)
|
(JNIEnv *env, jclass cglgc, jlong configInfo)
|
||||||
|
@ -122,19 +122,12 @@ do { \
|
|||||||
#endif /* AWT_THREAD_ASSERTS */
|
#endif /* AWT_THREAD_ASSERTS */
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
// This tracks if we are current inside of a performOnMainThread that is both waiting and in the AWTRunLoopMode
|
|
||||||
extern BOOL sInPerformFromJava;
|
|
||||||
|
|
||||||
// This is an empty Obj-C object just so that -performSelectorOnMainThread
|
|
||||||
// can be used, and to use the Obj-C +initialize feature.
|
|
||||||
__attribute__((visibility("default")))
|
__attribute__((visibility("default")))
|
||||||
@interface ThreadUtilities : NSObject { }
|
@interface ThreadUtilities { }
|
||||||
|
|
||||||
+ (JNIEnv*)getJNIEnv;
|
+ (JNIEnv*)getJNIEnv;
|
||||||
+ (JNIEnv*)getJNIEnvUncached;
|
+ (JNIEnv*)getJNIEnvUncached;
|
||||||
|
|
||||||
+ (void)performOnMainThread:(SEL)aSelector onObject:(id)target withObject:(id)arg waitUntilDone:(BOOL)wait awtMode:(BOOL)inAWT;
|
|
||||||
|
|
||||||
//Wrappers for the corresponding JNFRunLoop methods with a check for main thread
|
//Wrappers for the corresponding JNFRunLoop methods with a check for main thread
|
||||||
+ (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block;
|
+ (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block;
|
||||||
+ (void)performOnMainThread:(SEL)aSelector on:(id)target withObject:(id)arg waitUntilDone:(BOOL)wait;
|
+ (void)performOnMainThread:(SEL)aSelector on:(id)target withObject:(id)arg waitUntilDone:(BOOL)wait;
|
||||||
|
@ -34,85 +34,6 @@
|
|||||||
JavaVM *jvm = NULL;
|
JavaVM *jvm = NULL;
|
||||||
static JNIEnv *appKitEnv = NULL;
|
static JNIEnv *appKitEnv = NULL;
|
||||||
|
|
||||||
static NSArray *sPerformModes = nil;
|
|
||||||
static NSArray *sAWTPerformModes = nil;
|
|
||||||
|
|
||||||
static BOOL sLoggingEnabled = YES;
|
|
||||||
|
|
||||||
#ifdef AWT_THREAD_ASSERTS_ENV_ASSERT
|
|
||||||
int sAWTThreadAsserts = 0;
|
|
||||||
#endif /* AWT_THREAD_ASSERTS_ENV_ASSERT */
|
|
||||||
|
|
||||||
BOOL sInPerformFromJava = NO;
|
|
||||||
|
|
||||||
// This class is used so that performSelectorOnMainThread can be
|
|
||||||
// controlled a little more easily by us. It has 2 roles.
|
|
||||||
// The first is to set/unset a flag (sInPerformFromJava) that code can
|
|
||||||
// check to see if we are in a synchronous perform initiated by a java thread.
|
|
||||||
// The second is to implement the CocoaComponent backward compatibility mode.
|
|
||||||
@interface CPerformer : NSObject {
|
|
||||||
id fTarget;
|
|
||||||
SEL fSelector;
|
|
||||||
id fArg;
|
|
||||||
BOOL fWait;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (id) initWithTarget:(id)target selector:(SEL)selector arg:(id)arg wait:(BOOL)wait;
|
|
||||||
- (void) perform;
|
|
||||||
@end
|
|
||||||
|
|
||||||
|
|
||||||
@implementation CPerformer
|
|
||||||
|
|
||||||
- (id) initWithTarget:(id)target selector:(SEL)selector arg:(id)arg {
|
|
||||||
return [self initWithTarget:target selector:selector arg:arg wait:YES];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (id) initWithTarget:(id)target selector:(SEL)selector arg:(id)arg wait:(BOOL)wait {
|
|
||||||
self = [super init];
|
|
||||||
if (self != nil) {
|
|
||||||
fTarget = [target retain];
|
|
||||||
fSelector = selector;
|
|
||||||
fArg = [arg retain];
|
|
||||||
// Only set sInPerformFromJava if this is a synchronous perform
|
|
||||||
fWait = wait;
|
|
||||||
}
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) dealloc {
|
|
||||||
[fTarget release];
|
|
||||||
[fArg release];
|
|
||||||
[super dealloc];
|
|
||||||
}
|
|
||||||
//- (void)finalize { [super finalize]; }
|
|
||||||
|
|
||||||
- (void) perform {
|
|
||||||
AWT_ASSERT_APPKIT_THREAD;
|
|
||||||
|
|
||||||
// If this is the first time we're going from java thread -> appkit thread,
|
|
||||||
// set sInPerformFromJava for the duration of the invocation
|
|
||||||
BOOL nestedPerform = sInPerformFromJava;
|
|
||||||
if (fWait) {
|
|
||||||
sInPerformFromJava = YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Actually do the work (cheat to avoid a method call)
|
|
||||||
@try {
|
|
||||||
objc_msgSend(fTarget, fSelector, fArg);
|
|
||||||
//[fTarget performSelector:fSelector withObject:fArg];
|
|
||||||
} @catch (NSException *e) {
|
|
||||||
NSLog(@"*** CPerformer: ignoring exception '%@' raised during perform of selector '%@' on target '%@' with args '%@'", e, NSStringFromSelector(fSelector), fTarget, fArg);
|
|
||||||
} @finally {
|
|
||||||
// If we actually set sInPerformFromJava, unset it now
|
|
||||||
if (!nestedPerform && fWait) {
|
|
||||||
sInPerformFromJava = NO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@end
|
|
||||||
|
|
||||||
|
|
||||||
@implementation ThreadUtilities
|
@implementation ThreadUtilities
|
||||||
|
|
||||||
+ (JNIEnv*)getJNIEnv {
|
+ (JNIEnv*)getJNIEnv {
|
||||||
@ -129,36 +50,6 @@ AWT_ASSERT_APPKIT_THREAD;
|
|||||||
return env;
|
return env;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (void)initialize {
|
|
||||||
// Headless: BOTH
|
|
||||||
// Embedded: BOTH
|
|
||||||
// Multiple Calls: NO
|
|
||||||
// Caller: Obj-C class initialization
|
|
||||||
// Thread: ?
|
|
||||||
|
|
||||||
if (sPerformModes == nil) {
|
|
||||||
// Create list of Run Loop modes to perform on
|
|
||||||
// The default performSelector, with no mode argument, runs in Default,
|
|
||||||
// ModalPanel, and EventTracking modes
|
|
||||||
sPerformModes = [[NSArray alloc] initWithObjects:NSDefaultRunLoopMode, NSModalPanelRunLoopMode, nil];
|
|
||||||
sAWTPerformModes = [[NSArray alloc] initWithObjects:NSDefaultRunLoopMode, NSModalPanelRunLoopMode, NSEventTrackingRunLoopMode, [JNFRunLoop javaRunLoopMode], nil];
|
|
||||||
|
|
||||||
#ifdef AWT_THREAD_ASSERTS_ENV_ASSERT
|
|
||||||
sAWTThreadAsserts = (getenv("COCOA_AWT_DISABLE_THREAD_ASSERTS") == NULL);
|
|
||||||
#endif /* AWT_THREAD_ASSERTS_ENV_ASSERT */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// These methods can behave slightly differently than the normal
|
|
||||||
// performSelector... In particular, we define a special runloop mode
|
|
||||||
// (AWTRunLoopMode) so that we can "block" the main thread against the
|
|
||||||
// java event thread without deadlocking. See CToolkit.invokeAndWait.
|
|
||||||
+ (void)performOnMainThread:(SEL)aSelector onObject:(id)target withObject:(id)arg waitUntilDone:(BOOL)wait awtMode:(BOOL)inAWT {
|
|
||||||
CPerformer *performer = [[CPerformer alloc] initWithTarget:target selector:aSelector arg:arg wait:wait];
|
|
||||||
[performer performSelectorOnMainThread:@selector(perform) withObject:nil waitUntilDone:wait modes:((inAWT) ? sAWTPerformModes : sPerformModes)]; // AWT_THREADING Safe (cover method)
|
|
||||||
[performer release];
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block {
|
+ (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block {
|
||||||
if ([NSThread isMainThread] && wait == YES) {
|
if ([NSThread isMainThread] && wait == YES) {
|
||||||
block();
|
block();
|
||||||
|
@ -117,6 +117,9 @@ loadTransportLibrary(char *libdir, char *name)
|
|||||||
|
|
||||||
/* Construct library name (simple name or full path) */
|
/* Construct library name (simple name or full path) */
|
||||||
dbgsysBuildLibName(libname, sizeof(libname), plibdir, name);
|
dbgsysBuildLibName(libname, sizeof(libname), plibdir, name);
|
||||||
|
if (strlen(libname) == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* dlopen (unix) / LoadLibrary (windows) the transport library */
|
/* dlopen (unix) / LoadLibrary (windows) the transport library */
|
||||||
handle = dbgsysLoadLibrary(libname, buf, sizeof(buf));
|
handle = dbgsysLoadLibrary(libname, buf, sizeof(buf));
|
||||||
|
@ -66,7 +66,7 @@ int JLI_GetStdArgc();
|
|||||||
#include <io.h>
|
#include <io.h>
|
||||||
#define JLI_StrCaseCmp(p1, p2) stricmp((p1), (p2))
|
#define JLI_StrCaseCmp(p1, p2) stricmp((p1), (p2))
|
||||||
#define JLI_StrNCaseCmp(p1, p2, p3) strnicmp((p1), (p2), (p3))
|
#define JLI_StrNCaseCmp(p1, p2, p3) strnicmp((p1), (p2), (p3))
|
||||||
#define JLI_Snprintf _snprintf
|
int JLI_Snprintf(char *buffer, size_t size, const char *format, ...);
|
||||||
void JLI_CmdToArgs(char *cmdline);
|
void JLI_CmdToArgs(char *cmdline);
|
||||||
#define JLI_Lseek _lseeki64
|
#define JLI_Lseek _lseeki64
|
||||||
#else /* NIXES */
|
#else /* NIXES */
|
||||||
|
@ -569,9 +569,9 @@ JLI_ParseManifest(char *jarfile, manifest_info *info)
|
|||||||
#ifdef O_BINARY
|
#ifdef O_BINARY
|
||||||
| O_BINARY /* use binary mode on windows */
|
| O_BINARY /* use binary mode on windows */
|
||||||
#endif
|
#endif
|
||||||
)) == -1)
|
)) == -1) {
|
||||||
return (-1);
|
return (-1);
|
||||||
|
}
|
||||||
info->manifest_version = NULL;
|
info->manifest_version = NULL;
|
||||||
info->main_class = NULL;
|
info->main_class = NULL;
|
||||||
info->jre_version = NULL;
|
info->jre_version = NULL;
|
||||||
@ -618,15 +618,17 @@ JLI_JarUnpackFile(const char *jarfile, const char *filename, int *size) {
|
|||||||
zentry entry;
|
zentry entry;
|
||||||
void *data = NULL;
|
void *data = NULL;
|
||||||
|
|
||||||
fd = open(jarfile, O_RDONLY
|
if ((fd = open(jarfile, O_RDONLY
|
||||||
#ifdef O_LARGEFILE
|
#ifdef O_LARGEFILE
|
||||||
| O_LARGEFILE /* large file mode */
|
| O_LARGEFILE /* large file mode */
|
||||||
#endif
|
#endif
|
||||||
#ifdef O_BINARY
|
#ifdef O_BINARY
|
||||||
| O_BINARY /* use binary mode on windows */
|
| O_BINARY /* use binary mode on windows */
|
||||||
#endif
|
#endif
|
||||||
);
|
)) == -1) {
|
||||||
if (fd != -1 && find_file(fd, &entry, filename) == 0) {
|
return NULL;
|
||||||
|
}
|
||||||
|
if (find_file(fd, &entry, filename) == 0) {
|
||||||
data = inflate_file(fd, &entry, size);
|
data = inflate_file(fd, &entry, size);
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
@ -671,8 +673,9 @@ JLI_ManifestIterate(const char *jarfile, attribute_closure ac, void *user_data)
|
|||||||
#ifdef O_BINARY
|
#ifdef O_BINARY
|
||||||
| O_BINARY /* use binary mode on windows */
|
| O_BINARY /* use binary mode on windows */
|
||||||
#endif
|
#endif
|
||||||
)) == -1)
|
)) == -1) {
|
||||||
return (-1);
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
if (rc = find_file(fd, &entry, manifest_name) != 0) {
|
if (rc = find_file(fd, &entry, manifest_name) != 0) {
|
||||||
close(fd);
|
close(fd);
|
||||||
|
@ -66,11 +66,14 @@ public final class MethodFinder extends AbstractFinder<Method> {
|
|||||||
Signature signature = new Signature(type, name, args);
|
Signature signature = new Signature(type, name, args);
|
||||||
|
|
||||||
Method method = CACHE.get(signature);
|
Method method = CACHE.get(signature);
|
||||||
if (method != null) {
|
boolean cached = method != null;
|
||||||
|
if (cached && isPackageAccessible(method.getDeclaringClass())) {
|
||||||
return method;
|
return method;
|
||||||
}
|
}
|
||||||
method = findAccessibleMethod(new MethodFinder(name, args).find(type.getMethods()));
|
method = findAccessibleMethod(new MethodFinder(name, args).find(type.getMethods()));
|
||||||
CACHE.put(signature, method);
|
if (!cached) {
|
||||||
|
CACHE.put(signature, method);
|
||||||
|
}
|
||||||
return method;
|
return method;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,6 +41,8 @@ import javax.crypto.ShortBufferException;
|
|||||||
import javax.crypto.SecretKey;
|
import javax.crypto.SecretKey;
|
||||||
import javax.crypto.spec.*;
|
import javax.crypto.spec.*;
|
||||||
|
|
||||||
|
import sun.security.util.KeyUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class implements the Diffie-Hellman key agreement protocol between
|
* This class implements the Diffie-Hellman key agreement protocol between
|
||||||
* any number of parties.
|
* any number of parties.
|
||||||
@ -200,6 +202,9 @@ extends KeyAgreementSpi {
|
|||||||
throw new InvalidKeyException("Incompatible parameters");
|
throw new InvalidKeyException("Incompatible parameters");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// validate the Diffie-Hellman public key
|
||||||
|
KeyUtil.validate(dhPubKey);
|
||||||
|
|
||||||
// store the y value
|
// store the y value
|
||||||
this.y = dhPubKey.getY();
|
this.y = dhPubKey.getY();
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ class Attribute implements Comparable<Attribute> {
|
|||||||
define(sd, ATTR_CONTEXT_METHOD, "Synthetic", "");
|
define(sd, ATTR_CONTEXT_METHOD, "Synthetic", "");
|
||||||
define(sd, ATTR_CONTEXT_METHOD, "Deprecated", "");
|
define(sd, ATTR_CONTEXT_METHOD, "Deprecated", "");
|
||||||
define(sd, ATTR_CONTEXT_METHOD, "Exceptions", "NH[RCH]");
|
define(sd, ATTR_CONTEXT_METHOD, "Exceptions", "NH[RCH]");
|
||||||
define(sd, ATTR_CONTEXT_METHOD, "MethodParameters", "NB[RUNHI]");
|
define(sd, ATTR_CONTEXT_METHOD, "MethodParameters", "NB[RUNHFH]");
|
||||||
//define(sd, ATTR_CONTEXT_METHOD, "Code", "HHNI[B]NH[PHPOHPOHRCNH]NH[RUHNI[B]]");
|
//define(sd, ATTR_CONTEXT_METHOD, "Code", "HHNI[B]NH[PHPOHPOHRCNH]NH[RUHNI[B]]");
|
||||||
|
|
||||||
define(sd, ATTR_CONTEXT_CODE, "StackMapTable",
|
define(sd, ATTR_CONTEXT_CODE, "StackMapTable",
|
||||||
|
@ -1000,7 +1000,6 @@ class BandStructure {
|
|||||||
|
|
||||||
/** Write a constant pool reference. */
|
/** Write a constant pool reference. */
|
||||||
public void putRef(Entry e) {
|
public void putRef(Entry e) {
|
||||||
assert(index != null);
|
|
||||||
addValue(encodeRefOrNull(e, index));
|
addValue(encodeRefOrNull(e, index));
|
||||||
}
|
}
|
||||||
public void putRef(Entry e, Index index) {
|
public void putRef(Entry e, Index index) {
|
||||||
@ -1052,6 +1051,8 @@ class BandStructure {
|
|||||||
|
|
||||||
|
|
||||||
int encodeRef(Entry e, Index ix) {
|
int encodeRef(Entry e, Index ix) {
|
||||||
|
if (ix == null)
|
||||||
|
throw new RuntimeException("null index for " + e.stringValue());
|
||||||
int coding = ix.indexOf(e);
|
int coding = ix.indexOf(e);
|
||||||
if (verbose > 2)
|
if (verbose > 2)
|
||||||
Utils.log.fine("putRef "+coding+" => "+e);
|
Utils.log.fine("putRef "+coding+" => "+e);
|
||||||
@ -1505,7 +1506,7 @@ class BandStructure {
|
|||||||
// band for predefine method parameters
|
// band for predefine method parameters
|
||||||
IntBand method_MethodParameters_NB = method_attr_bands.newIntBand("method_MethodParameters_NB", BYTE1);
|
IntBand method_MethodParameters_NB = method_attr_bands.newIntBand("method_MethodParameters_NB", BYTE1);
|
||||||
CPRefBand method_MethodParameters_name_RUN = method_attr_bands.newCPRefBand("method_MethodParameters_name_RUN", UNSIGNED5, CONSTANT_Utf8, NULL_IS_OK);
|
CPRefBand method_MethodParameters_name_RUN = method_attr_bands.newCPRefBand("method_MethodParameters_name_RUN", UNSIGNED5, CONSTANT_Utf8, NULL_IS_OK);
|
||||||
IntBand method_MethodParameters_flag_I = method_attr_bands.newIntBand("method_MethodParameters_flag_I");
|
IntBand method_MethodParameters_flag_FH = method_attr_bands.newIntBand("method_MethodParameters_flag_FH");
|
||||||
|
|
||||||
MultiBand class_attr_bands = class_bands.newMultiBand("(class_attr_bands)", UNSIGNED5);
|
MultiBand class_attr_bands = class_bands.newMultiBand("(class_attr_bands)", UNSIGNED5);
|
||||||
IntBand class_flags_hi = class_attr_bands.newIntBand("class_flags_hi");
|
IntBand class_flags_hi = class_attr_bands.newIntBand("class_flags_hi");
|
||||||
@ -1776,9 +1777,9 @@ class BandStructure {
|
|||||||
new Band[]{
|
new Band[]{
|
||||||
method_MethodParameters_NB,
|
method_MethodParameters_NB,
|
||||||
method_MethodParameters_name_RUN,
|
method_MethodParameters_name_RUN,
|
||||||
method_MethodParameters_flag_I
|
method_MethodParameters_flag_FH
|
||||||
},
|
},
|
||||||
"MethodParameters", "NB[RUNHI]");
|
"MethodParameters", "NB[RUNHFH]");
|
||||||
assert(attrCodeEmpty == Package.attrCodeEmpty);
|
assert(attrCodeEmpty == Package.attrCodeEmpty);
|
||||||
predefineAttribute(X_ATTR_Signature, ATTR_CONTEXT_METHOD,
|
predefineAttribute(X_ATTR_Signature, ATTR_CONTEXT_METHOD,
|
||||||
new Band[] { method_Signature_RS },
|
new Band[] { method_Signature_RS },
|
||||||
|
@ -564,7 +564,7 @@ class ClassReader {
|
|||||||
code.bytes = new byte[readInt()];
|
code.bytes = new byte[readInt()];
|
||||||
in.readFully(code.bytes);
|
in.readFully(code.bytes);
|
||||||
Entry[] cpMap = cls.getCPMap();
|
Entry[] cpMap = cls.getCPMap();
|
||||||
Instruction.opcodeChecker(code.bytes, cpMap);
|
Instruction.opcodeChecker(code.bytes, cpMap, this.cls.version);
|
||||||
int nh = readUnsignedShort();
|
int nh = readUnsignedShort();
|
||||||
code.setHandlerCount(nh);
|
code.setHandlerCount(nh);
|
||||||
for (int i = 0; i < nh; i++) {
|
for (int i = 0; i < nh; i++) {
|
||||||
|
@ -207,6 +207,10 @@ class ConstantPool {
|
|||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final boolean tagEquals(int tag) {
|
||||||
|
return getTag() == tag;
|
||||||
|
}
|
||||||
|
|
||||||
public Entry getRef(int i) {
|
public Entry getRef(int i) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -1405,6 +1409,8 @@ class ConstantPool {
|
|||||||
|
|
||||||
/** Index of all CP entries of a given tag and class. */
|
/** Index of all CP entries of a given tag and class. */
|
||||||
public Index getMemberIndex(byte tag, ClassEntry classRef) {
|
public Index getMemberIndex(byte tag, ClassEntry classRef) {
|
||||||
|
if (classRef == null)
|
||||||
|
throw new RuntimeException("missing class reference for " + tagName(tag));
|
||||||
if (indexByTagAndClass == null)
|
if (indexByTagAndClass == null)
|
||||||
indexByTagAndClass = new Index[CONSTANT_Limit][];
|
indexByTagAndClass = new Index[CONSTANT_Limit][];
|
||||||
Index allClasses = getIndexByTag(CONSTANT_Class);
|
Index allClasses = getIndexByTag(CONSTANT_Class);
|
||||||
|
@ -479,4 +479,10 @@ class Constants {
|
|||||||
public final static int _qldc = _xldc_op+7;
|
public final static int _qldc = _xldc_op+7;
|
||||||
public final static int _qldc_w = _xldc_op+8;
|
public final static int _qldc_w = _xldc_op+8;
|
||||||
public final static int _xldc_limit = _xldc_op+9;
|
public final static int _xldc_limit = _xldc_op+9;
|
||||||
|
|
||||||
|
// handling of InterfaceMethodRef
|
||||||
|
public final static int _invoke_int_op = _xldc_limit;
|
||||||
|
public final static int _invokespecial_int = _invoke_int_op+0;
|
||||||
|
public final static int _invokestatic_int = _invoke_int_op+1;
|
||||||
|
public final static int _invoke_int_limit = _invoke_int_op+2;
|
||||||
}
|
}
|
||||||
|
@ -446,12 +446,14 @@ class Instruction {
|
|||||||
public static boolean isCPRefOp(int bc) {
|
public static boolean isCPRefOp(int bc) {
|
||||||
if (bc < BC_INDEX[0].length && BC_INDEX[0][bc] > 0) return true;
|
if (bc < BC_INDEX[0].length && BC_INDEX[0][bc] > 0) return true;
|
||||||
if (bc >= _xldc_op && bc < _xldc_limit) return true;
|
if (bc >= _xldc_op && bc < _xldc_limit) return true;
|
||||||
|
if (bc == _invokespecial_int || bc == _invokestatic_int) return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte getCPRefOpTag(int bc) {
|
public static byte getCPRefOpTag(int bc) {
|
||||||
if (bc < BC_INDEX[0].length && BC_INDEX[0][bc] > 0) return BC_TAG[0][bc];
|
if (bc < BC_INDEX[0].length && BC_INDEX[0][bc] > 0) return BC_TAG[0][bc];
|
||||||
if (bc >= _xldc_op && bc < _xldc_limit) return CONSTANT_LoadableValue;
|
if (bc >= _xldc_op && bc < _xldc_limit) return CONSTANT_LoadableValue;
|
||||||
|
if (bc == _invokestatic_int || bc == _invokespecial_int) return CONSTANT_InterfaceMethodref;
|
||||||
return CONSTANT_None;
|
return CONSTANT_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -647,7 +649,8 @@ class Instruction {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void opcodeChecker(byte[] code, ConstantPool.Entry[] cpMap) throws FormatException {
|
public static void opcodeChecker(byte[] code, ConstantPool.Entry[] cpMap,
|
||||||
|
Package.Version clsVersion) throws FormatException {
|
||||||
Instruction i = at(code, 0);
|
Instruction i = at(code, 0);
|
||||||
while (i != null) {
|
while (i != null) {
|
||||||
int opcode = i.getBC();
|
int opcode = i.getBC();
|
||||||
@ -658,10 +661,17 @@ class Instruction {
|
|||||||
ConstantPool.Entry e = i.getCPRef(cpMap);
|
ConstantPool.Entry e = i.getCPRef(cpMap);
|
||||||
if (e != null) {
|
if (e != null) {
|
||||||
byte tag = i.getCPTag();
|
byte tag = i.getCPTag();
|
||||||
if (!e.tagMatches(tag)) {
|
boolean match = e.tagMatches(tag);
|
||||||
String message = "illegal reference, expected type=" +
|
if (!match &&
|
||||||
ConstantPool.tagName(tag) + ": " +
|
(i.bc == _invokespecial || i.bc == _invokestatic) &&
|
||||||
i.toString(cpMap);
|
e.tagMatches(CONSTANT_InterfaceMethodref) &&
|
||||||
|
clsVersion.greaterThan(Constants.JAVA7_MAX_CLASS_VERSION)) {
|
||||||
|
match = true;
|
||||||
|
}
|
||||||
|
if (!match) {
|
||||||
|
String message = "illegal reference, expected type="
|
||||||
|
+ ConstantPool.tagName(tag) + ": "
|
||||||
|
+ i.toString(cpMap);
|
||||||
throw new FormatException(message);
|
throw new FormatException(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,6 +109,10 @@ class NativeUnpack {
|
|||||||
return (p200 == null)? null: p200._nunp;
|
return (p200 == null)? null: p200._nunp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private synchronized long getUnpackerPtr() {
|
||||||
|
return unpackerPtr;
|
||||||
|
}
|
||||||
|
|
||||||
// Callback from the unpacker engine to get more data.
|
// Callback from the unpacker engine to get more data.
|
||||||
private long readInputFn(ByteBuffer pbuf, long minlen) throws IOException {
|
private long readInputFn(ByteBuffer pbuf, long minlen) throws IOException {
|
||||||
if (in == null) return 0; // nothing is readable
|
if (in == null) return 0; // nothing is readable
|
||||||
|
@ -1521,7 +1521,7 @@ class PackageReader extends BandStructure {
|
|||||||
// *method_Exceptions_RC :UNSIGNED5 (cp_Class)
|
// *method_Exceptions_RC :UNSIGNED5 (cp_Class)
|
||||||
// *method_MethodParameters_NB: BYTE1
|
// *method_MethodParameters_NB: BYTE1
|
||||||
// *method_MethodParameters_RUN: UNSIGNED5 (cp_Utf8)
|
// *method_MethodParameters_RUN: UNSIGNED5 (cp_Utf8)
|
||||||
// *method_MethodParameters_I: UNSIGNED5 (flag)
|
// *method_MethodParameters_FH: UNSIGNED5 (flag)
|
||||||
//
|
//
|
||||||
// code_attr_bands:
|
// code_attr_bands:
|
||||||
// *code_flags :UNSIGNED5
|
// *code_flags :UNSIGNED5
|
||||||
@ -2256,6 +2256,12 @@ class PackageReader extends BandStructure {
|
|||||||
int origBC = bc;
|
int origBC = bc;
|
||||||
int size = 2;
|
int size = 2;
|
||||||
switch (bc) {
|
switch (bc) {
|
||||||
|
case _invokestatic_int:
|
||||||
|
origBC = _invokestatic;
|
||||||
|
break;
|
||||||
|
case _invokespecial_int:
|
||||||
|
origBC = _invokespecial;
|
||||||
|
break;
|
||||||
case _ildc:
|
case _ildc:
|
||||||
case _cldc:
|
case _cldc:
|
||||||
case _fldc:
|
case _fldc:
|
||||||
|
@ -1409,6 +1409,10 @@ class PackageWriter extends BandStructure {
|
|||||||
int bc = i.getBC();
|
int bc = i.getBC();
|
||||||
if (!(bc >= _first_linker_op && bc <= _last_linker_op)) return -1;
|
if (!(bc >= _first_linker_op && bc <= _last_linker_op)) return -1;
|
||||||
MemberEntry ref = (MemberEntry) i.getCPRef(curCPMap);
|
MemberEntry ref = (MemberEntry) i.getCPRef(curCPMap);
|
||||||
|
// do not optimize this case, simply fall back to regular coding
|
||||||
|
if ((bc == _invokespecial || bc == _invokestatic) &&
|
||||||
|
ref.tagEquals(CONSTANT_InterfaceMethodref))
|
||||||
|
return -1;
|
||||||
ClassEntry refClass = ref.classRef;
|
ClassEntry refClass = ref.classRef;
|
||||||
int self_bc = _self_linker_op + (bc - _first_linker_op);
|
int self_bc = _self_linker_op + (bc - _first_linker_op);
|
||||||
if (refClass == curClass.thisClass)
|
if (refClass == curClass.thisClass)
|
||||||
@ -1609,7 +1613,16 @@ class PackageWriter extends BandStructure {
|
|||||||
case CONSTANT_Fieldref:
|
case CONSTANT_Fieldref:
|
||||||
bc_which = bc_fieldref; break;
|
bc_which = bc_fieldref; break;
|
||||||
case CONSTANT_Methodref:
|
case CONSTANT_Methodref:
|
||||||
bc_which = bc_methodref; break;
|
if (ref.tagEquals(CONSTANT_InterfaceMethodref)) {
|
||||||
|
if (bc == _invokespecial)
|
||||||
|
vbc = _invokespecial_int;
|
||||||
|
if (bc == _invokestatic)
|
||||||
|
vbc = _invokestatic_int;
|
||||||
|
bc_which = bc_imethodref;
|
||||||
|
} else {
|
||||||
|
bc_which = bc_methodref;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case CONSTANT_InterfaceMethodref:
|
case CONSTANT_InterfaceMethodref:
|
||||||
bc_which = bc_imethodref; break;
|
bc_which = bc_imethodref; break;
|
||||||
case CONSTANT_InvokeDynamic:
|
case CONSTANT_InvokeDynamic:
|
||||||
|
@ -83,7 +83,7 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
|
|||||||
* @param out an OutputStream
|
* @param out an OutputStream
|
||||||
* @exception IOException if an error is encountered.
|
* @exception IOException if an error is encountered.
|
||||||
*/
|
*/
|
||||||
public void pack(JarFile in, OutputStream out) throws IOException {
|
public synchronized void pack(JarFile in, OutputStream out) throws IOException {
|
||||||
assert(Utils.currentInstance.get() == null);
|
assert(Utils.currentInstance.get() == null);
|
||||||
TimeZone tz = (props.getBoolean(Utils.PACK_DEFAULT_TIMEZONE))
|
TimeZone tz = (props.getBoolean(Utils.PACK_DEFAULT_TIMEZONE))
|
||||||
? null
|
? null
|
||||||
@ -118,7 +118,7 @@ public class PackerImpl extends TLGlobals implements Pack200.Packer {
|
|||||||
* @param out an OutputStream
|
* @param out an OutputStream
|
||||||
* @exception IOException if an error is encountered.
|
* @exception IOException if an error is encountered.
|
||||||
*/
|
*/
|
||||||
public void pack(JarInputStream in, OutputStream out) throws IOException {
|
public synchronized void pack(JarInputStream in, OutputStream out) throws IOException {
|
||||||
assert(Utils.currentInstance.get() == null);
|
assert(Utils.currentInstance.get() == null);
|
||||||
TimeZone tz = (props.getBoolean(Utils.PACK_DEFAULT_TIMEZONE)) ? null :
|
TimeZone tz = (props.getBoolean(Utils.PACK_DEFAULT_TIMEZONE)) ? null :
|
||||||
TimeZone.getDefault();
|
TimeZone.getDefault();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -106,7 +106,7 @@ public class UnpackerImpl extends TLGlobals implements Pack200.Unpacker {
|
|||||||
* @param out a JarOutputStream.
|
* @param out a JarOutputStream.
|
||||||
* @exception IOException if an error is encountered.
|
* @exception IOException if an error is encountered.
|
||||||
*/
|
*/
|
||||||
public void unpack(InputStream in, JarOutputStream out) throws IOException {
|
public synchronized void unpack(InputStream in, JarOutputStream out) throws IOException {
|
||||||
if (in == null) {
|
if (in == null) {
|
||||||
throw new NullPointerException("null input");
|
throw new NullPointerException("null input");
|
||||||
}
|
}
|
||||||
@ -151,7 +151,7 @@ public class UnpackerImpl extends TLGlobals implements Pack200.Unpacker {
|
|||||||
* @param out a JarOutputStream.
|
* @param out a JarOutputStream.
|
||||||
* @exception IOException if an error is encountered.
|
* @exception IOException if an error is encountered.
|
||||||
*/
|
*/
|
||||||
public void unpack(File in, JarOutputStream out) throws IOException {
|
public synchronized void unpack(File in, JarOutputStream out) throws IOException {
|
||||||
if (in == null) {
|
if (in == null) {
|
||||||
throw new NullPointerException("null input");
|
throw new NullPointerException("null input");
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,7 @@ import java.util.logging.Level;
|
|||||||
|
|
||||||
import javax.management.ObjectName;
|
import javax.management.ObjectName;
|
||||||
import javax.management.loading.PrivateClassLoader;
|
import javax.management.loading.PrivateClassLoader;
|
||||||
|
import sun.reflect.misc.ReflectUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class keeps the list of Class Loaders registered in the MBean Server.
|
* This class keeps the list of Class Loaders registered in the MBean Server.
|
||||||
@ -192,6 +193,7 @@ final class ClassLoaderRepositorySupport
|
|||||||
final ClassLoader without,
|
final ClassLoader without,
|
||||||
final ClassLoader stop)
|
final ClassLoader stop)
|
||||||
throws ClassNotFoundException {
|
throws ClassNotFoundException {
|
||||||
|
ReflectUtil.checkPackageAccess(className);
|
||||||
final int size = list.length;
|
final int size = list.length;
|
||||||
for(int i=0; i<size; i++) {
|
for(int i=0; i<size; i++) {
|
||||||
try {
|
try {
|
||||||
|
@ -54,6 +54,8 @@ import java.lang.reflect.Array;
|
|||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import javax.management.AttributeNotFoundException;
|
import javax.management.AttributeNotFoundException;
|
||||||
import javax.management.openmbean.CompositeData;
|
import javax.management.openmbean.CompositeData;
|
||||||
|
import sun.reflect.misc.MethodUtil;
|
||||||
|
import sun.reflect.misc.ReflectUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class contains the methods for performing all the tests needed to verify
|
* This class contains the methods for performing all the tests needed to verify
|
||||||
@ -526,8 +528,10 @@ public class Introspector {
|
|||||||
// to locate method
|
// to locate method
|
||||||
readMethod = SimpleIntrospector.getReadMethod(clazz, element);
|
readMethod = SimpleIntrospector.getReadMethod(clazz, element);
|
||||||
}
|
}
|
||||||
if (readMethod != null)
|
if (readMethod != null) {
|
||||||
return readMethod.invoke(complex);
|
ReflectUtil.checkPackageAccess(readMethod.getDeclaringClass());
|
||||||
|
return MethodUtil.invoke(readMethod, complex, new Class[0]);
|
||||||
|
}
|
||||||
|
|
||||||
throw new AttributeNotFoundException(
|
throw new AttributeNotFoundException(
|
||||||
"Could not find the getter method for the property " +
|
"Could not find the getter method for the property " +
|
||||||
|
@ -51,6 +51,7 @@ import javax.management.MBeanPermission;
|
|||||||
import javax.management.MBeanRegistrationException;
|
import javax.management.MBeanRegistrationException;
|
||||||
import javax.management.MBeanServer;
|
import javax.management.MBeanServer;
|
||||||
import javax.management.MBeanServerDelegate;
|
import javax.management.MBeanServerDelegate;
|
||||||
|
import javax.management.MBeanServerPermission;
|
||||||
import javax.management.NotCompliantMBeanException;
|
import javax.management.NotCompliantMBeanException;
|
||||||
import javax.management.NotificationFilter;
|
import javax.management.NotificationFilter;
|
||||||
import javax.management.NotificationListener;
|
import javax.management.NotificationListener;
|
||||||
@ -1409,6 +1410,8 @@ public final class JmxMBeanServer
|
|||||||
// Default is true.
|
// Default is true.
|
||||||
final boolean fairLock = DEFAULT_FAIR_LOCK_POLICY;
|
final boolean fairLock = DEFAULT_FAIR_LOCK_POLICY;
|
||||||
|
|
||||||
|
checkNewMBeanServerPermission();
|
||||||
|
|
||||||
// This constructor happens to disregard the value of the interceptors
|
// This constructor happens to disregard the value of the interceptors
|
||||||
// flag - that is, it always uses the default value - false.
|
// flag - that is, it always uses the default value - false.
|
||||||
// This is admitedly a bug, but we chose not to fix it for now
|
// This is admitedly a bug, but we chose not to fix it for now
|
||||||
@ -1494,4 +1497,11 @@ public final class JmxMBeanServer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void checkNewMBeanServerPermission() {
|
||||||
|
SecurityManager sm = System.getSecurityManager();
|
||||||
|
if (sm != null) {
|
||||||
|
Permission perm = new MBeanServerPermission("newMBeanServer");
|
||||||
|
sm.checkPermission(perm);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,11 +32,13 @@ import java.io.IOException;
|
|||||||
import java.io.ObjectInputStream;
|
import java.io.ObjectInputStream;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.security.Permission;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import javax.management.InstanceNotFoundException;
|
import javax.management.InstanceNotFoundException;
|
||||||
import javax.management.MBeanException;
|
import javax.management.MBeanException;
|
||||||
|
import javax.management.MBeanPermission;
|
||||||
import javax.management.NotCompliantMBeanException;
|
import javax.management.NotCompliantMBeanException;
|
||||||
import javax.management.ObjectName;
|
import javax.management.ObjectName;
|
||||||
import javax.management.OperationsException;
|
import javax.management.OperationsException;
|
||||||
@ -44,7 +46,7 @@ import javax.management.ReflectionException;
|
|||||||
import javax.management.RuntimeErrorException;
|
import javax.management.RuntimeErrorException;
|
||||||
import javax.management.RuntimeMBeanException;
|
import javax.management.RuntimeMBeanException;
|
||||||
import javax.management.RuntimeOperationsException;
|
import javax.management.RuntimeOperationsException;
|
||||||
|
import sun.reflect.misc.ConstructorUtil;
|
||||||
import sun.reflect.misc.ReflectUtil;
|
import sun.reflect.misc.ReflectUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -56,7 +58,6 @@ import sun.reflect.misc.ReflectUtil;
|
|||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
public class MBeanInstantiator {
|
public class MBeanInstantiator {
|
||||||
|
|
||||||
private final ModifiableClassLoaderRepository clr;
|
private final ModifiableClassLoaderRepository clr;
|
||||||
// private MetaData meta = null;
|
// private MetaData meta = null;
|
||||||
|
|
||||||
@ -88,6 +89,7 @@ public class MBeanInstantiator {
|
|||||||
"Exception occurred during object instantiation");
|
"Exception occurred during object instantiation");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReflectUtil.checkPackageAccess(className);
|
||||||
try {
|
try {
|
||||||
if (clr == null) throw new ClassNotFoundException(className);
|
if (clr == null) throw new ClassNotFoundException(className);
|
||||||
theClass = clr.loadClass(className);
|
theClass = clr.loadClass(className);
|
||||||
@ -162,6 +164,7 @@ public class MBeanInstantiator {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReflectUtil.checkPackageAccess(signature[i]);
|
||||||
// Ok we do not have a primitive type ! We need to build
|
// Ok we do not have a primitive type ! We need to build
|
||||||
// the signature of the method
|
// the signature of the method
|
||||||
//
|
//
|
||||||
@ -205,6 +208,9 @@ public class MBeanInstantiator {
|
|||||||
*/
|
*/
|
||||||
public Object instantiate(Class<?> theClass)
|
public Object instantiate(Class<?> theClass)
|
||||||
throws ReflectionException, MBeanException {
|
throws ReflectionException, MBeanException {
|
||||||
|
|
||||||
|
checkMBeanPermission(theClass, null, null, "instantiate");
|
||||||
|
|
||||||
Object moi;
|
Object moi;
|
||||||
|
|
||||||
|
|
||||||
@ -260,6 +266,9 @@ public class MBeanInstantiator {
|
|||||||
public Object instantiate(Class<?> theClass, Object params[],
|
public Object instantiate(Class<?> theClass, Object params[],
|
||||||
String signature[], ClassLoader loader)
|
String signature[], ClassLoader loader)
|
||||||
throws ReflectionException, MBeanException {
|
throws ReflectionException, MBeanException {
|
||||||
|
|
||||||
|
checkMBeanPermission(theClass, null, null, "instantiate");
|
||||||
|
|
||||||
// Instantiate the new object
|
// Instantiate the new object
|
||||||
|
|
||||||
// ------------------------------
|
// ------------------------------
|
||||||
@ -407,6 +416,8 @@ public class MBeanInstantiator {
|
|||||||
throw new RuntimeOperationsException(new
|
throw new RuntimeOperationsException(new
|
||||||
IllegalArgumentException(), "Null className passed in parameter");
|
IllegalArgumentException(), "Null className passed in parameter");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReflectUtil.checkPackageAccess(className);
|
||||||
Class<?> theClass;
|
Class<?> theClass;
|
||||||
if (loaderName == null) {
|
if (loaderName == null) {
|
||||||
// Load the class using the agent class loader
|
// Load the class using the agent class loader
|
||||||
@ -619,13 +630,13 @@ public class MBeanInstantiator {
|
|||||||
**/
|
**/
|
||||||
static Class<?> loadClass(String className, ClassLoader loader)
|
static Class<?> loadClass(String className, ClassLoader loader)
|
||||||
throws ReflectionException {
|
throws ReflectionException {
|
||||||
|
|
||||||
Class<?> theClass;
|
Class<?> theClass;
|
||||||
if (className == null) {
|
if (className == null) {
|
||||||
throw new RuntimeOperationsException(new
|
throw new RuntimeOperationsException(new
|
||||||
IllegalArgumentException("The class name cannot be null"),
|
IllegalArgumentException("The class name cannot be null"),
|
||||||
"Exception occurred during object instantiation");
|
"Exception occurred during object instantiation");
|
||||||
}
|
}
|
||||||
|
ReflectUtil.checkPackageAccess(className);
|
||||||
try {
|
try {
|
||||||
if (loader == null)
|
if (loader == null)
|
||||||
loader = MBeanInstantiator.class.getClassLoader();
|
loader = MBeanInstantiator.class.getClassLoader();
|
||||||
@ -676,6 +687,7 @@ public class MBeanInstantiator {
|
|||||||
// We need to load the class through the class
|
// We need to load the class through the class
|
||||||
// loader of the target object.
|
// loader of the target object.
|
||||||
//
|
//
|
||||||
|
ReflectUtil.checkPackageAccess(signature[i]);
|
||||||
tab[i] = Class.forName(signature[i], false, aLoader);
|
tab[i] = Class.forName(signature[i], false, aLoader);
|
||||||
}
|
}
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
@ -701,7 +713,7 @@ public class MBeanInstantiator {
|
|||||||
|
|
||||||
private Constructor<?> findConstructor(Class<?> c, Class<?>[] params) {
|
private Constructor<?> findConstructor(Class<?> c, Class<?>[] params) {
|
||||||
try {
|
try {
|
||||||
return c.getConstructor(params);
|
return ConstructorUtil.getConstructor(c, params);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -715,4 +727,18 @@ public class MBeanInstantiator {
|
|||||||
char.class, boolean.class})
|
char.class, boolean.class})
|
||||||
primitiveClasses.put(c.getName(), c);
|
primitiveClasses.put(c.getName(), c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void checkMBeanPermission(Class<?> clazz,
|
||||||
|
String member,
|
||||||
|
ObjectName objectName,
|
||||||
|
String actions) {
|
||||||
|
SecurityManager sm = System.getSecurityManager();
|
||||||
|
if (clazz != null && sm != null) {
|
||||||
|
Permission perm = new MBeanPermission(clazz.getName(),
|
||||||
|
member,
|
||||||
|
objectName,
|
||||||
|
actions);
|
||||||
|
sm.checkPermission(perm);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ import javax.management.NotCompliantMBeanException;
|
|||||||
import javax.management.ObjectName;
|
import javax.management.ObjectName;
|
||||||
import javax.management.ReflectionException;
|
import javax.management.ReflectionException;
|
||||||
import com.sun.jmx.mbeanserver.MXBeanMappingFactory;
|
import com.sun.jmx.mbeanserver.MXBeanMappingFactory;
|
||||||
|
import sun.reflect.misc.ReflectUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for MBeans. There is one instance of this class for
|
* Base class for MBeans. There is one instance of this class for
|
||||||
@ -131,6 +132,7 @@ public abstract class MBeanSupport<M>
|
|||||||
" is not an instance of " + mbeanInterfaceType.getName();
|
" is not an instance of " + mbeanInterfaceType.getName();
|
||||||
throw new NotCompliantMBeanException(msg);
|
throw new NotCompliantMBeanException(msg);
|
||||||
}
|
}
|
||||||
|
ReflectUtil.checkPackageAccess(mbeanInterfaceType);
|
||||||
this.resource = resource;
|
this.resource = resource;
|
||||||
MBeanIntrospector<M> introspector = getMBeanIntrospector();
|
MBeanIntrospector<M> introspector = getMBeanIntrospector();
|
||||||
this.perInterface = introspector.getPerInterface(mbeanInterfaceType);
|
this.perInterface = introspector.getPerInterface(mbeanInterfaceType);
|
||||||
|
@ -277,7 +277,7 @@ public class CheckboxMenuItem extends MenuItem implements ItemSelectable, Access
|
|||||||
* @since 1.4
|
* @since 1.4
|
||||||
*/
|
*/
|
||||||
public synchronized ItemListener[] getItemListeners() {
|
public synchronized ItemListener[] getItemListeners() {
|
||||||
return (ItemListener[])(getListeners(ItemListener.class));
|
return getListeners(ItemListener.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -163,11 +163,11 @@ public class Cursor implements java.io.Serializable {
|
|||||||
* hashtable, filesystem dir prefix, filename, and properties for custom cursors support
|
* hashtable, filesystem dir prefix, filename, and properties for custom cursors support
|
||||||
*/
|
*/
|
||||||
|
|
||||||
private static final Hashtable systemCustomCursors = new Hashtable(1);
|
private static final Hashtable<String,Cursor> systemCustomCursors = new Hashtable<>(1);
|
||||||
private static final String systemCustomCursorDirPrefix = initCursorDir();
|
private static final String systemCustomCursorDirPrefix = initCursorDir();
|
||||||
|
|
||||||
private static String initCursorDir() {
|
private static String initCursorDir() {
|
||||||
String jhome = (String) java.security.AccessController.doPrivileged(
|
String jhome = java.security.AccessController.doPrivileged(
|
||||||
new sun.security.action.GetPropertyAction("java.home"));
|
new sun.security.action.GetPropertyAction("java.home"));
|
||||||
return jhome +
|
return jhome +
|
||||||
File.separator + "lib" + File.separator + "images" +
|
File.separator + "lib" + File.separator + "images" +
|
||||||
@ -298,7 +298,7 @@ public class Cursor implements java.io.Serializable {
|
|||||||
static public Cursor getSystemCustomCursor(final String name)
|
static public Cursor getSystemCustomCursor(final String name)
|
||||||
throws AWTException, HeadlessException {
|
throws AWTException, HeadlessException {
|
||||||
GraphicsEnvironment.checkHeadless();
|
GraphicsEnvironment.checkHeadless();
|
||||||
Cursor cursor = (Cursor)systemCustomCursors.get(name);
|
Cursor cursor = systemCustomCursors.get(name);
|
||||||
|
|
||||||
if (cursor == null) {
|
if (cursor == null) {
|
||||||
synchronized(systemCustomCursors) {
|
synchronized(systemCustomCursors) {
|
||||||
@ -319,11 +319,11 @@ public class Cursor implements java.io.Serializable {
|
|||||||
final String fileName =
|
final String fileName =
|
||||||
systemCustomCursorProperties.getProperty(key);
|
systemCustomCursorProperties.getProperty(key);
|
||||||
|
|
||||||
String localized = (String)systemCustomCursorProperties.getProperty(prefix + DotNameSuffix);
|
String localized = systemCustomCursorProperties.getProperty(prefix + DotNameSuffix);
|
||||||
|
|
||||||
if (localized == null) localized = name;
|
if (localized == null) localized = name;
|
||||||
|
|
||||||
String hotspot = (String)systemCustomCursorProperties.getProperty(prefix + DotHotspotSuffix);
|
String hotspot = systemCustomCursorProperties.getProperty(prefix + DotHotspotSuffix);
|
||||||
|
|
||||||
if (hotspot == null)
|
if (hotspot == null)
|
||||||
throw new AWTException("no hotspot property defined for cursor: " + name);
|
throw new AWTException("no hotspot property defined for cursor: " + name);
|
||||||
@ -348,9 +348,9 @@ public class Cursor implements java.io.Serializable {
|
|||||||
final int fy = y;
|
final int fy = y;
|
||||||
final String flocalized = localized;
|
final String flocalized = localized;
|
||||||
|
|
||||||
cursor = (Cursor) java.security.AccessController.doPrivileged(
|
cursor = java.security.AccessController.<Cursor>doPrivileged(
|
||||||
new java.security.PrivilegedExceptionAction() {
|
new java.security.PrivilegedExceptionAction<Cursor>() {
|
||||||
public Object run() throws Exception {
|
public Cursor run() throws Exception {
|
||||||
Toolkit toolkit = Toolkit.getDefaultToolkit();
|
Toolkit toolkit = Toolkit.getDefaultToolkit();
|
||||||
Image image = toolkit.getImage(
|
Image image = toolkit.getImage(
|
||||||
systemCustomCursorDirPrefix + fileName);
|
systemCustomCursorDirPrefix + fileName);
|
||||||
@ -447,8 +447,8 @@ public class Cursor implements java.io.Serializable {
|
|||||||
systemCustomCursorProperties = new Properties();
|
systemCustomCursorProperties = new Properties();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
AccessController.doPrivileged(
|
AccessController.<Object>doPrivileged(
|
||||||
new java.security.PrivilegedExceptionAction() {
|
new java.security.PrivilegedExceptionAction<Object>() {
|
||||||
public Object run() throws Exception {
|
public Object run() throws Exception {
|
||||||
FileInputStream fis = null;
|
FileInputStream fis = null;
|
||||||
try {
|
try {
|
||||||
|
@ -39,6 +39,7 @@ import sun.awt.PeerEvent;
|
|||||||
import sun.awt.util.IdentityArrayList;
|
import sun.awt.util.IdentityArrayList;
|
||||||
import sun.awt.util.IdentityLinkedList;
|
import sun.awt.util.IdentityLinkedList;
|
||||||
import sun.security.util.SecurityConstants;
|
import sun.security.util.SecurityConstants;
|
||||||
|
import java.security.AccessControlException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Dialog is a top-level window with a title and a border
|
* A Dialog is a top-level window with a title and a border
|
||||||
@ -128,6 +129,8 @@ public class Dialog extends Window {
|
|||||||
*/
|
*/
|
||||||
boolean undecorated = false;
|
boolean undecorated = false;
|
||||||
|
|
||||||
|
private transient boolean initialized = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modal dialogs block all input to some top-level windows.
|
* Modal dialogs block all input to some top-level windows.
|
||||||
* Whether a particular window is blocked depends on dialog's type
|
* Whether a particular window is blocked depends on dialog's type
|
||||||
@ -671,6 +674,7 @@ public class Dialog extends Window {
|
|||||||
this.title = title;
|
this.title = title;
|
||||||
setModalityType(modalityType);
|
setModalityType(modalityType);
|
||||||
SunToolkit.checkAndSetPolicy(this);
|
SunToolkit.checkAndSetPolicy(this);
|
||||||
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -722,6 +726,7 @@ public class Dialog extends Window {
|
|||||||
this.title = title;
|
this.title = title;
|
||||||
setModalityType(modalityType);
|
setModalityType(modalityType);
|
||||||
SunToolkit.checkAndSetPolicy(this);
|
SunToolkit.checkAndSetPolicy(this);
|
||||||
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -851,12 +856,9 @@ public class Dialog extends Window {
|
|||||||
if (modalityType == type) {
|
if (modalityType == type) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (type == ModalityType.TOOLKIT_MODAL) {
|
|
||||||
SecurityManager sm = System.getSecurityManager();
|
checkModalityPermission(type);
|
||||||
if (sm != null) {
|
|
||||||
sm.checkPermission(SecurityConstants.AWT.TOOLKIT_MODALITY_PERMISSION);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
modalityType = type;
|
modalityType = type;
|
||||||
modal = (modalityType != ModalityType.MODELESS);
|
modal = (modalityType != ModalityType.MODELESS);
|
||||||
}
|
}
|
||||||
@ -1025,6 +1027,11 @@ public class Dialog extends Window {
|
|||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void show() {
|
public void show() {
|
||||||
|
if (!initialized) {
|
||||||
|
throw new IllegalStateException("The dialog component " +
|
||||||
|
"has not been initialized properly");
|
||||||
|
}
|
||||||
|
|
||||||
beforeFirstShow = false;
|
beforeFirstShow = false;
|
||||||
if (!isModal()) {
|
if (!isModal()) {
|
||||||
conditionalShow(null, null);
|
conditionalShow(null, null);
|
||||||
@ -1600,18 +1607,51 @@ public class Dialog extends Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkModalityPermission(ModalityType mt) {
|
||||||
|
if (mt == ModalityType.TOOLKIT_MODAL) {
|
||||||
|
SecurityManager sm = System.getSecurityManager();
|
||||||
|
if (sm != null) {
|
||||||
|
sm.checkPermission(
|
||||||
|
SecurityConstants.AWT.TOOLKIT_MODALITY_PERMISSION
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void readObject(ObjectInputStream s)
|
private void readObject(ObjectInputStream s)
|
||||||
throws ClassNotFoundException, IOException, HeadlessException
|
throws ClassNotFoundException, IOException, HeadlessException
|
||||||
{
|
{
|
||||||
GraphicsEnvironment.checkHeadless();
|
GraphicsEnvironment.checkHeadless();
|
||||||
s.defaultReadObject();
|
|
||||||
|
|
||||||
// in 1.5 or earlier modalityType was absent, so use "modal" instead
|
java.io.ObjectInputStream.GetField fields =
|
||||||
if (modalityType == null) {
|
s.readFields();
|
||||||
setModal(modal);
|
|
||||||
|
ModalityType localModalityType = (ModalityType)fields.get("modalityType", null);
|
||||||
|
|
||||||
|
try {
|
||||||
|
checkModalityPermission(localModalityType);
|
||||||
|
} catch (AccessControlException ace) {
|
||||||
|
localModalityType = DEFAULT_MODALITY_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// in 1.5 or earlier modalityType was absent, so use "modal" instead
|
||||||
|
if (localModalityType == null) {
|
||||||
|
this.modal = fields.get("modal", false);
|
||||||
|
setModal(modal);
|
||||||
|
} else {
|
||||||
|
this.modalityType = localModalityType;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.resizable = fields.get("resizable", true);
|
||||||
|
this.undecorated = fields.get("undecorated", false);
|
||||||
|
this.title = (String)fields.get("title", "");
|
||||||
|
|
||||||
blockedWindows = new IdentityArrayList<>();
|
blockedWindows = new IdentityArrayList<>();
|
||||||
|
|
||||||
|
SunToolkit.checkAndSetPolicy(this);
|
||||||
|
|
||||||
|
initialized = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -171,7 +171,7 @@ public class EventQueue {
|
|||||||
* The modifiers field of the current event, if the current event is an
|
* The modifiers field of the current event, if the current event is an
|
||||||
* InputEvent or ActionEvent.
|
* InputEvent or ActionEvent.
|
||||||
*/
|
*/
|
||||||
private WeakReference currentEvent;
|
private WeakReference<AWTEvent> currentEvent;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Non-zero if a thread is waiting in getNextEvent(int) for an event of
|
* Non-zero if a thread is waiting in getNextEvent(int) for an event of
|
||||||
@ -194,7 +194,8 @@ public class EventQueue {
|
|||||||
}
|
}
|
||||||
public void removeSourceEvents(EventQueue eventQueue,
|
public void removeSourceEvents(EventQueue eventQueue,
|
||||||
Object source,
|
Object source,
|
||||||
boolean removeAllEvents) {
|
boolean removeAllEvents)
|
||||||
|
{
|
||||||
eventQueue.removeSourceEvents(source, removeAllEvents);
|
eventQueue.removeSourceEvents(source, removeAllEvents);
|
||||||
}
|
}
|
||||||
public boolean noEvents(EventQueue eventQueue) {
|
public boolean noEvents(EventQueue eventQueue) {
|
||||||
@ -203,6 +204,11 @@ public class EventQueue {
|
|||||||
public void wakeup(EventQueue eventQueue, boolean isShutdown) {
|
public void wakeup(EventQueue eventQueue, boolean isShutdown) {
|
||||||
eventQueue.wakeup(isShutdown);
|
eventQueue.wakeup(isShutdown);
|
||||||
}
|
}
|
||||||
|
public void invokeAndWait(Object source, Runnable r)
|
||||||
|
throws InterruptedException, InvocationTargetException
|
||||||
|
{
|
||||||
|
EventQueue.invokeAndWait(source, r);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -809,7 +815,7 @@ public class EventQueue {
|
|||||||
pushPopLock.lock();
|
pushPopLock.lock();
|
||||||
try {
|
try {
|
||||||
return (Thread.currentThread() == dispatchThread)
|
return (Thread.currentThread() == dispatchThread)
|
||||||
? ((AWTEvent)currentEvent.get())
|
? currentEvent.get()
|
||||||
: null;
|
: null;
|
||||||
} finally {
|
} finally {
|
||||||
pushPopLock.unlock();
|
pushPopLock.unlock();
|
||||||
@ -1167,7 +1173,7 @@ public class EventQueue {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentEvent = new WeakReference(e);
|
currentEvent = new WeakReference<>(e);
|
||||||
|
|
||||||
// This series of 'instanceof' checks should be replaced with a
|
// This series of 'instanceof' checks should be replaced with a
|
||||||
// polymorphic type (for example, an interface which declares a
|
// polymorphic type (for example, an interface which declares a
|
||||||
@ -1245,8 +1251,14 @@ public class EventQueue {
|
|||||||
* @since 1.2
|
* @since 1.2
|
||||||
*/
|
*/
|
||||||
public static void invokeAndWait(Runnable runnable)
|
public static void invokeAndWait(Runnable runnable)
|
||||||
throws InterruptedException, InvocationTargetException {
|
throws InterruptedException, InvocationTargetException
|
||||||
|
{
|
||||||
|
invokeAndWait(Toolkit.getDefaultToolkit(), runnable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void invokeAndWait(Object source, Runnable runnable)
|
||||||
|
throws InterruptedException, InvocationTargetException
|
||||||
|
{
|
||||||
if (EventQueue.isDispatchThread()) {
|
if (EventQueue.isDispatchThread()) {
|
||||||
throw new Error("Cannot call invokeAndWait from the event dispatcher thread");
|
throw new Error("Cannot call invokeAndWait from the event dispatcher thread");
|
||||||
}
|
}
|
||||||
@ -1255,8 +1267,7 @@ public class EventQueue {
|
|||||||
Object lock = new AWTInvocationLock();
|
Object lock = new AWTInvocationLock();
|
||||||
|
|
||||||
InvocationEvent event =
|
InvocationEvent event =
|
||||||
new InvocationEvent(Toolkit.getDefaultToolkit(), runnable, lock,
|
new InvocationEvent(source, runnable, lock, true);
|
||||||
true);
|
|
||||||
|
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
Toolkit.getEventQueue().postEvent(event);
|
Toolkit.getEventQueue().postEvent(event);
|
||||||
|
@ -66,7 +66,7 @@ public class Menu extends MenuItem implements MenuContainer, Accessible {
|
|||||||
|
|
||||||
AWTAccessor.setMenuAccessor(
|
AWTAccessor.setMenuAccessor(
|
||||||
new AWTAccessor.MenuAccessor() {
|
new AWTAccessor.MenuAccessor() {
|
||||||
public Vector getItems(Menu menu) {
|
public Vector<MenuComponent> getItems(Menu menu) {
|
||||||
return menu.items;
|
return menu.items;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -78,7 +78,7 @@ public class Menu extends MenuItem implements MenuContainer, Accessible {
|
|||||||
* @serial
|
* @serial
|
||||||
* @see #countItems()
|
* @see #countItems()
|
||||||
*/
|
*/
|
||||||
Vector items = new Vector();
|
Vector<MenuComponent> items = new Vector<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This field indicates whether the menu has the
|
* This field indicates whether the menu has the
|
||||||
@ -313,7 +313,7 @@ public class Menu extends MenuItem implements MenuContainer, Accessible {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int nitems = getItemCount();
|
int nitems = getItemCount();
|
||||||
Vector tempItems = new Vector();
|
Vector<MenuItem> tempItems = new Vector<>();
|
||||||
|
|
||||||
/* Remove the item at index, nitems-index times
|
/* Remove the item at index, nitems-index times
|
||||||
storing them in a temporary vector in the
|
storing them in a temporary vector in the
|
||||||
@ -330,7 +330,7 @@ public class Menu extends MenuItem implements MenuContainer, Accessible {
|
|||||||
already in the correct order in the temp vector.
|
already in the correct order in the temp vector.
|
||||||
*/
|
*/
|
||||||
for (int i = 0; i < tempItems.size() ; i++) {
|
for (int i = 0; i < tempItems.size() ; i++) {
|
||||||
add((MenuItem)tempItems.elementAt(i));
|
add(tempItems.elementAt(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -379,7 +379,7 @@ public class Menu extends MenuItem implements MenuContainer, Accessible {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int nitems = getItemCount();
|
int nitems = getItemCount();
|
||||||
Vector tempItems = new Vector();
|
Vector<MenuItem> tempItems = new Vector<>();
|
||||||
|
|
||||||
/* Remove the item at index, nitems-index times
|
/* Remove the item at index, nitems-index times
|
||||||
storing them in a temporary vector in the
|
storing them in a temporary vector in the
|
||||||
@ -396,7 +396,7 @@ public class Menu extends MenuItem implements MenuContainer, Accessible {
|
|||||||
already in the correct order in the temp vector.
|
already in the correct order in the temp vector.
|
||||||
*/
|
*/
|
||||||
for (int i = 0; i < tempItems.size() ; i++) {
|
for (int i = 0; i < tempItems.size() ; i++) {
|
||||||
add((MenuItem)tempItems.elementAt(i));
|
add(tempItems.elementAt(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -475,13 +475,13 @@ public class Menu extends MenuItem implements MenuContainer, Accessible {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized Enumeration shortcuts() {
|
synchronized Enumeration<MenuShortcut> shortcuts() {
|
||||||
Vector shortcuts = new Vector();
|
Vector<MenuShortcut> shortcuts = new Vector<>();
|
||||||
int nitems = getItemCount();
|
int nitems = getItemCount();
|
||||||
for (int i = 0 ; i < nitems ; i++) {
|
for (int i = 0 ; i < nitems ; i++) {
|
||||||
MenuItem mi = getItem(i);
|
MenuItem mi = getItem(i);
|
||||||
if (mi instanceof Menu) {
|
if (mi instanceof Menu) {
|
||||||
Enumeration e = ((Menu)mi).shortcuts();
|
Enumeration<MenuShortcut> e = ((Menu)mi).shortcuts();
|
||||||
while (e.hasMoreElements()) {
|
while (e.hasMoreElements()) {
|
||||||
shortcuts.addElement(e.nextElement());
|
shortcuts.addElement(e.nextElement());
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ public class MenuBar extends MenuComponent implements MenuContainer, Accessible
|
|||||||
return menuBar.helpMenu;
|
return menuBar.helpMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector getMenus(MenuBar menuBar) {
|
public Vector<Menu> getMenus(MenuBar menuBar) {
|
||||||
return menuBar.menus;
|
return menuBar.menus;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -94,7 +94,7 @@ public class MenuBar extends MenuComponent implements MenuContainer, Accessible
|
|||||||
* @serial
|
* @serial
|
||||||
* @see #countMenus()
|
* @see #countMenus()
|
||||||
*/
|
*/
|
||||||
Vector menus = new Vector();
|
Vector<Menu> menus = new Vector<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This menu is a special menu dedicated to
|
* This menu is a special menu dedicated to
|
||||||
@ -309,7 +309,7 @@ public class MenuBar extends MenuComponent implements MenuContainer, Accessible
|
|||||||
* be called on the toolkit thread.
|
* be called on the toolkit thread.
|
||||||
*/
|
*/
|
||||||
final Menu getMenuImpl(int i) {
|
final Menu getMenuImpl(int i) {
|
||||||
return (Menu)menus.elementAt(i);
|
return menus.elementAt(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -321,10 +321,10 @@ public class MenuBar extends MenuComponent implements MenuContainer, Accessible
|
|||||||
* @since JDK1.1
|
* @since JDK1.1
|
||||||
*/
|
*/
|
||||||
public synchronized Enumeration<MenuShortcut> shortcuts() {
|
public synchronized Enumeration<MenuShortcut> shortcuts() {
|
||||||
Vector shortcuts = new Vector();
|
Vector<MenuShortcut> shortcuts = new Vector<>();
|
||||||
int nmenus = getMenuCount();
|
int nmenus = getMenuCount();
|
||||||
for (int i = 0 ; i < nmenus ; i++) {
|
for (int i = 0 ; i < nmenus ; i++) {
|
||||||
Enumeration e = getMenu(i).shortcuts();
|
Enumeration<MenuShortcut> e = getMenu(i).shortcuts();
|
||||||
while (e.hasMoreElements()) {
|
while (e.hasMoreElements()) {
|
||||||
shortcuts.addElement(e.nextElement());
|
shortcuts.addElement(e.nextElement());
|
||||||
}
|
}
|
||||||
@ -438,7 +438,7 @@ public class MenuBar extends MenuComponent implements MenuContainer, Accessible
|
|||||||
// HeadlessException will be thrown from MenuComponent's readObject
|
// HeadlessException will be thrown from MenuComponent's readObject
|
||||||
s.defaultReadObject();
|
s.defaultReadObject();
|
||||||
for (int i = 0; i < menus.size(); i++) {
|
for (int i = 0; i < menus.size(); i++) {
|
||||||
Menu m = (Menu)menus.elementAt(i);
|
Menu m = menus.elementAt(i);
|
||||||
m.parent = this;
|
m.parent = this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -290,7 +290,7 @@ public abstract class MenuComponent implements java.io.Serializable {
|
|||||||
public void setFont(Font f) {
|
public void setFont(Font f) {
|
||||||
font = f;
|
font = f;
|
||||||
//Fixed 6312943: NullPointerException in method MenuComponent.setFont(Font)
|
//Fixed 6312943: NullPointerException in method MenuComponent.setFont(Font)
|
||||||
MenuComponentPeer peer = (MenuComponentPeer)this.peer;
|
MenuComponentPeer peer = this.peer;
|
||||||
if (peer != null) {
|
if (peer != null) {
|
||||||
peer.setFont(f);
|
peer.setFont(f);
|
||||||
}
|
}
|
||||||
@ -303,7 +303,7 @@ public abstract class MenuComponent implements java.io.Serializable {
|
|||||||
*/
|
*/
|
||||||
public void removeNotify() {
|
public void removeNotify() {
|
||||||
synchronized (getTreeLock()) {
|
synchronized (getTreeLock()) {
|
||||||
MenuComponentPeer p = (MenuComponentPeer)this.peer;
|
MenuComponentPeer p = this.peer;
|
||||||
if (p != null) {
|
if (p != null) {
|
||||||
Toolkit.getEventQueue().removeSourceEvents(this, true);
|
Toolkit.getEventQueue().removeSourceEvents(this, true);
|
||||||
this.peer = null;
|
this.peer = null;
|
||||||
|
@ -564,7 +564,7 @@ public class MenuItem extends MenuComponent implements Accessible {
|
|||||||
* @since 1.4
|
* @since 1.4
|
||||||
*/
|
*/
|
||||||
public synchronized ActionListener[] getActionListeners() {
|
public synchronized ActionListener[] getActionListeners() {
|
||||||
return (ActionListener[])(getListeners(ActionListener.class));
|
return getListeners(ActionListener.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -92,7 +92,7 @@ public class RenderingHints
|
|||||||
* {@code equals()} method.
|
* {@code equals()} method.
|
||||||
*/
|
*/
|
||||||
public abstract static class Key {
|
public abstract static class Key {
|
||||||
private static HashMap identitymap = new HashMap(17);
|
private static HashMap<Object,Object> identitymap = new HashMap<>(17);
|
||||||
|
|
||||||
private String getIdentity() {
|
private String getIdentity() {
|
||||||
// Note that the identity string is dependent on 3 variables:
|
// Note that the identity string is dependent on 3 variables:
|
||||||
@ -138,7 +138,7 @@ public class RenderingHints
|
|||||||
}
|
}
|
||||||
// Note: Use a weak reference to avoid holding on to extra
|
// Note: Use a weak reference to avoid holding on to extra
|
||||||
// objects and classes after they should be unloaded.
|
// objects and classes after they should be unloaded.
|
||||||
identitymap.put(identity, new WeakReference(k));
|
identitymap.put(identity, new WeakReference<Key>(k));
|
||||||
}
|
}
|
||||||
|
|
||||||
private int privatekey;
|
private int privatekey;
|
||||||
@ -195,7 +195,7 @@ public class RenderingHints
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HashMap hintmap = new HashMap(7);
|
HashMap<Object,Object> hintmap = new HashMap<>(7);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Antialiasing hint key.
|
* Antialiasing hint key.
|
||||||
@ -1267,12 +1267,13 @@ public class RenderingHints
|
|||||||
* object.
|
* object.
|
||||||
* @return a clone of this instance.
|
* @return a clone of this instance.
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public Object clone() {
|
public Object clone() {
|
||||||
RenderingHints rh;
|
RenderingHints rh;
|
||||||
try {
|
try {
|
||||||
rh = (RenderingHints) super.clone();
|
rh = (RenderingHints) super.clone();
|
||||||
if (hintmap != null) {
|
if (hintmap != null) {
|
||||||
rh.hintmap = (HashMap) hintmap.clone();
|
rh.hintmap = (HashMap<Object,Object>) hintmap.clone();
|
||||||
}
|
}
|
||||||
} catch (CloneNotSupportedException e) {
|
} catch (CloneNotSupportedException e) {
|
||||||
// this shouldn't happen, since we are Cloneable
|
// this shouldn't happen, since we are Cloneable
|
||||||
|
@ -109,12 +109,6 @@ public class TextComponent extends Component implements Accessible {
|
|||||||
// the background color of non-editable TextComponents.
|
// the background color of non-editable TextComponents.
|
||||||
boolean backgroundSetByClientCode = false;
|
boolean backgroundSetByClientCode = false;
|
||||||
|
|
||||||
/**
|
|
||||||
* True if this <code>TextComponent</code> has access
|
|
||||||
* to the System clipboard.
|
|
||||||
*/
|
|
||||||
transient private boolean canAccessClipboard;
|
|
||||||
|
|
||||||
transient protected TextListener textListener;
|
transient protected TextListener textListener;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -139,7 +133,6 @@ public class TextComponent extends Component implements Accessible {
|
|||||||
GraphicsEnvironment.checkHeadless();
|
GraphicsEnvironment.checkHeadless();
|
||||||
this.text = (text != null) ? text : "";
|
this.text = (text != null) ? text : "";
|
||||||
setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
|
setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
|
||||||
checkSystemClipboardAccess();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enableInputMethodsIfNecessary() {
|
private void enableInputMethodsIfNecessary() {
|
||||||
@ -734,17 +727,14 @@ public class TextComponent extends Component implements Accessible {
|
|||||||
/**
|
/**
|
||||||
* Assigns a valid value to the canAccessClipboard instance variable.
|
* Assigns a valid value to the canAccessClipboard instance variable.
|
||||||
*/
|
*/
|
||||||
private void checkSystemClipboardAccess() {
|
private boolean canAccessClipboard() {
|
||||||
canAccessClipboard = true;
|
|
||||||
SecurityManager sm = System.getSecurityManager();
|
SecurityManager sm = System.getSecurityManager();
|
||||||
if (sm != null) {
|
if (sm == null) return true;
|
||||||
try {
|
try {
|
||||||
sm.checkSystemClipboardAccess();
|
sm.checkSystemClipboardAccess();
|
||||||
}
|
return true;
|
||||||
catch (SecurityException e) {
|
} catch (SecurityException e) {}
|
||||||
canAccessClipboard = false;
|
return false;
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -827,7 +817,6 @@ public class TextComponent extends Component implements Accessible {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
enableInputMethodsIfNecessary();
|
enableInputMethodsIfNecessary();
|
||||||
checkSystemClipboardAccess();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1206,7 +1206,7 @@ public class Window extends Container implements Accessible {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
try {
|
try {
|
||||||
EventQueue.invokeAndWait(action);
|
EventQueue.invokeAndWait(this, action);
|
||||||
}
|
}
|
||||||
catch (InterruptedException e) {
|
catch (InterruptedException e) {
|
||||||
System.err.println("Disposal was interrupted:");
|
System.err.println("Disposal was interrupted:");
|
||||||
|
@ -71,7 +71,7 @@ public class Clipboard {
|
|||||||
*
|
*
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
private Set currentDataFlavors;
|
private Set<DataFlavor> currentDataFlavors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a clipboard object.
|
* Creates a clipboard object.
|
||||||
@ -313,7 +313,7 @@ public class Clipboard {
|
|||||||
if (flavorListeners == null) {
|
if (flavorListeners == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Set prevDataFlavors = currentDataFlavors;
|
Set<DataFlavor> prevDataFlavors = currentDataFlavors;
|
||||||
currentDataFlavors = getAvailableDataFlavorSet();
|
currentDataFlavors = getAvailableDataFlavorSet();
|
||||||
if (prevDataFlavors.equals(currentDataFlavors)) {
|
if (prevDataFlavors.equals(currentDataFlavors)) {
|
||||||
return;
|
return;
|
||||||
@ -339,8 +339,8 @@ public class Clipboard {
|
|||||||
*
|
*
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
private Set getAvailableDataFlavorSet() {
|
private Set<DataFlavor> getAvailableDataFlavorSet() {
|
||||||
Set set = new HashSet();
|
Set<DataFlavor> set = new HashSet<>();
|
||||||
Transferable contents = getContents(null);
|
Transferable contents = getContents(null);
|
||||||
if (contents != null) {
|
if (contents != null) {
|
||||||
DataFlavor[] flavors = contents.getTransferDataFlavors();
|
DataFlavor[] flavors = contents.getTransferDataFlavors();
|
||||||
|
@ -165,7 +165,7 @@ public class DragGestureEvent extends EventObject {
|
|||||||
* <P>
|
* <P>
|
||||||
* @return an Iterator for the events comprising the gesture
|
* @return an Iterator for the events comprising the gesture
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public Iterator<InputEvent> iterator() { return events.iterator(); }
|
public Iterator<InputEvent> iterator() { return events.iterator(); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -184,7 +184,7 @@ public class DragGestureEvent extends EventObject {
|
|||||||
* <P>
|
* <P>
|
||||||
* @return an array of the events comprising the gesture
|
* @return an array of the events comprising the gesture
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public Object[] toArray(Object[] array) { return events.toArray(array); }
|
public Object[] toArray(Object[] array) { return events.toArray(array); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -333,7 +333,6 @@ public class DragGestureEvent extends EventObject {
|
|||||||
component = (Component)f.get("component", null);
|
component = (Component)f.get("component", null);
|
||||||
origin = (Point)f.get("origin", null);
|
origin = (Point)f.get("origin", null);
|
||||||
action = f.get("action", 0);
|
action = f.get("action", 0);
|
||||||
|
|
||||||
// Pre-1.4 support. 'events' was previously non-transient
|
// Pre-1.4 support. 'events' was previously non-transient
|
||||||
try {
|
try {
|
||||||
events = (List)f.get("events", null);
|
events = (List)f.get("events", null);
|
||||||
@ -351,7 +350,7 @@ public class DragGestureEvent extends EventObject {
|
|||||||
/*
|
/*
|
||||||
* fields
|
* fields
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
private transient List events;
|
private transient List events;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user