--- a/.hgtags Tue Dec 15 14:50:01 2009 +0900
+++ b/.hgtags Wed Dec 16 16:25:08 2009 -0800
@@ -50,3 +50,4 @@
ce74bd35ce948d629a356e168797f44b593b1578 jdk7-b73
4e7661eaa211e186674f6cbefec4aef1144ac2a0 jdk7-b74
946518568340c4e511549318f19f47f06b7f5f9b jdk7-b75
+09e0b33177af2b98a03c9ca19eedf61440bd1cf6 jdk7-b76
--- a/.hgtags-top-repo Tue Dec 15 14:50:01 2009 +0900
+++ b/.hgtags-top-repo Wed Dec 16 16:25:08 2009 -0800
@@ -50,3 +50,4 @@
3ac6dcf7823205546fbbc3d4ea59f37358d0b0d4 jdk7-b73
2c88089b6e1c053597418099a14232182c387edc jdk7-b74
d1516b9f23954b29b8e76e6f4efc467c08c78133 jdk7-b75
+c8b63075403d53a208104a8a6ea5072c1cb66aab jdk7-b76
--- a/corba/.hgtags Tue Dec 15 14:50:01 2009 +0900
+++ b/corba/.hgtags Wed Dec 16 16:25:08 2009 -0800
@@ -50,3 +50,4 @@
b751c528c55560cf2adeaeef24b39ca1f4d1cbf7 jdk7-b73
5d0cf59a3203b9f57aceebc33ae656b884987955 jdk7-b74
0fb137085952c8e47878e240d1cb40f14de463c4 jdk7-b75
+937144222e2219939101b0129d26a872a7956b13 jdk7-b76
--- a/corba/make/common/shared/Platform.gmk Tue Dec 15 14:50:01 2009 +0900
+++ b/corba/make/common/shared/Platform.gmk Wed Dec 16 16:25:08 2009 -0800
@@ -187,6 +187,9 @@
sparc*) \
echo sparc \
;; \
+ arm*) \
+ echo arm \
+ ;; \
*) \
echo $(mach) \
;; \
--- a/hotspot/.hgtags Tue Dec 15 14:50:01 2009 +0900
+++ b/hotspot/.hgtags Wed Dec 16 16:25:08 2009 -0800
@@ -50,3 +50,4 @@
faf94d94786b621f8e13cbcc941ca69c6d967c3f jdk7-b73
f4b900403d6e4b0af51447bd13bbe23fe3a1dac7 jdk7-b74
d8dd291a362acb656026a9c0a9da48501505a1e7 jdk7-b75
+9174bb32e934965288121f75394874eeb1fcb649 jdk7-b76
--- a/jaxp/.hgtags Tue Dec 15 14:50:01 2009 +0900
+++ b/jaxp/.hgtags Wed Dec 16 16:25:08 2009 -0800
@@ -50,3 +50,4 @@
feb05980f9f2964e6bc2b3a8532f9b3054c2289b jdk7-b73
ea7b88c676dd8b269bc858a4a17c14dc96c8aed1 jdk7-b74
555fb78ee4cebed082ca7ddabff46d2e5b4c9026 jdk7-b75
+233a4871d3364ec305efd4a58cfd676620a03a90 jdk7-b76
--- a/jaxp/build.properties Tue Dec 15 14:50:01 2009 +0900
+++ b/jaxp/build.properties Wed Dec 16 16:25:08 2009 -0800
@@ -34,6 +34,10 @@
# one of the standard user build.properties files (see build.xml)
javac.jar=${bootstrap.dir}/lib/javac.jar
+# The tools.jar is needed in the classpath to compile these sources
+jdk.home=${java.home}/..
+tools.jar=${jdk.home}/lib/tools.jar
+
# options for the <javac> tasks used to compile the tools
javac.source = 7
javac.target = 7
--- a/jaxp/build.xml Tue Dec 15 14:50:01 2009 +0900
+++ b/jaxp/build.xml Wed Dec 16 16:25:08 2009 -0800
@@ -113,7 +113,10 @@
<!-- Build (compilation) of sources to class files. -->
<target name="build"
depends="init, -init-src-dirs, -build-prep">
- <javac fork="true"
+ <javac
+ includeAntRuntime="false"
+ classpath="${build.classes.dir}"
+ fork="true"
destdir="${build.classes.dir}"
memoryInitialSize="${javac.memoryInitialSize}"
memoryMaximumSize="${javac.memoryMaximumSize}"
--- a/jaxp/make/Makefile Tue Dec 15 14:50:01 2009 +0900
+++ b/jaxp/make/Makefile Wed Dec 16 16:25:08 2009 -0800
@@ -113,11 +113,13 @@
ifdef ALT_LANGTOOLS_DIST
ifdef ALT_BOOTDIR
ANT_JAVA_HOME = JAVA_HOME=$(ALT_BOOTDIR)
+ ANT_OPTIONS += -Djdk.home=$(ALT_BOOTDIR)
endif
ANT_OPTIONS += -Dbootstrap.dir=$(ALT_LANGTOOLS_DIST)/bootstrap
else
ifdef ALT_JDK_IMPORT_PATH
ANT_JAVA_HOME = JAVA_HOME=$(ALT_JDK_IMPORT_PATH)
+ ANT_OPTIONS += -Djdk.home=$(ALT_JDK_IMPORT_PATH)
endif
endif
@@ -141,7 +143,7 @@
# Create a make target for each
$(ANT_TARGETS):
- cd .. && $(ANT_JAVA_HOME) $(ANT) -version
+ cd .. && $(ANT_JAVA_HOME) $(ANT) $(ANT_OPTIONS) -version
cd .. && $(ANT_JAVA_HOME) $(ANT) $(ANT_OPTIONS) $@
# Help target
--- a/jaxws/.hgtags Tue Dec 15 14:50:01 2009 +0900
+++ b/jaxws/.hgtags Wed Dec 16 16:25:08 2009 -0800
@@ -50,3 +50,4 @@
558985e26fe16f5a6ebb2edb9180a42e1c8e8202 jdk7-b73
f4466e1b608088c90e11beaa4b600f102608c6a1 jdk7-b74
fcf2b8b5d606641659419f247fcee4b284c45e6e jdk7-b75
+765d2077d1e652e234d27fe85ba58a986b488503 jdk7-b76
--- a/jaxws/build.properties Tue Dec 15 14:50:01 2009 +0900
+++ b/jaxws/build.properties Wed Dec 16 16:25:08 2009 -0800
@@ -34,6 +34,10 @@
# one of the standard user build.properties files (see build.xml)
javac.jar=${bootstrap.dir}/lib/javac.jar
+# The tools.jar is needed in the classpath to compile these sources
+jdk.home=${java.home}/..
+tools.jar=${jdk.home}/lib/tools.jar
+
# options for the <javac> tasks used to compile the tools
javac.source = 7
javac.target = 7
--- a/jaxws/build.xml Tue Dec 15 14:50:01 2009 +0900
+++ b/jaxws/build.xml Wed Dec 16 16:25:08 2009 -0800
@@ -113,7 +113,10 @@
<!-- Build (compilation) of sources to class files. -->
<target name="build"
depends="init, -init-src-dirs, -build-prep">
- <javac fork="true"
+ <javac
+ includeAntRuntime="false"
+ classpath="${build.classes.dir}:${tools.jar}"
+ fork="true"
destdir="${build.classes.dir}"
memoryInitialSize="${javac.memoryInitialSize}"
memoryMaximumSize="${javac.memoryMaximumSize}"
--- a/jaxws/make/Makefile Tue Dec 15 14:50:01 2009 +0900
+++ b/jaxws/make/Makefile Wed Dec 16 16:25:08 2009 -0800
@@ -113,11 +113,13 @@
ifdef ALT_LANGTOOLS_DIST
ifdef ALT_BOOTDIR
ANT_JAVA_HOME = JAVA_HOME=$(ALT_BOOTDIR)
+ ANT_OPTIONS += -Djdk.home=$(ALT_BOOTDIR)
endif
ANT_OPTIONS += -Dbootstrap.dir=$(ALT_LANGTOOLS_DIST)/bootstrap
else
ifdef ALT_JDK_IMPORT_PATH
ANT_JAVA_HOME = JAVA_HOME=$(ALT_JDK_IMPORT_PATH)
+ ANT_OPTIONS += -Djdk.home=$(ALT_JDK_IMPORT_PATH)
endif
endif
@@ -141,7 +143,7 @@
# Create a make target for each
$(ANT_TARGETS):
- cd .. && $(ANT_JAVA_HOME) $(ANT) -version
+ cd .. && $(ANT_JAVA_HOME) $(ANT) $(ANT_OPTIONS) -version
cd .. && $(ANT_JAVA_HOME) $(ANT) $(ANT_OPTIONS) $@
# Help target
--- a/jdk/.hgtags Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/.hgtags Wed Dec 16 16:25:08 2009 -0800
@@ -51,3 +51,4 @@
eacb36e30327e7ae33baa068e82ddccbd91eaae2 jdk7-b74
8885b22565077236a927e824ef450742e434a230 jdk7-b75
8fb602395be0f7d5af4e7e93b7df2d960faf9d17 jdk7-b76
+e6a5d095c356a547cf5b3c8885885aca5e91e09b jdk7-b77
--- a/jdk/make/common/shared/Platform.gmk Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/common/shared/Platform.gmk Wed Dec 16 16:25:08 2009 -0800
@@ -165,6 +165,9 @@
sparc*) \
echo sparc \
;; \
+ arm*) \
+ echo arm \
+ ;; \
*) \
echo $(mach) \
;; \
--- a/jdk/make/java/java/Makefile Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/java/java/Makefile Wed Dec 16 16:25:08 2009 -0800
@@ -390,7 +390,7 @@
LOCALES_GEN_SH = localelist.sh
$(GENSRCDIR)/sun/util/CoreResourceBundleControl.java: \
- $(SHARE_SRC)/classes/sun/util/CoreResourceBundleControl-XLocales.java $(LOCALES_GEN_SH)
+ $(SHARE_SRC)/classes/sun/util/CoreResourceBundleControl-XLocales.java.template $(LOCALES_GEN_SH)
@$(prep-target)
NAWK="$(NAWK)" SED="$(SED)" $(SH) $(LOCALES_GEN_SH) "$(JRE_NONEXIST_LOCALES)" \
$< $@
--- a/jdk/make/java/java/genlocales.gmk Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/java/java/genlocales.gmk Wed Dec 16 16:25:08 2009 -0800
@@ -68,7 +68,7 @@
FILES_java := $(FILES_java_orig)
FILES_compiled_properties := $(FILES_compiled_properties_orig)
-LocaleDataMetaInfo_Src=$(SHARE_SRC)/classes/sun/util/LocaleDataMetaInfo-XLocales.java
+LocaleDataMetaInfo_Src=$(SHARE_SRC)/classes/sun/util/LocaleDataMetaInfo-XLocales.java.template
LocaleDataMetaInfo_Dest=$(GENSRCDIR)/sun/util/LocaleDataMetaInfo.java
LOCALEGEN_SH=localegen.sh
RESOURCE_NAMES="FormatData CollationData TimeZoneNames LocaleNames CurrencyNames CalendarData"
--- a/jdk/make/java/java/localegen.sh Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/java/java/localegen.sh Wed Dec 16 16:25:08 2009 -0800
@@ -27,7 +27,7 @@
#
# This script is to generate the supported locale list string and replace the
-# LocaleDataMetaInfo-XLocales.java in <ws>/src/share/classes/sun/util
+# LocaleDataMetaInfo-XLocales.java.template in <ws>/src/share/classes/sun/util
#
# SORT, NAWK & SED is passed in as environment variables.
#
--- a/jdk/make/java/jli/Makefile Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/java/jli/Makefile Wed Dec 16 16:25:08 2009 -0800
@@ -96,6 +96,7 @@
ifneq ($(PLATFORM), windows) # UNIX systems
+ LD_RUNPATH_EXTRAS += ..
LIB_LOCATION = $(LIBDIR)/$(LIBARCH)/jli
# Note: its important to keep this order meaning -lc is the
# last library otherwise it could cause compatibility issues
--- a/jdk/make/java/main/java/Makefile Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/java/main/java/Makefile Wed Dec 16 16:25:08 2009 -0800
@@ -61,8 +61,5 @@
ifeq ($(PLATFORM), solaris)
LDFLAGS += -R$(OPENWIN_LIB)
-endif
-
-ifeq ($(PLATFORM), solaris)
LDFLAGS += -M mapfile-$(ARCH)
endif
--- a/jdk/make/java/nio/Makefile Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/java/nio/Makefile Wed Dec 16 16:25:08 2009 -0800
@@ -834,7 +834,7 @@
GENCSSRC = $(BUILDDIR)/tools/CharsetMapping
CHARSETMAPPING_JARFILE = $(BUILDTOOLJARDIR)/charsetmapping.jar
-$(FILES_gensbcs_out): $(GENCSSRC)/SingleByte-X.java $(GENCSSRC)/sbcs
+$(FILES_gensbcs_out): $(GENCSSRC)/SingleByte-X.java.template $(GENCSSRC)/sbcs
@$(prep-target)
$(BOOT_JAVA_CMD) -jar $(CHARSETMAPPING_JARFILE) $(GENCSSRC) $(SCS_GEN) sbcs
--- a/jdk/make/java/redist/Makefile Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/java/redist/Makefile Wed Dec 16 16:25:08 2009 -0800
@@ -194,10 +194,8 @@
# For backwards compatability, make a link of the 32-bit client JVM to $(LIBDIR)
IMPORT_LIST += $(LIB_LOCATION)/$(JVM_NAME)
-# create a link from lib/libjvm.so to client/libjvm.so
$(LIB_LOCATION)/$(JVM_NAME): $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(JVM_NAME)
@$(prep-target)
- $(LN) -s $(CLIENT_LOCATION)/$(JVM_NAME) $@
# solaris ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ solaris
endif # 32bit solaris
--- a/jdk/make/netbeans/README Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/netbeans/README Wed Dec 16 16:25:08 2009 -0800
@@ -411,7 +411,7 @@
java/util/regex/,\
java/util/spi/,\
java/util/zip/,\
- **/*-XLocales.java
+ **/*-XLocales.java.template
jtreg.tests=\
java/util/**/*Collection/ \
java/util/**/*Map/ \
--- a/jdk/make/sun/nio/Makefile Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/sun/nio/Makefile Wed Dec 16 16:25:08 2009 -0800
@@ -82,7 +82,9 @@
$(FILES_MAP) $(FILES_DAT) sjis0213
-$(FILES_genout_extcs): $(GENCSDATASRC)/SingleByte-X.java $(GENCSDATASRC)/DoubleByte-X.java \
+$(FILES_genout_extcs): \
+ $(GENCSDATASRC)/SingleByte-X.java.template \
+ $(GENCSDATASRC)/DoubleByte-X.java.template \
$(GENCSDATASRC)/extsbcs $(GENCSDATASRC)/dbcs
@$(prep-target)
$(RM) -r $(GENCSEXT)
--- a/jdk/make/sun/xawt/mapfile-vers Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/sun/xawt/mapfile-vers Wed Dec 16 16:25:08 2009 -0800
@@ -126,6 +126,8 @@
Java_sun_awt_X11_XlibWrapper_ServerVendor;
Java_sun_awt_X11_XlibWrapper_VendorRelease;
Java_sun_awt_X11_XlibWrapper_IsXsunKPBehavior;
+ Java_sun_awt_X11_XlibWrapper_IsSunKeyboard;
+ Java_sun_awt_X11_XlibWrapper_IsKanaKeyboard;
Java_sun_awt_X11_XlibWrapper_SetToolkitErrorHandler;
Java_sun_awt_X11_XlibWrapper_XSetErrorHandler;
Java_sun_awt_X11_XlibWrapper_CallErrorHandler;
@@ -306,6 +308,7 @@
Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode;
Java_sun_awt_X11_XlibWrapper_XGetModifierMapping;
Java_sun_awt_X11_XlibWrapper_XFreeModifiermap;
+ Java_sun_awt_X11_XlibWrapper_XRefreshKeyboardMapping;
Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab;
Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent;
Java_sun_awt_X11_XlibWrapper_ExitSecondaryLoop;
--- a/jdk/make/tools/CharsetMapping/DoubleByte-X.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-/*
- * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-// -- This file was mechanically generated: Do not edit! -- //
-
-package $PACKAGE$;
-
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CharsetEncoder;
-import java.util.Arrays;
-import sun.nio.cs.HistoricallyNamedCharset;
-import sun.nio.cs.ext.DoubleByte;
-
-public class $NAME_CLZ$ extends Charset
- $IMPLEMENTS$
-{
- public $NAME_CLZ$() {
- super("$NAME_CS$", $NAME_ALIASES$);
- }
-
- $HISTORICALNAME$
-
- public boolean contains(Charset cs) {
- $CONTAINS$
- }
-
- public CharsetDecoder newDecoder() {
- initb2c();
- return new DoubleByte.Decoder$DECTYPE$(this, b2c, b2cSB, $B2MIN$, $B2MAX$);
- }
-
- public CharsetEncoder newEncoder() {
- initc2b();
- return new DoubleByte.Encoder$ENCTYPE$(this, c2b, c2bIndex);
- }
-
- $B2C$
- static char[][] b2c = new char[b2cStr.length][];
- static char[] b2cSB;
- private static volatile boolean b2cInitialized = false;
-
- static void initb2c() {
- if (b2cInitialized)
- return;
- synchronized (b2c) {
- if (b2cInitialized)
- return;
- for (int i = 0; i < b2cStr.length; i++) {
- if (b2cStr[i] == null)
- b2c[i] = DoubleByte.B2C_UNMAPPABLE;
- else
- b2c[i] = b2cStr[i].toCharArray();
- }
- b2cSB = b2cSBStr.toCharArray();
- b2cInitialized = true;
- }
- }
-
- static char[] c2b = new char[$C2BLENGTH$];
- static char[] c2bIndex = new char[0x100];
- private static volatile boolean c2bInitialized = false;
-
- static void initc2b() {
- if (c2bInitialized)
- return;
- synchronized (c2b) {
- if (c2bInitialized)
- return;
- $NONROUNDTRIP_B2C$
- $NONROUNDTRIP_C2B$
- DoubleByte.Encoder.initC2B(b2cStr, b2cSBStr, b2cNR, c2bNR,
- $B2MIN$, $B2MAX$,
- c2b, c2bIndex);
- c2bInitialized = true;
- }
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/tools/CharsetMapping/DoubleByte-X.java.template Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+// -- This file was mechanically generated: Do not edit! -- //
+
+package $PACKAGE$;
+
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.util.Arrays;
+import sun.nio.cs.HistoricallyNamedCharset;
+import sun.nio.cs.ext.DoubleByte;
+
+public class $NAME_CLZ$ extends Charset
+ $IMPLEMENTS$
+{
+ public $NAME_CLZ$() {
+ super("$NAME_CS$", $NAME_ALIASES$);
+ }
+
+ $HISTORICALNAME$
+
+ public boolean contains(Charset cs) {
+ $CONTAINS$
+ }
+
+ public CharsetDecoder newDecoder() {
+ initb2c();
+ return new DoubleByte.Decoder$DECTYPE$(this, b2c, b2cSB, $B2MIN$, $B2MAX$);
+ }
+
+ public CharsetEncoder newEncoder() {
+ initc2b();
+ return new DoubleByte.Encoder$ENCTYPE$(this, c2b, c2bIndex);
+ }
+
+ $B2C$
+ static char[][] b2c = new char[b2cStr.length][];
+ static char[] b2cSB;
+ private static volatile boolean b2cInitialized = false;
+
+ static void initb2c() {
+ if (b2cInitialized)
+ return;
+ synchronized (b2c) {
+ if (b2cInitialized)
+ return;
+ for (int i = 0; i < b2cStr.length; i++) {
+ if (b2cStr[i] == null)
+ b2c[i] = DoubleByte.B2C_UNMAPPABLE;
+ else
+ b2c[i] = b2cStr[i].toCharArray();
+ }
+ b2cSB = b2cSBStr.toCharArray();
+ b2cInitialized = true;
+ }
+ }
+
+ static char[] c2b = new char[$C2BLENGTH$];
+ static char[] c2bIndex = new char[0x100];
+ private static volatile boolean c2bInitialized = false;
+
+ static void initc2b() {
+ if (c2bInitialized)
+ return;
+ synchronized (c2b) {
+ if (c2bInitialized)
+ return;
+ $NONROUNDTRIP_B2C$
+ $NONROUNDTRIP_C2B$
+ DoubleByte.Encoder.initC2B(b2cStr, b2cSBStr, b2cNR, c2bNR,
+ $B2MIN$, $B2MAX$,
+ c2b, c2bIndex);
+ c2bInitialized = true;
+ }
+ }
+}
--- a/jdk/make/tools/CharsetMapping/SingleByte-X.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
- * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package $PACKAGE$;
-
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CharsetEncoder;
-import sun.nio.cs.StandardCharsets;
-import sun.nio.cs.SingleByte;
-import sun.nio.cs.HistoricallyNamedCharset;
-import static sun.nio.cs.CharsetMapping.*;
-
-public class $NAME_CLZ$ extends Charset implements HistoricallyNamedCharset
-{
- public $NAME_CLZ$() {
- super("$NAME_CS$", $NAME_ALIASES$);
- }
-
- public String historicalName() {
- return "$NAME_HIS$";
- }
-
- public boolean contains(Charset cs) {
- $CONTAINS$;
- }
-
- public CharsetDecoder newDecoder() {
- return new SingleByte.Decoder(this, b2c);
- }
-
- public CharsetEncoder newEncoder() {
- return new SingleByte.Encoder(this, c2b, c2bIndex);
- }
-
- public String getDecoderSingleByteMappings() {
- return b2cTable;
- }
-
- public char[] getEncoderIndex2() {
- return c2b;
- }
-
- public char[] getEncoderIndex1() {
- return c2bIndex;
- }
-
- private final static String b2cTable = $B2CTABLE$
-
- private final static char[] b2c = b2cTable.toCharArray();
- private final static char[] c2b = new char[$C2BLENGTH$];
- private final static char[] c2bIndex = new char[0x100];
-
- static {
- char[] b2cMap = b2c;
- char[] c2bNR = null;
- $NONROUNDTRIP_B2C$
- $NONROUNDTRIP_C2B$
- SingleByte.initC2B(b2cMap, c2bNR, c2b, c2bIndex);
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/tools/CharsetMapping/SingleByte-X.java.template Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package $PACKAGE$;
+
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import sun.nio.cs.StandardCharsets;
+import sun.nio.cs.SingleByte;
+import sun.nio.cs.HistoricallyNamedCharset;
+import static sun.nio.cs.CharsetMapping.*;
+
+public class $NAME_CLZ$ extends Charset implements HistoricallyNamedCharset
+{
+ public $NAME_CLZ$() {
+ super("$NAME_CS$", $NAME_ALIASES$);
+ }
+
+ public String historicalName() {
+ return "$NAME_HIS$";
+ }
+
+ public boolean contains(Charset cs) {
+ $CONTAINS$;
+ }
+
+ public CharsetDecoder newDecoder() {
+ return new SingleByte.Decoder(this, b2c);
+ }
+
+ public CharsetEncoder newEncoder() {
+ return new SingleByte.Encoder(this, c2b, c2bIndex);
+ }
+
+ public String getDecoderSingleByteMappings() {
+ return b2cTable;
+ }
+
+ public char[] getEncoderIndex2() {
+ return c2b;
+ }
+
+ public char[] getEncoderIndex1() {
+ return c2bIndex;
+ }
+
+ private final static String b2cTable = $B2CTABLE$
+
+ private final static char[] b2c = b2cTable.toCharArray();
+ private final static char[] c2b = new char[$C2BLENGTH$];
+ private final static char[] c2bIndex = new char[0x100];
+
+ static {
+ char[] b2cMap = b2c;
+ char[] c2bNR = null;
+ $NONROUNDTRIP_B2C$
+ $NONROUNDTRIP_C2B$
+ SingleByte.initC2B(b2cMap, c2bNR, c2b, c2bIndex);
+ }
+}
--- a/jdk/make/tools/src/build/tools/charsetmapping/GenerateDBCS.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/tools/src/build/tools/charsetmapping/GenerateDBCS.java Wed Dec 16 16:25:08 2009 -0800
@@ -63,7 +63,7 @@
int b2Min = toInteger(fields[8]);
int b2Max = toInteger(fields[9]);
System.out.printf("%s,%s,%s,%b,%s%n", clzName, csName, hisName, isASCII, pkgName);
- genClass(args[0], args[1], "DoubleByte-X.java",
+ genClass(args[0], args[1], "DoubleByte-X.java.template",
clzName, csName, hisName, pkgName,
isASCII, type,
b1Min, b1Max, b2Min, b2Max);
--- a/jdk/make/tools/src/build/tools/charsetmapping/GenerateSBCS.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/make/tools/src/build/tools/charsetmapping/GenerateSBCS.java Wed Dec 16 16:25:08 2009 -0800
@@ -55,7 +55,7 @@
String pkgName = fields[4];
System.out.printf("%s,%s,%s,%b,%s%n", clzName, csName, hisName, isASCII, pkgName);
- genClass(args[0], args[1], "SingleByte-X.java",
+ genClass(args[0], args[1], "SingleByte-X.java.template",
clzName, csName, hisName, pkgName, isASCII);
}
}
--- a/jdk/src/share/bin/java.c Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/bin/java.c Wed Dec 16 16:25:08 2009 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,15 +41,13 @@
* options are turned into "-foo" options to the vm. This option
* filtering is handled in a number of places in the launcher, some of
* it in machine-dependent code. In this file, the function
- * CheckJVMType removes vm style options and TranslateApplicationArgs
- * removes "-J" prefixes. On unix platforms, the
- * CreateExecutionEnvironment function from the unix java_md.c file
- * processes and removes -d<n> options. However, in case
- * CreateExecutionEnvironment does not need to exec because
- * LD_LIBRARY_PATH is set acceptably and the data model does not need
- * to be changed, ParseArguments will screen out the redundant -d<n>
- * options and prevent them from being passed to the vm; this is done
- * by RemovableOption.
+ * CheckJvmType removes vm style options and TranslateApplicationArgs
+ * removes "-J" prefixes. The CreateExecutionEnvironment function processes
+ * and removes -d<n> options. On unix, there is a possibility that the running
+ * data model may not match to the desired data model, in this case an exec is
+ * required to start the desired model. If the data models match, then
+ * ParseArguments will remove the -d<n> flags. If the data models do not match
+ * the CreateExecutionEnviroment will remove the -d<n> flags.
*/
@@ -1891,11 +1889,11 @@
* Return JNI_TRUE for an option string that has no effect but should
* _not_ be passed on to the vm; return JNI_FALSE otherwise. On
* Solaris SPARC, this screening needs to be done if:
- * 1) LD_LIBRARY_PATH does _not_ need to be reset and
- * 2) -d32 or -d64 is passed to a binary with a matching data model
- * (the exec in SetLibraryPath removes -d<n> options and points the
- * exec to the proper binary). When this exec is not done, these options
- * would end up getting passed onto the vm.
+ * -d32 or -d64 is passed to a binary with an unmatched data model
+ * (the exec in CreateExecutionEnvironment removes -d<n> options and points the
+ * exec to the proper binary). In the case of when the data model and the
+ * requested version is matched, an exec would not occur, and these options
+ * were erroneously passed to the vm.
*/
jboolean
RemovableOption(char * option)
--- a/jdk/src/share/classes/com/sun/crypto/provider/HmacCore.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/com/sun/crypto/provider/HmacCore.java Wed Dec 16 16:25:08 2009 -0800
@@ -36,7 +36,7 @@
/**
* This class constitutes the core of HMAC-<MD> algorithms, where
- * <MD> can be SHA1 or MD5, etc.
+ * <MD> can be SHA1 or MD5, etc. See RFC 2104 for spec.
*
* It also contains the implementation classes for the SHA-256,
* SHA-384, and SHA-512 HMACs.
@@ -116,7 +116,7 @@
}
byte[] secret = key.getEncoded();
- if (secret == null || secret.length == 0) {
+ if (secret == null) {
throw new InvalidKeyException("Missing key data");
}
--- a/jdk/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java Wed Dec 16 16:25:08 2009 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,21 +25,19 @@
package com.sun.crypto.provider;
-import java.io.*;
+import java.io.ObjectStreamException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.security.KeyRep;
import java.security.GeneralSecurityException;
-import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.PBEKeySpec;
-import javax.crypto.spec.SecretKeySpec;
/**
* This class represents a PBE key derived using PBKDF2 defined
@@ -123,7 +121,7 @@
this.key = deriveKey(prf, passwdBytes, salt, iterCount, keyLength);
}
- private static byte[] deriveKey(Mac prf, byte[] password, byte[] salt,
+ private static byte[] deriveKey(final Mac prf, final byte[] password, byte[] salt,
int iterCount, int keyLengthInBit) {
int keyLength = keyLengthInBit/8;
byte[] key = new byte[keyLength];
@@ -133,7 +131,34 @@
int intR = keyLength - (intL - 1)*hlen; // residue
byte[] ui = new byte[hlen];
byte[] ti = new byte[hlen];
- SecretKey macKey = new SecretKeySpec(password, prf.getAlgorithm());
+ // SecretKeySpec cannot be used, since password can be empty here.
+ SecretKey macKey = new SecretKey() {
+ @Override
+ public String getAlgorithm() {
+ return prf.getAlgorithm();
+ }
+ @Override
+ public String getFormat() {
+ return "RAW";
+ }
+ @Override
+ public byte[] getEncoded() {
+ return password;
+ }
+ @Override
+ public int hashCode() {
+ return Arrays.hashCode(password) * 41 +
+ prf.getAlgorithm().toLowerCase().hashCode();
+ }
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (this.getClass() != obj.getClass()) return false;
+ SecretKey sk = (SecretKey)obj;
+ return prf.getAlgorithm().equalsIgnoreCase(sk.getAlgorithm()) &&
+ Arrays.equals(password, sk.getEncoded());
+ }
+ };
prf.init(macKey);
byte[] ibytes = new byte[4];
@@ -230,7 +255,7 @@
* @throws ObjectStreamException if a new object representing
* this PBE key could not be created
*/
- private Object writeReplace() throws java.io.ObjectStreamException {
+ private Object writeReplace() throws ObjectStreamException {
return new KeyRep(KeyRep.Type.SECRET, getAlgorithm(),
getFormat(), getEncoded());
}
--- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,6 +26,7 @@
package com.sun.jmx.mbeanserver;
import java.lang.annotation.Annotation;
+import java.lang.ref.SoftReference;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
@@ -33,8 +34,13 @@
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Locale;
import java.util.Map;
+import java.util.WeakHashMap;
import javax.management.Descriptor;
import javax.management.DescriptorKey;
@@ -506,11 +512,25 @@
} else {
// Java Beans introspection
//
- BeanInfo bi = java.beans.Introspector.getBeanInfo(complex.getClass());
- PropertyDescriptor[] pds = bi.getPropertyDescriptors();
- for (PropertyDescriptor pd : pds)
- if (pd.getName().equals(element))
- return pd.getReadMethod().invoke(complex);
+ Class<?> clazz = complex.getClass();
+ Method readMethod = null;
+ if (BeansHelper.isAvailable()) {
+ Object bi = BeansHelper.getBeanInfo(clazz);
+ Object[] pds = BeansHelper.getPropertyDescriptors(bi);
+ for (Object pd: pds) {
+ if (BeansHelper.getPropertyName(pd).equals(element)) {
+ readMethod = BeansHelper.getReadMethod(pd);
+ break;
+ }
+ }
+ } else {
+ // Java Beans not available so use simple introspection
+ // to locate method
+ readMethod = SimpleIntrospector.getReadMethod(clazz, element);
+ }
+ if (readMethod != null)
+ return readMethod.invoke(complex);
+
throw new AttributeNotFoundException(
"Could not find the getter method for the property " +
element + " using the Java Beans introspector");
@@ -524,4 +544,235 @@
new AttributeNotFoundException(e.getMessage()), e);
}
}
+
+ /**
+ * A simple introspector that uses reflection to analyze a class and
+ * identify its "getter" methods. This class is intended for use only when
+ * Java Beans is not present (which implies that there isn't explicit
+ * information about the bean available).
+ */
+ private static class SimpleIntrospector {
+ private SimpleIntrospector() { }
+
+ private static final String GET_METHOD_PREFIX = "get";
+ private static final String IS_METHOD_PREFIX = "is";
+
+ // cache to avoid repeated lookups
+ private static final Map<Class<?>,SoftReference<List<Method>>> cache =
+ Collections.synchronizedMap(
+ new WeakHashMap<Class<?>,SoftReference<List<Method>>> ());
+
+ /**
+ * Returns the list of methods cached for the given class, or {@code null}
+ * if not cached.
+ */
+ private static List<Method> getCachedMethods(Class<?> clazz) {
+ // return cached methods if possible
+ SoftReference<List<Method>> ref = cache.get(clazz);
+ if (ref != null) {
+ List<Method> cached = ref.get();
+ if (cached != null)
+ return cached;
+ }
+ return null;
+ }
+
+ /**
+ * Returns {@code true} if the given method is a "getter" method (where
+ * "getter" method is a public method of the form getXXX or "boolean
+ * isXXX")
+ */
+ static boolean isReadMethod(Method method) {
+ // ignore static methods
+ int modifiers = method.getModifiers();
+ if (Modifier.isStatic(modifiers))
+ return false;
+
+ String name = method.getName();
+ Class<?>[] paramTypes = method.getParameterTypes();
+ int paramCount = paramTypes.length;
+
+ if (paramCount == 0 && name.length() > 2) {
+ // boolean isXXX()
+ if (name.startsWith(IS_METHOD_PREFIX))
+ return (method.getReturnType() == boolean.class);
+ // getXXX()
+ if (name.length() > 3 && name.startsWith(GET_METHOD_PREFIX))
+ return (method.getReturnType() != void.class);
+ }
+ return false;
+ }
+
+ /**
+ * Returns the list of "getter" methods for the given class. The list
+ * is ordered so that isXXX methods appear before getXXX methods - this
+ * is for compatability with the JavaBeans Introspector.
+ */
+ static List<Method> getReadMethods(Class<?> clazz) {
+ // return cached result if available
+ List<Method> cachedResult = getCachedMethods(clazz);
+ if (cachedResult != null)
+ return cachedResult;
+
+ // get list of public methods, filtering out methods that have
+ // been overridden to return a more specific type.
+ List<Method> methods =
+ StandardMBeanIntrospector.getInstance().getMethods(clazz);
+ methods = MBeanAnalyzer.eliminateCovariantMethods(methods);
+
+ // filter out the non-getter methods
+ List<Method> result = new LinkedList<Method>();
+ for (Method m: methods) {
+ if (isReadMethod(m)) {
+ // favor isXXX over getXXX
+ if (m.getName().startsWith(IS_METHOD_PREFIX)) {
+ result.add(0, m);
+ } else {
+ result.add(m);
+ }
+ }
+ }
+
+ // add result to cache
+ cache.put(clazz, new SoftReference<List<Method>>(result));
+
+ return result;
+ }
+
+ /**
+ * Returns the "getter" to read the given property from the given class or
+ * {@code null} if no method is found.
+ */
+ static Method getReadMethod(Class<?> clazz, String property) {
+ // first character in uppercase (compatability with JavaBeans)
+ property = property.substring(0, 1).toUpperCase(Locale.ENGLISH) +
+ property.substring(1);
+ String getMethod = GET_METHOD_PREFIX + property;
+ String isMethod = IS_METHOD_PREFIX + property;
+ for (Method m: getReadMethods(clazz)) {
+ String name = m.getName();
+ if (name.equals(isMethod) || name.equals(getMethod)) {
+ return m;
+ }
+ }
+ return null;
+ }
+ }
+
+ /**
+ * A class that provides access to the JavaBeans Introspector and
+ * PropertyDescriptors without creating a static dependency on java.beans.
+ */
+ private static class BeansHelper {
+ private static final Class<?> introspectorClass =
+ getClass("java.beans.Introspector");
+ private static final Class<?> beanInfoClass =
+ (introspectorClass == null) ? null : getClass("java.beans.BeanInfo");
+ private static final Class<?> getPropertyDescriptorClass =
+ (beanInfoClass == null) ? null : getClass("java.beans.PropertyDescriptor");
+
+ private static final Method getBeanInfo =
+ getMethod(introspectorClass, "getBeanInfo", Class.class);
+ private static final Method getPropertyDescriptors =
+ getMethod(beanInfoClass, "getPropertyDescriptors");
+ private static final Method getPropertyName =
+ getMethod(getPropertyDescriptorClass, "getName");
+ private static final Method getReadMethod =
+ getMethod(getPropertyDescriptorClass, "getReadMethod");
+
+ private static Class<?> getClass(String name) {
+ try {
+ return Class.forName(name, true, null);
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+ }
+ private static Method getMethod(Class<?> clazz,
+ String name,
+ Class<?>... paramTypes)
+ {
+ if (clazz != null) {
+ try {
+ return clazz.getMethod(name, paramTypes);
+ } catch (NoSuchMethodException e) {
+ throw new AssertionError(e);
+ }
+ } else {
+ return null;
+ }
+ }
+
+ private BeansHelper() { }
+
+ /**
+ * Returns {@code true} if java.beans is available.
+ */
+ static boolean isAvailable() {
+ return introspectorClass != null;
+ }
+
+ /**
+ * Invokes java.beans.Introspector.getBeanInfo(Class)
+ */
+ static Object getBeanInfo(Class<?> clazz) throws Exception {
+ try {
+ return getBeanInfo.invoke(null, clazz);
+ } catch (InvocationTargetException e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof Exception)
+ throw (Exception)cause;
+ throw new AssertionError(e);
+ } catch (IllegalAccessException iae) {
+ throw new AssertionError(iae);
+ }
+ }
+
+ /**
+ * Invokes java.beans.BeanInfo.getPropertyDescriptors()
+ */
+ static Object[] getPropertyDescriptors(Object bi) {
+ try {
+ return (Object[])getPropertyDescriptors.invoke(bi);
+ } catch (InvocationTargetException e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof RuntimeException)
+ throw (RuntimeException)cause;
+ throw new AssertionError(e);
+ } catch (IllegalAccessException iae) {
+ throw new AssertionError(iae);
+ }
+ }
+
+ /**
+ * Invokes java.beans.PropertyDescriptor.getName()
+ */
+ static String getPropertyName(Object pd) {
+ try {
+ return (String)getPropertyName.invoke(pd);
+ } catch (InvocationTargetException e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof RuntimeException)
+ throw (RuntimeException)cause;
+ throw new AssertionError(e);
+ } catch (IllegalAccessException iae) {
+ throw new AssertionError(iae);
+ }
+ }
+
+ /**
+ * Invokes java.beans.PropertyDescriptor.getReadMethod()
+ */
+ static Method getReadMethod(Object pd) {
+ try {
+ return (Method)getReadMethod.invoke(pd);
+ } catch (InvocationTargetException e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof RuntimeException)
+ throw (RuntimeException)cause;
+ throw new AssertionError(e);
+ } catch (IllegalAccessException iae) {
+ throw new AssertionError(iae);
+ }
+ }
+ }
}
--- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java Wed Dec 16 16:25:08 2009 -0800
@@ -175,7 +175,7 @@
/**
* Get the methods to be analyzed to build the MBean interface.
*/
- List<Method> getMethods(final Class<?> mbeanType) throws Exception {
+ List<Method> getMethods(final Class<?> mbeanType) {
return Arrays.asList(mbeanType.getMethods());
}
--- a/jdk/src/share/classes/com/sun/security/auth/PolicyFile.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/com/sun/security/auth/PolicyFile.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,8 +34,6 @@
import java.security.AccessController;
import java.security.CodeSource;
-import java.security.Identity;
-import java.security.IdentityScope;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.Permission;
@@ -267,7 +265,7 @@
private boolean initialized = false;
private boolean expandProperties = true;
- private boolean ignoreIdentityScope = false;
+ private boolean ignoreIdentityScope = true;
// for use with the reflection API
@@ -459,9 +457,6 @@
}
}
- /** the scope to check */
- private static IdentityScope scope = null;
-
/**
* Checks public key. If it is marked as trusted in
* the identity database, add it to the policy
--- a/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java Wed Dec 16 16:25:08 2009 -0800
@@ -99,4 +99,58 @@
*/
public Object inquireSecContext(InquireType type)
throws GSSException;
+
+ /**
+ * Requests that the delegation policy be respected. When a true value is
+ * requested, the underlying context would use the delegation policy
+ * defined by the environment as a hint to determine whether credentials
+ * delegation should be performed. This request can only be made on the
+ * context initiator's side and it has to be done prior to the first
+ * call to <code>initSecContext</code>.
+ * <p>
+ * When this flag is false, delegation will only be tried when the
+ * {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag}
+ * is true.
+ * <p>
+ * When this flag is true but the
+ * {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag}
+ * is false, delegation will be only tried if the delegation policy permits
+ * delegation.
+ * <p>
+ * When both this flag and the
+ * {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag}
+ * are true, delegation will be always tried. However, if the delegation
+ * policy does not permit delegation, the value of
+ * {@link #getDelegPolicyState} will be false, even
+ * if delegation is performed successfully.
+ * <p>
+ * In any case, if the delegation is not successful, the value returned
+ * by {@link GSSContext#getCredDelegState()} is false, and the value
+ * returned by {@link #getDelegPolicyState()} is also false.
+ * <p>
+ * Not all mechanisms support delegation policy. Therefore, the
+ * application should check to see if the request was honored with the
+ * {@link #getDelegPolicyState() getDelegPolicyState} method. When
+ * delegation policy is not supported, <code>requestDelegPolicy</code>
+ * should return silently without throwing an exception.
+ * <p>
+ * Note: for the Kerberos 5 mechanism, the delegation policy is expressed
+ * through the OK-AS-DELEGATE flag in the service ticket. When it's true,
+ * the KDC permits delegation to the target server. In a cross-realm
+ * environment, in order for delegation be permitted, all cross-realm TGTs
+ * on the authentication path must also have the OK-AS-DELAGATE flags set.
+ * @param state true if the policy should be respected
+ * @throws GSSException containing the following
+ * major error codes:
+ * {@link GSSException#FAILURE GSSException.FAILURE}
+ */
+ public void requestDelegPolicy(boolean state) throws GSSException;
+
+ /**
+ * Returns the delegation policy response. Called after a security context
+ * is established. This method can be only called on the initiator's side.
+ * See {@link ExtendedGSSContext#requestDelegPolicy}.
+ * @return the delegation policy response
+ */
+ public boolean getDelegPolicyState();
}
--- a/jdk/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java Wed Dec 16 16:25:08 2009 -0800
@@ -57,7 +57,10 @@
id = ((JavaObjectRef)value).getId();
}
value = value.dereference(snapshot, field);
- if (value.isHeapAllocated()) {
+ if (value.isHeapAllocated() &&
+ clazz.getLoader() == snapshot.getNullThing()) {
+ // static fields are only roots if they are in classes
+ // loaded by the root classloader.
JavaHeapObject ho = (JavaHeapObject) value;
String s = "Static reference from " + clazz.getName()
+ "." + field.getName();
--- a/jdk/src/share/classes/com/sun/tracing/ProviderFactory.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/com/sun/tracing/ProviderFactory.java Wed Dec 16 16:25:08 2009 -0800
@@ -4,7 +4,10 @@
import java.util.HashSet;
import java.io.PrintStream;
import java.lang.reflect.Field;
-import java.util.logging.Logger;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import sun.security.action.GetPropertyAction;
import sun.tracing.NullProviderFactory;
import sun.tracing.PrintStreamProviderFactory;
@@ -52,23 +55,17 @@
HashSet<ProviderFactory> factories = new HashSet<ProviderFactory>();
// Try to instantiate a DTraceProviderFactory
- String prop = null;
- try { prop = System.getProperty("com.sun.tracing.dtrace"); }
- catch (java.security.AccessControlException e) {
- Logger.getAnonymousLogger().fine(
- "Cannot access property com.sun.tracing.dtrace");
- }
+ String prop = AccessController.doPrivileged(
+ new GetPropertyAction("com.sun.tracing.dtrace"));
+
if ( (prop == null || !prop.equals("disable")) &&
DTraceProviderFactory.isSupported() ) {
factories.add(new DTraceProviderFactory());
}
// Try to instantiate an output stream factory
- try { prop = System.getProperty("sun.tracing.stream"); }
- catch (java.security.AccessControlException e) {
- Logger.getAnonymousLogger().fine(
- "Cannot access property sun.tracing.stream");
- }
+ prop = AccessController.doPrivileged(
+ new GetPropertyAction("sun.tracing.stream"));
if (prop != null) {
for (String spec : prop.split(",")) {
PrintStream ps = getPrintStreamFromSpec(spec);
@@ -89,22 +86,29 @@
}
}
- private static PrintStream getPrintStreamFromSpec(String spec) {
+ private static PrintStream getPrintStreamFromSpec(final String spec) {
try {
// spec is in the form of <class>.<field>, where <class> is
// a fully specified class name, and <field> is a static member
// in that class. The <field> must be a 'PrintStream' or subtype
// in order to be used.
- int fieldpos = spec.lastIndexOf('.');
- Class<?> cls = Class.forName(spec.substring(0, fieldpos));
- Field f = cls.getField(spec.substring(fieldpos + 1));
- Class<?> fieldType = f.getType();
+ final int fieldpos = spec.lastIndexOf('.');
+ final Class<?> cls = Class.forName(spec.substring(0, fieldpos));
+
+ Field f = AccessController.doPrivileged(new PrivilegedExceptionAction<Field>() {
+ public Field run() throws NoSuchFieldException {
+ return cls.getField(spec.substring(fieldpos + 1));
+ }
+ });
+
return (PrintStream)f.get(null);
- } catch (Exception e) {
- Logger.getAnonymousLogger().warning(
- "Could not parse sun.tracing.stream property: " + e);
+ } catch (ClassNotFoundException e) {
+ throw new AssertionError(e);
+ } catch (IllegalAccessException e) {
+ throw new AssertionError(e);
+ } catch (PrivilegedActionException e) {
+ throw new AssertionError(e);
}
- return null;
}
}
--- a/jdk/src/share/classes/java/awt/Component.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/awt/Component.java Wed Dec 16 16:25:08 2009 -0800
@@ -871,7 +871,7 @@
return comp.canBeFocusOwner();
}
- public boolean isVisible_NoClientCode(Component comp) {
+ public boolean isVisible(Component comp) {
return comp.isVisible_NoClientCode();
}
public void setRequestFocusController
@@ -885,6 +885,71 @@
public void setAppContext(Component comp, AppContext appContext) {
comp.appContext = appContext;
}
+ public Container getParent(Component comp) {
+ return comp.getParent_NoClientCode();
+ }
+ public void setParent(Component comp, Container parent) {
+ comp.parent = parent;
+ }
+ public void setSize(Component comp, int width, int height) {
+ comp.width = width;
+ comp.height = height;
+ }
+ public Point getLocation(Component comp) {
+ return comp.location_NoClientCode();
+ }
+ public void setLocation(Component comp, int x, int y) {
+ comp.x = x;
+ comp.y = y;
+ }
+ public boolean isEnabled(Component comp) {
+ return comp.isEnabledImpl();
+ }
+ public boolean isDisplayable(Component comp) {
+ return comp.peer != null;
+ }
+ public Cursor getCursor(Component comp) {
+ return comp.getCursor_NoClientCode();
+ }
+ public ComponentPeer getPeer(Component comp) {
+ return comp.peer;
+ }
+ public void setPeer(Component comp, ComponentPeer peer) {
+ comp.peer = peer;
+ }
+ public boolean isLightweight(Component comp) {
+ return (comp.peer instanceof LightweightPeer);
+ }
+ public boolean getIgnoreRepaint(Component comp) {
+ return comp.ignoreRepaint;
+ }
+ public int getWidth(Component comp) {
+ return comp.width;
+ }
+ public int getHeight(Component comp) {
+ return comp.height;
+ }
+ public int getX(Component comp) {
+ return comp.x;
+ }
+ public int getY(Component comp) {
+ return comp.y;
+ }
+ public Color getForeground(Component comp) {
+ return comp.foreground;
+ }
+ public Color getBackground(Component comp) {
+ return comp.background;
+ }
+ public void setBackground(Component comp, Color background) {
+ comp.background = background;
+ }
+ public Font getFont(Component comp) {
+ return comp.getFont_NoClientCode();
+ }
+ public void processEvent(Component comp, AWTEvent e) {
+ comp.processEvent(e);
+ }
});
}
@@ -8021,7 +8086,7 @@
Container getNativeContainer() {
Container p = parent;
while (p != null && p.peer instanceof LightweightPeer) {
- p = p.getParent();
+ p = p.getParent_NoClientCode();
}
return p;
}
--- a/jdk/src/share/classes/java/awt/EventDispatchThread.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/awt/EventDispatchThread.java Wed Dec 16 16:25:08 2009 -0800
@@ -104,11 +104,8 @@
} else {
stopEvent.dispatch();
}
- synchronized (theQueue) {
- if (theQueue.getDispatchThread() == this) {
- theQueue.detachDispatchThread();
- }
- }
+
+ theQueue.detachDispatchThread(this, false);
}
public void stopDispatching() {
@@ -142,35 +139,7 @@
}
});
} finally {
- /*
- * This synchronized block is to secure that the event dispatch
- * thread won't die in the middle of posting a new event to the
- * associated event queue. It is important because we notify
- * that the event dispatch thread is busy after posting a new event
- * to its queue, so the EventQueue.dispatchThread reference must
- * be valid at that point.
- */
- synchronized (theQueue) {
- if (theQueue.getDispatchThread() == this) {
- theQueue.detachDispatchThread();
- }
- /*
- * Event dispatch thread dies in case of an uncaught exception.
- * A new event dispatch thread for this queue will be started
- * only if a new event is posted to it. In case if no more
- * events are posted after this thread died all events that
- * currently are in the queue will never be dispatched.
- */
- /*
- * Fix for 4648733. Check both the associated java event
- * queue and the PostEventQueue.
- */
- if (theQueue.peekEvent() != null ||
- !SunToolkit.isPostEventQueueEmpty()) {
- theQueue.initDispatchThread();
- }
- AWTAutoShutdown.getInstance().notifyThreadFree(this);
- }
+ theQueue.detachDispatchThread(this, true);
}
}
--- a/jdk/src/share/classes/java/awt/EventQueue.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/awt/EventQueue.java Wed Dec 16 16:25:08 2009 -0800
@@ -45,6 +45,9 @@
import sun.awt.EventQueueItem;
import sun.awt.AWTAccessor;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+
/**
* <code>EventQueue</code> is a platform-independent class
* that queues events, both from the underlying peer classes
@@ -127,6 +130,14 @@
*/
private EventQueue previousQueue;
+ /*
+ * A single lock to synchronize the push()/pop() and related operations with
+ * all the EventQueues from the AppContext. Synchronization on any particular
+ * event queue(s) is not enough: we should lock the whole stack.
+ */
+ private final Lock pushPopLock;
+ private final Condition pushPopCond;
+
private EventDispatchThread dispatchThread;
private final ThreadGroup threadGroup =
@@ -158,11 +169,11 @@
static {
AWTAccessor.setEventQueueAccessor(
new AWTAccessor.EventQueueAccessor() {
- public EventQueue getNextQueue(EventQueue eventQueue) {
- return eventQueue.nextQueue;
+ public Thread getDispatchThread(EventQueue eventQueue) {
+ return eventQueue.getDispatchThread();
}
- public Thread getDispatchThread(EventQueue eventQueue) {
- return eventQueue.dispatchThread;
+ public boolean isDispatchThreadImpl(EventQueue eventQueue) {
+ return eventQueue.isDispatchThreadImpl();
}
});
}
@@ -179,6 +190,9 @@
* may call AppContext.getAppContext() before createNewAppContext()
* completes thus causing mess in thread group to appcontext mapping.
*/
+
+ pushPopLock = (Lock)AppContext.getAppContext().get(AppContext.EVENT_QUEUE_LOCK_KEY);
+ pushPopCond = (Condition)AppContext.getAppContext().get(AppContext.EVENT_QUEUE_COND_KEY);
}
/**
@@ -207,7 +221,8 @@
*/
final void postEventPrivate(AWTEvent theEvent) {
theEvent.isPosted = true;
- synchronized(this) {
+ pushPopLock.lock();
+ try {
if (dispatchThread == null && nextQueue == null) {
if (theEvent.getSource() == AWTAutoShutdown.getInstance()) {
return;
@@ -221,6 +236,8 @@
return;
}
postEvent(theEvent, getPriority(theEvent));
+ } finally {
+ pushPopLock.unlock();
}
}
@@ -280,9 +297,9 @@
if (theEvent.getSource() != AWTAutoShutdown.getInstance()) {
AWTAutoShutdown.getInstance().notifyThreadBusy(dispatchThread);
}
- notifyAll();
+ pushPopCond.signalAll();
} else if (notifyID) {
- notifyAll();
+ pushPopCond.signalAll();
}
} else {
// The event was not coalesced or has non-Component source.
@@ -290,7 +307,7 @@
queues[priority].tail.next = newItem;
queues[priority].tail = newItem;
if (notifyID) {
- notifyAll();
+ pushPopCond.signalAll();
}
}
}
@@ -482,7 +499,8 @@
* event queues are nested with push()/pop().
*/
SunToolkit.flushPendingEvents();
- synchronized (this) {
+ pushPopLock.lock();
+ try {
for (int i = NUM_PRIORITIES - 1; i >= 0; i--) {
if (queues[i].head != null) {
EventQueueItem entry = queues[i].head;
@@ -495,7 +513,9 @@
}
}
AWTAutoShutdown.getInstance().notifyThreadFree(dispatchThread);
- wait();
+ pushPopCond.await();
+ } finally {
+ pushPopLock.unlock();
}
} while(true);
}
@@ -508,7 +528,8 @@
* event queues are nested with push()/pop().
*/
SunToolkit.flushPendingEvents();
- synchronized (this) {
+ pushPopLock.lock();
+ try {
for (int i = 0; i < NUM_PRIORITIES; i++) {
for (EventQueueItem entry = queues[i].head, prev = null;
entry != null; prev = entry, entry = entry.next)
@@ -527,9 +548,11 @@
}
}
}
- this.waitForID = id;
- wait();
- this.waitForID = 0;
+ waitForID = id;
+ pushPopCond.await();
+ waitForID = 0;
+ } finally {
+ pushPopLock.unlock();
}
} while(true);
}
@@ -539,11 +562,16 @@
* without removing it.
* @return the first event
*/
- public synchronized AWTEvent peekEvent() {
- for (int i = NUM_PRIORITIES - 1; i >= 0; i--) {
- if (queues[i].head != null) {
- return queues[i].head.event;
+ public AWTEvent peekEvent() {
+ pushPopLock.lock();
+ try {
+ for (int i = NUM_PRIORITIES - 1; i >= 0; i--) {
+ if (queues[i].head != null) {
+ return queues[i].head.event;
+ }
}
+ } finally {
+ pushPopLock.unlock();
}
return null;
@@ -555,14 +583,19 @@
* @return the first event of the specified id or <code>null</code>
* if there is no such event
*/
- public synchronized AWTEvent peekEvent(int id) {
- for (int i = NUM_PRIORITIES - 1; i >= 0; i--) {
- EventQueueItem q = queues[i].head;
- for (; q != null; q = q.next) {
- if (q.event.getID() == id) {
- return q.event;
+ public AWTEvent peekEvent(int id) {
+ pushPopLock.lock();
+ try {
+ for (int i = NUM_PRIORITIES - 1; i >= 0; i--) {
+ EventQueueItem q = queues[i].head;
+ for (; q != null; q = q.next) {
+ if (q.event.getID() == id) {
+ return q.event;
+ }
}
}
+ } finally {
+ pushPopLock.unlock();
}
return null;
@@ -661,17 +694,27 @@
public static long getMostRecentEventTime() {
return Toolkit.getEventQueue().getMostRecentEventTimeImpl();
}
- private synchronized long getMostRecentEventTimeImpl() {
- return (Thread.currentThread() == dispatchThread)
- ? mostRecentEventTime
- : System.currentTimeMillis();
+ private long getMostRecentEventTimeImpl() {
+ pushPopLock.lock();
+ try {
+ return (Thread.currentThread() == dispatchThread)
+ ? mostRecentEventTime
+ : System.currentTimeMillis();
+ } finally {
+ pushPopLock.unlock();
+ }
}
/**
* @return most recent event time on all threads.
*/
- synchronized long getMostRecentEventTimeEx() {
- return mostRecentEventTime;
+ long getMostRecentEventTimeEx() {
+ pushPopLock.lock();
+ try {
+ return mostRecentEventTime;
+ } finally {
+ pushPopLock.unlock();
+ }
}
/**
@@ -689,10 +732,15 @@
public static AWTEvent getCurrentEvent() {
return Toolkit.getEventQueue().getCurrentEventImpl();
}
- private synchronized AWTEvent getCurrentEventImpl() {
- return (Thread.currentThread() == dispatchThread)
- ? ((AWTEvent)currentEvent.get())
- : null;
+ private AWTEvent getCurrentEventImpl() {
+ pushPopLock.lock();
+ try {
+ return (Thread.currentThread() == dispatchThread)
+ ? ((AWTEvent)currentEvent.get())
+ : null;
+ } finally {
+ pushPopLock.unlock();
+ }
}
/**
@@ -706,21 +754,22 @@
* @throws NullPointerException if <code>newEventQueue</code> is <code>null</code>
* @since 1.2
*/
- public synchronized void push(EventQueue newEventQueue) {
+ public void push(EventQueue newEventQueue) {
if (eventLog.isLoggable(PlatformLogger.FINE)) {
eventLog.fine("EventQueue.push(" + newEventQueue + ")");
}
- if (nextQueue != null) {
- nextQueue.push(newEventQueue);
- return;
- }
+ pushPopLock.lock();
+ try {
+ EventQueue toPush = this;
+ while (toPush.nextQueue != null) {
+ toPush = toPush.nextQueue;
+ }
- synchronized (newEventQueue) {
// Transfer all events forward to new EventQueue.
- while (peekEvent() != null) {
+ while (toPush.peekEvent() != null) {
try {
- newEventQueue.postEventPrivate(getNextEvent());
+ newEventQueue.postEventPrivate(toPush.getNextEvent());
} catch (InterruptedException ie) {
if (eventLog.isLoggable(PlatformLogger.FINE)) {
eventLog.fine("Interrupted push", ie);
@@ -728,27 +777,30 @@
}
}
- newEventQueue.previousQueue = this;
- }
- /*
- * Stop the event dispatch thread associated with the currently
- * active event queue, so that after the new queue is pushed
- * on the top this event dispatch thread won't prevent AWT from
- * being automatically shut down.
- * Use stopDispatchingLater() to avoid deadlock: stopDispatching()
- * waits for the dispatch thread to exit, so if the dispatch
- * thread attempts to synchronize on this EventQueue object
- * it will never exit since we already hold this lock.
- */
- if (dispatchThread != null) {
- dispatchThread.stopDispatchingLater();
- }
+ newEventQueue.previousQueue = toPush;
- nextQueue = newEventQueue;
+ /*
+ * Stop the event dispatch thread associated with the currently
+ * active event queue, so that after the new queue is pushed
+ * on the top this event dispatch thread won't prevent AWT from
+ * being automatically shut down.
+ * Use stopDispatchingLater() to avoid deadlock: stopDispatching()
+ * waits for the dispatch thread to exit, which in turn waits
+ * for the lock in EQ.detachDispatchThread(), which is hold by
+ * this method.
+ */
+ if (toPush.dispatchThread != null) {
+ toPush.dispatchThread.stopDispatchingLater();
+ }
- AppContext appContext = AppContext.getAppContext();
- if (appContext.get(AppContext.EVENT_QUEUE_KEY) == this) {
- appContext.put(AppContext.EVENT_QUEUE_KEY, newEventQueue);
+ toPush.nextQueue = newEventQueue;
+
+ AppContext appContext = AppContext.getAppContext();
+ if (appContext.get(AppContext.EVENT_QUEUE_KEY) == toPush) {
+ appContext.put(AppContext.EVENT_QUEUE_KEY, newEventQueue);
+ }
+ } finally {
+ pushPopLock.unlock();
}
}
@@ -770,25 +822,24 @@
eventLog.fine("EventQueue.pop(" + this + ")");
}
- // To prevent deadlock, we lock on the previous EventQueue before
- // this one. This uses the same locking order as everything else
- // in EventQueue.java, so deadlock isn't possible.
- EventQueue prev = previousQueue;
- synchronized ((prev != null) ? prev : this) {
- synchronized(this) {
- if (nextQueue != null) {
- nextQueue.pop();
- return;
+ EventDispatchThread dt = null;
+ pushPopLock.lock();
+ try {
+ EventQueue toPop = this;
+ while (toPop.nextQueue != null) {
+ toPop = toPop.nextQueue;
}
- if (previousQueue == null) {
+ EventQueue prev = toPop.previousQueue;
+ if (prev == null) {
throw new EmptyStackException();
}
+ toPop.previousQueue = null;
// Transfer all events back to previous EventQueue.
- previousQueue.nextQueue = null;
- while (peekEvent() != null) {
+ prev.nextQueue = null;
+ while (toPop.peekEvent() != null) {
try {
- previousQueue.postEventPrivate(getNextEvent());
+ prev.postEventPrivate(toPop.getNextEvent());
} catch (InterruptedException ie) {
if (eventLog.isLoggable(PlatformLogger.FINE)) {
eventLog.fine("Interrupted pop", ie);
@@ -797,14 +848,14 @@
}
AppContext appContext = AppContext.getAppContext();
if (appContext.get(AppContext.EVENT_QUEUE_KEY) == this) {
- appContext.put(AppContext.EVENT_QUEUE_KEY, previousQueue);
+ appContext.put(AppContext.EVENT_QUEUE_KEY, prev);
}
- previousQueue = null;
- }
+ dt = toPop.dispatchThread;
+ } finally {
+ pushPopLock.unlock();
}
- EventDispatchThread dt = this.dispatchThread;
if (dt != null) {
dt.stopDispatching(); // Must be done outside synchronized
// block to avoid possible deadlock
@@ -833,16 +884,27 @@
*/
public static boolean isDispatchThread() {
EventQueue eq = Toolkit.getEventQueue();
- EventQueue next = eq.nextQueue;
- while (next != null) {
- eq = next;
- next = eq.nextQueue;
+ return eq.isDispatchThreadImpl();
+ }
+
+ final boolean isDispatchThreadImpl() {
+ EventQueue eq = this;
+ pushPopLock.lock();
+ try {
+ EventQueue next = eq.nextQueue;
+ while (next != null) {
+ eq = next;
+ next = eq.nextQueue;
+ }
+ return (Thread.currentThread() == eq.dispatchThread);
+ } finally {
+ pushPopLock.unlock();
}
- return (Thread.currentThread() == eq.dispatchThread);
}
final void initDispatchThread() {
- synchronized (this) {
+ pushPopLock.lock();
+ try {
AppContext appContext = AppContext.getAppContext();
if (dispatchThread == null && !threadGroup.isDestroyed() && !appContext.isDisposed()) {
dispatchThread = (EventDispatchThread)
@@ -861,11 +923,45 @@
AWTAutoShutdown.getInstance().notifyThreadBusy(dispatchThread);
dispatchThread.start();
}
+ } finally {
+ pushPopLock.unlock();
}
}
- final void detachDispatchThread() {
- dispatchThread = null;
+ final void detachDispatchThread(EventDispatchThread edt, boolean restart) {
+ /*
+ * This synchronized block is to secure that the event dispatch
+ * thread won't die in the middle of posting a new event to the
+ * associated event queue. It is important because we notify
+ * that the event dispatch thread is busy after posting a new event
+ * to its queue, so the EventQueue.dispatchThread reference must
+ * be valid at that point.
+ */
+ pushPopLock.lock();
+ try {
+ EventDispatchThread oldDispatchThread = dispatchThread;
+ if (dispatchThread == edt) {
+ dispatchThread = null;
+ }
+ if (restart) {
+ /*
+ * Event dispatch thread dies in case of an uncaught exception.
+ * A new event dispatch thread for this queue will be started
+ * only if a new event is posted to it. In case if no more
+ * events are posted after this thread died all events that
+ * currently are in the queue will never be dispatched.
+ *
+ * Fix for 4648733. Check both the associated java event
+ * queue and the PostEventQueue.
+ */
+ if ((peekEvent() != null) || !SunToolkit.isPostEventQueueEmpty()) {
+ initDispatchThread();
+ }
+ AWTAutoShutdown.getInstance().notifyThreadFree(oldDispatchThread);
+ }
+ } finally {
+ pushPopLock.unlock();
+ }
}
/*
@@ -878,7 +974,12 @@
* @see java.awt.EventQueue#detachDispatchThread
*/
final EventDispatchThread getDispatchThread() {
- return dispatchThread;
+ pushPopLock.lock();
+ try {
+ return dispatchThread;
+ } finally {
+ pushPopLock.unlock();
+ }
}
/*
@@ -895,7 +996,8 @@
*/
final void removeSourceEvents(Object source, boolean removeAllEvents) {
SunToolkit.flushPendingEvents();
- synchronized (this) {
+ pushPopLock.lock();
+ try {
for (int i = 0; i < NUM_PRIORITIES; i++) {
EventQueueItem entry = queues[i].head;
EventQueueItem prev = null;
@@ -928,43 +1030,49 @@
}
queues[i].tail = prev;
}
+ } finally {
+ pushPopLock.unlock();
}
}
static void setCurrentEventAndMostRecentTime(AWTEvent e) {
Toolkit.getEventQueue().setCurrentEventAndMostRecentTimeImpl(e);
}
- private synchronized void setCurrentEventAndMostRecentTimeImpl(AWTEvent e)
- {
- if (Thread.currentThread() != dispatchThread) {
- return;
- }
+ private void setCurrentEventAndMostRecentTimeImpl(AWTEvent e) {
+ pushPopLock.lock();
+ try {
+ if (Thread.currentThread() != dispatchThread) {
+ return;
+ }
- currentEvent = new WeakReference(e);
+ currentEvent = new WeakReference(e);
- // This series of 'instanceof' checks should be replaced with a
- // polymorphic type (for example, an interface which declares a
- // getWhen() method). However, this would require us to make such
- // a type public, or to place it in sun.awt. Both of these approaches
- // have been frowned upon. So for now, we hack.
- //
- // In tiger, we will probably give timestamps to all events, so this
- // will no longer be an issue.
- long mostRecentEventTime2 = Long.MIN_VALUE;
- if (e instanceof InputEvent) {
- InputEvent ie = (InputEvent)e;
- mostRecentEventTime2 = ie.getWhen();
- } else if (e instanceof InputMethodEvent) {
- InputMethodEvent ime = (InputMethodEvent)e;
- mostRecentEventTime2 = ime.getWhen();
- } else if (e instanceof ActionEvent) {
- ActionEvent ae = (ActionEvent)e;
- mostRecentEventTime2 = ae.getWhen();
- } else if (e instanceof InvocationEvent) {
- InvocationEvent ie = (InvocationEvent)e;
- mostRecentEventTime2 = ie.getWhen();
+ // This series of 'instanceof' checks should be replaced with a
+ // polymorphic type (for example, an interface which declares a
+ // getWhen() method). However, this would require us to make such
+ // a type public, or to place it in sun.awt. Both of these approaches
+ // have been frowned upon. So for now, we hack.
+ //
+ // In tiger, we will probably give timestamps to all events, so this
+ // will no longer be an issue.
+ long mostRecentEventTime2 = Long.MIN_VALUE;
+ if (e instanceof InputEvent) {
+ InputEvent ie = (InputEvent)e;
+ mostRecentEventTime2 = ie.getWhen();
+ } else if (e instanceof InputMethodEvent) {
+ InputMethodEvent ime = (InputMethodEvent)e;
+ mostRecentEventTime2 = ime.getWhen();
+ } else if (e instanceof ActionEvent) {
+ ActionEvent ae = (ActionEvent)e;
+ mostRecentEventTime2 = ae.getWhen();
+ } else if (e instanceof InvocationEvent) {
+ InvocationEvent ie = (InvocationEvent)e;
+ mostRecentEventTime2 = ie.getWhen();
+ }
+ mostRecentEventTime = Math.max(mostRecentEventTime, mostRecentEventTime2);
+ } finally {
+ pushPopLock.unlock();
}
- mostRecentEventTime = Math.max(mostRecentEventTime, mostRecentEventTime2);
}
/**
@@ -1045,15 +1153,18 @@
* or starts a new one otherwise.
*/
private void wakeup(boolean isShutdown) {
- synchronized(this) {
+ pushPopLock.lock();
+ try {
if (nextQueue != null) {
// Forward call to the top of EventQueue stack.
nextQueue.wakeup(isShutdown);
} else if (dispatchThread != null) {
- notifyAll();
+ pushPopCond.signalAll();
} else if (!isShutdown) {
initDispatchThread();
}
+ } finally {
+ pushPopLock.unlock();
}
}
}
--- a/jdk/src/share/classes/java/awt/KeyboardFocusManager.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/awt/KeyboardFocusManager.java Wed Dec 16 16:25:08 2009 -0800
@@ -53,8 +53,7 @@
import java.util.StringTokenizer;
import java.util.WeakHashMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import sun.util.logging.PlatformLogger;
import sun.awt.AppContext;
import sun.awt.HeadlessToolkit;
@@ -111,7 +110,7 @@
{
// Shared focus engine logger
- private static final Logger focusLog = Logger.getLogger("java.awt.focus.KeyboardFocusManager");
+ private static final PlatformLogger focusLog = PlatformLogger.getLogger("java.awt.focus.KeyboardFocusManager");
static {
/* ensure that the necessary native libraries are loaded */
@@ -154,7 +153,7 @@
*/
private static native void initIDs();
- private static final Logger log = Logger.getLogger("java.awt.KeyboardFocusManager");
+ private static final PlatformLogger log = PlatformLogger.getLogger("java.awt.KeyboardFocusManager");
/**
* The identifier for the Forward focus traversal keys.
@@ -504,8 +503,8 @@
if (this == getCurrentKeyboardFocusManager()) {
return focusOwner;
} else {
- if (focusLog.isLoggable(Level.FINER)) {
- focusLog.log(Level.FINER, "This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
+ if (focusLog.isLoggable(PlatformLogger.FINER)) {
+ focusLog.finer("This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
}
throw new SecurityException(notPrivileged);
}
@@ -609,9 +608,9 @@
}
void setNativeFocusOwner(Component comp) {
- if (focusLog.isLoggable(Level.FINEST)) {
- focusLog.log(Level.FINEST, "Calling peer {0} setCurrentFocusOwner for {1}",
- new Object[] {String.valueOf(peer), String.valueOf(comp)});
+ if (focusLog.isLoggable(PlatformLogger.FINEST)) {
+ focusLog.finest("Calling peer {0} setCurrentFocusOwner for {1}",
+ String.valueOf(peer), String.valueOf(comp));
}
peer.setCurrentFocusOwner(comp);
}
@@ -673,8 +672,8 @@
if (this == getCurrentKeyboardFocusManager()) {
return permanentFocusOwner;
} else {
- if (focusLog.isLoggable(Level.FINER)) {
- focusLog.log(Level.FINER, "This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
+ if (focusLog.isLoggable(PlatformLogger.FINER)) {
+ focusLog.finer("This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
}
throw new SecurityException(notPrivileged);
}
@@ -781,8 +780,8 @@
if (this == getCurrentKeyboardFocusManager()) {
return focusedWindow;
} else {
- if (focusLog.isLoggable(Level.FINER)) {
- focusLog.log(Level.FINER, "This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
+ if (focusLog.isLoggable(PlatformLogger.FINER)) {
+ focusLog.finer("This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
}
throw new SecurityException(notPrivileged);
}
@@ -885,8 +884,8 @@
if (this == getCurrentKeyboardFocusManager()) {
return activeWindow;
} else {
- if (focusLog.isLoggable(Level.FINER)) {
- focusLog.log(Level.FINER, "This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
+ if (focusLog.isLoggable(PlatformLogger.FINER)) {
+ focusLog.finer("This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
}
throw new SecurityException(notPrivileged);
}
@@ -919,8 +918,8 @@
Window oldActiveWindow;
synchronized (KeyboardFocusManager.class) {
oldActiveWindow = getActiveWindow();
- if (focusLog.isLoggable(Level.FINER)) {
- focusLog.log(Level.FINER, "Setting global active window to " + activeWindow + ", old active " + oldActiveWindow);
+ if (focusLog.isLoggable(PlatformLogger.FINER)) {
+ focusLog.finer("Setting global active window to " + activeWindow + ", old active " + oldActiveWindow);
}
try {
@@ -1215,8 +1214,8 @@
if (this == getCurrentKeyboardFocusManager()) {
return currentFocusCycleRoot;
} else {
- if (focusLog.isLoggable(Level.FINER)) {
- focusLog.log(Level.FINER, "This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
+ if (focusLog.isLoggable(PlatformLogger.FINER)) {
+ focusLog.finer("This manager is " + this + ", current is " + getCurrentKeyboardFocusManager());
}
throw new SecurityException(notPrivileged);
}
@@ -2149,9 +2148,9 @@
HeavyweightFocusRequest(Component heavyweight, Component descendant,
boolean temporary, CausedFocusEvent.Cause cause) {
- if (log.isLoggable(Level.FINE)) {
+ if (log.isLoggable(PlatformLogger.FINE)) {
if (heavyweight == null) {
- log.log(Level.FINE, "Assertion (heavyweight != null) failed");
+ log.fine("Assertion (heavyweight != null) failed");
}
}
@@ -2161,12 +2160,12 @@
}
boolean addLightweightRequest(Component descendant,
boolean temporary, CausedFocusEvent.Cause cause) {
- if (log.isLoggable(Level.FINE)) {
+ if (log.isLoggable(PlatformLogger.FINE)) {
if (this == HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER) {
- log.log(Level.FINE, "Assertion (this != HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER) failed");
+ log.fine("Assertion (this != HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER) failed");
}
if (descendant == null) {
- log.log(Level.FINE, "Assertion (descendant != null) failed");
+ log.fine("Assertion (descendant != null) failed");
}
}
@@ -2339,12 +2338,12 @@
(Component heavyweight, Component descendant, boolean temporary,
boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause)
{
- if (log.isLoggable(Level.FINE)) {
+ if (log.isLoggable(PlatformLogger.FINE)) {
if (heavyweight == null) {
- log.log(Level.FINE, "Assertion (heavyweight != null) failed");
+ log.fine("Assertion (heavyweight != null) failed");
}
if (time == 0) {
- log.log(Level.FINE, "Assertion (time != 0) failed");
+ log.fine("Assertion (time != 0) failed");
}
}
@@ -2361,31 +2360,31 @@
Component currentFocusOwner = thisManager.getGlobalFocusOwner();
Component nativeFocusOwner = thisManager.getNativeFocusOwner();
Window nativeFocusedWindow = thisManager.getNativeFocusedWindow();
- if (focusLog.isLoggable(Level.FINER)) {
- focusLog.log(Level.FINER, "SNFH for {0} in {1}",
- new Object[] {String.valueOf(descendant), String.valueOf(heavyweight)});
+ if (focusLog.isLoggable(PlatformLogger.FINER)) {
+ focusLog.finer("SNFH for {0} in {1}",
+ String.valueOf(descendant), String.valueOf(heavyweight));
}
- if (focusLog.isLoggable(Level.FINEST)) {
- focusLog.log(Level.FINEST, "0. Current focus owner {0}",
- String.valueOf(currentFocusOwner));
- focusLog.log(Level.FINEST, "0. Native focus owner {0}",
- String.valueOf(nativeFocusOwner));
- focusLog.log(Level.FINEST, "0. Native focused window {0}",
- String.valueOf(nativeFocusedWindow));
+ if (focusLog.isLoggable(PlatformLogger.FINEST)) {
+ focusLog.finest("0. Current focus owner {0}",
+ String.valueOf(currentFocusOwner));
+ focusLog.finest("0. Native focus owner {0}",
+ String.valueOf(nativeFocusOwner));
+ focusLog.finest("0. Native focused window {0}",
+ String.valueOf(nativeFocusedWindow));
}
synchronized (heavyweightRequests) {
HeavyweightFocusRequest hwFocusRequest = getLastHWRequest();
- if (focusLog.isLoggable(Level.FINEST)) {
- focusLog.log(Level.FINEST, "Request {0}", String.valueOf(hwFocusRequest));
+ if (focusLog.isLoggable(PlatformLogger.FINEST)) {
+ focusLog.finest("Request {0}", String.valueOf(hwFocusRequest));
}
if (hwFocusRequest == null &&
heavyweight == nativeFocusOwner)
{
if (descendant == currentFocusOwner) {
// Redundant request.
- if (focusLog.isLoggable(Level.FINEST))
- focusLog.log(Level.FINEST, "1. SNFH_FAILURE for {0}",
- String.valueOf(descendant));
+ if (focusLog.isLoggable(PlatformLogger.FINEST))
+ focusLog.finest("1. SNFH_FAILURE for {0}",
+ String.valueOf(descendant));
return SNFH_FAILURE;
}
@@ -2417,8 +2416,8 @@
// SunToolkit.postPriorityEvent(newFocusOwnerEvent);
SunToolkit.postEvent(descendant.appContext, newFocusOwnerEvent);
- if (focusLog.isLoggable(Level.FINEST))
- focusLog.log(Level.FINEST, "2. SNFH_HANDLED for {0}", String.valueOf(descendant));
+ if (focusLog.isLoggable(PlatformLogger.FINEST))
+ focusLog.finest("2. SNFH_HANDLED for {0}", String.valueOf(descendant));
return SNFH_SUCCESS_HANDLED;
} else if (hwFocusRequest != null &&
hwFocusRequest.heavyweight == heavyweight) {
@@ -2431,7 +2430,7 @@
manager.enqueueKeyEvents(time, descendant);
}
- if (focusLog.isLoggable(Level.FINEST))
+ if (focusLog.isLoggable(PlatformLogger.FINEST))
focusLog.finest("3. SNFH_HANDLED for lightweight" +
descendant + " in " + heavyweight);
return SNFH_SUCCESS_HANDLED;
@@ -2454,7 +2453,7 @@
(hwFocusRequest != null)
? hwFocusRequest.heavyweight
: nativeFocusedWindow)) {
- if (focusLog.isLoggable(Level.FINEST))
+ if (focusLog.isLoggable(PlatformLogger.FINEST))
focusLog.finest("4. SNFH_FAILURE for " + descendant);
return SNFH_FAILURE;
}
@@ -2464,7 +2463,7 @@
heavyweightRequests.add
(new HeavyweightFocusRequest(heavyweight, descendant,
temporary, cause));
- if (focusLog.isLoggable(Level.FINEST))
+ if (focusLog.isLoggable(PlatformLogger.FINEST))
focusLog.finest("5. SNFH_PROCEED for " + descendant);
return SNFH_SUCCESS_PROCEED;
}
@@ -2855,14 +2854,14 @@
}
KeyboardFocusManager manager = getCurrentKeyboardFocusManager();
- if (focusLog.isLoggable(Level.FINER)) {
+ if (focusLog.isLoggable(PlatformLogger.FINER)) {
if (event instanceof FocusEvent || event instanceof WindowEvent) {
- focusLog.log(Level.FINER, ">>> {0}", new Object[] {String.valueOf(event)});
+ focusLog.finer(">>> {0}", String.valueOf(event));
}
- if (focusLog.isLoggable(Level.FINER) && event instanceof KeyEvent) {
- focusLog.log(Level.FINER, " focus owner is {0}",
- new Object[] {String.valueOf(manager.getGlobalFocusOwner())});
- focusLog.log(Level.FINER, ">>> {0}", new Object[] {String.valueOf(event)});
+ if (focusLog.isLoggable(PlatformLogger.FINER) && event instanceof KeyEvent) {
+ focusLog.finer(" focus owner is {0}",
+ String.valueOf(manager.getGlobalFocusOwner()));
+ focusLog.finer(">>> {0}", String.valueOf(event));
}
}
@@ -2946,9 +2945,9 @@
}
}
static void removeLastFocusRequest(Component heavyweight) {
- if (log.isLoggable(Level.FINE)) {
+ if (log.isLoggable(PlatformLogger.FINE)) {
if (heavyweight == null) {
- log.log(Level.FINE, "Assertion (heavyweight != null) failed");
+ log.fine("Assertion (heavyweight != null) failed");
}
}
--- a/jdk/src/share/classes/java/awt/Window.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/awt/Window.java Wed Dec 16 16:25:08 2009 -0800
@@ -148,6 +148,51 @@
public class Window extends Container implements Accessible {
/**
+ * Enumeration of available <i>window types</i>.
+ *
+ * A window type defines the generic visual appearance and behavior of a
+ * top-level window. For example, the type may affect the kind of
+ * decorations of a decorated {@code Frame} or {@code Dialog} instance.
+ * <p>
+ * Some platforms may not fully support a certain window type. Depending on
+ * the level of support, some properties of the window type may be
+ * disobeyed.
+ *
+ * @see #getType
+ * @see #setType
+ * @since 1.7
+ */
+ public static enum Type {
+ /**
+ * Represents a <i>normal</i> window.
+ *
+ * This is the default type for objects of the {@code Window} class or
+ * its descendants. Use this type for regular top-level windows.
+ */
+ NORMAL,
+
+ /**
+ * Represents a <i>utility</i> window.
+ *
+ * A utility window is usually a small window such as a toolbar or a
+ * palette. The native system may render the window with smaller
+ * title-bar if the window is either a {@code Frame} or a {@code
+ * Dialog} object, and if it has its decorations enabled.
+ */
+ UTILITY,
+
+ /**
+ * Represents a <i>popup</i> window.
+ *
+ * A popup window is a temporary window such as a drop-down menu or a
+ * tooltip. On some platforms, windows of that type may be forcibly
+ * made undecorated even if they are instances of the {@code Frame} or
+ * {@code Dialog} class, and have decorations enabled.
+ */
+ POPUP
+ }
+
+ /**
* This represents the warning message that is
* to be displayed in a non secure window. ie :
* a window that has a security manager installed for
@@ -2718,6 +2763,52 @@
}
/**
+ * Window type.
+ *
+ * Synchronization: ObjectLock
+ */
+ private Type type = Type.NORMAL;
+
+ /**
+ * Sets the type of the window.
+ *
+ * This method can only be called while the window is not displayable.
+ *
+ * @throws IllegalComponentStateException if the window
+ * is displayable.
+ * @throws IllegalArgumentException if the type is {@code null}
+ * @see Component#isDisplayable
+ * @see #getType
+ * @since 1.7
+ */
+ public void setType(Type type) {
+ if (type == null) {
+ throw new IllegalArgumentException("type should not be null.");
+ }
+ synchronized (getTreeLock()) {
+ if (isDisplayable()) {
+ throw new IllegalComponentStateException(
+ "The window is displayable.");
+ }
+ synchronized (getObjectLock()) {
+ this.type = type;
+ }
+ }
+ }
+
+ /**
+ * Returns the type of the window.
+ *
+ * @see #setType
+ * @since 1.7
+ */
+ public Type getType() {
+ synchronized (getObjectLock()) {
+ return type;
+ }
+ }
+
+ /**
* The window serialized data version.
*
* @serial
@@ -3873,6 +3964,18 @@
public void setLWRequestStatus(Window changed, boolean status) {
changed.syncLWRequests = status;
}
+
+ public boolean isAutoRequestFocus(Window w) {
+ return w.autoRequestFocus;
+ }
+
+ public boolean isTrayIconWindow(Window w) {
+ return w.isTrayIconWindow;
+ }
+
+ public void setTrayIconWindow(Window w, boolean isTrayIconWindow) {
+ w.isTrayIconWindow = isTrayIconWindow;
+ }
}); // WindowAccessor
} // static
--- a/jdk/src/share/classes/java/lang/ClassLoader.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/lang/ClassLoader.java Wed Dec 16 16:25:08 2009 -0800
@@ -175,15 +175,8 @@
public abstract class ClassLoader {
private static native void registerNatives();
-
- // Set of classes which are registered as parallel capable class loaders
- private static final Set<Class<? extends ClassLoader>> parallelLoaders
- = Collections.newSetFromMap(Collections.synchronizedMap
- (new WeakHashMap<Class<? extends ClassLoader>, Boolean>()));
-
static {
registerNatives();
- parallelLoaders.add(ClassLoader.class);
}
// The parent class loader for delegation
@@ -191,6 +184,52 @@
// must be added *after* it.
private final ClassLoader parent;
+ /**
+ * Encapsulates the set of parallel capable loader types.
+ */
+ private static class ParallelLoaders {
+ private ParallelLoaders() {}
+
+ // the set of parallel capable loader types
+ private static final Set<Class<? extends ClassLoader>> loaderTypes =
+ Collections.newSetFromMap(
+ new WeakHashMap<Class<? extends ClassLoader>, Boolean>());
+ static {
+ synchronized (loaderTypes) { loaderTypes.add(ClassLoader.class); }
+ }
+
+ /**
+ * Registers the given class loader type as parallel capabale.
+ * Returns {@code true} is successfully registered; {@code false} if
+ * loader's super class is not registered.
+ */
+ static boolean register(Class<? extends ClassLoader> c) {
+ synchronized (loaderTypes) {
+ if (loaderTypes.contains(c.getSuperclass())) {
+ // register the class loader as parallel capable
+ // if and only if all of its super classes are.
+ // Note: given current classloading sequence, if
+ // the immediate super class is parallel capable,
+ // all the super classes higher up must be too.
+ loaderTypes.add(c);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ /**
+ * Returns {@code true} if the given class loader type is
+ * registered as parallel capable.
+ */
+ static boolean isRegistered(Class<? extends ClassLoader> c) {
+ synchronized (loaderTypes) {
+ return loaderTypes.contains(c);
+ }
+ }
+ }
+
// Maps class name to the corresponding lock object when the current
// class loader is parallel capable.
// Note: VM also uses this field to decide if the current class loader
@@ -237,7 +276,7 @@
private ClassLoader(Void unused, ClassLoader parent) {
this.parent = parent;
- if (parallelLoaders.contains(this.getClass())) {
+ if (ParallelLoaders.isRegistered(this.getClass())) {
parallelLockMap = new ConcurrentHashMap<String, Object>();
package2certs = new ConcurrentHashMap<String, Certificate[]>();
domains =
@@ -1194,24 +1233,7 @@
* @since 1.7
*/
protected static boolean registerAsParallelCapable() {
- Class<? extends ClassLoader> caller = getCaller(1);
- Class superCls = caller.getSuperclass();
- boolean result = false;
- // Explicit synchronization needed for composite action
- synchronized (parallelLoaders) {
- if (!parallelLoaders.contains(caller)) {
- if (parallelLoaders.contains(superCls)) {
- // register the immediate caller as parallel capable
- // if and only if all of its super classes are.
- // Note: given current classloading sequence, if
- // the immediate super class is parallel capable,
- // all the super classes higher up must be too.
- result = true;
- parallelLoaders.add(caller);
- }
- } else result = true;
- }
- return result;
+ return ParallelLoaders.register(getCaller(1));
}
/**
@@ -2174,4 +2196,3 @@
return sys;
}
}
-
--- a/jdk/src/share/classes/java/lang/System.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/lang/System.java Wed Dec 16 16:25:08 2009 -0800
@@ -620,6 +620,20 @@
}
/**
+ * Returns the system-dependent line separator string. It always
+ * returns the same value - the initial value of the {@linkplain
+ * #getProperty(String) system property} {@code line.separator}.
+ *
+ * <p>On UNIX systems, it returns {@code "\n"}; on Microsoft
+ * Windows systems it returns {@code "\r\n"}.
+ */
+ public static String lineSeparator() {
+ return lineSeparator;
+ }
+
+ private static String lineSeparator;
+
+ /**
* Sets the system properties to the <code>Properties</code>
* argument.
* <p>
@@ -1104,6 +1118,7 @@
private static void initializeSystemClass() {
props = new Properties();
initProperties(props);
+ lineSeparator = props.getProperty("line.separator");
sun.misc.Version.init();
// Workaround until DownloadManager initialization is revisited.
@@ -1192,7 +1207,7 @@
}
/* returns the class of the caller. */
- static Class getCallerClass() {
+ static Class<?> getCallerClass() {
// NOTE use of more generic Reflection.getCallerClass()
return Reflection.getCallerClass(3);
}
--- a/jdk/src/share/classes/java/net/CookieManager.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/net/CookieManager.java Wed Dec 16 16:25:08 2009 -0800
@@ -30,6 +30,7 @@
import java.util.Collections;
import java.util.Comparator;
import java.io.IOException;
+import sun.util.logging.PlatformLogger;
/**
* CookieManager provides a concrete implementation of {@link CookieHandler},
@@ -263,6 +264,7 @@
if (cookieJar == null)
return;
+ PlatformLogger logger = PlatformLogger.getLogger("java.net.CookieManager");
for (String headerKey : responseHeaders.keySet()) {
// RFC 2965 3.2.2, key must be 'Set-Cookie2'
// we also accept 'Set-Cookie' here for backward compatibility
@@ -277,7 +279,16 @@
for (String headerValue : responseHeaders.get(headerKey)) {
try {
- List<HttpCookie> cookies = HttpCookie.parse(headerValue);
+ List<HttpCookie> cookies;
+ try {
+ cookies = HttpCookie.parse(headerValue);
+ } catch (IllegalArgumentException e) {
+ // Bogus header, make an empty list and log the error
+ cookies = java.util.Collections.EMPTY_LIST;
+ if (logger.isLoggable(PlatformLogger.SEVERE)) {
+ logger.severe("Invalid cookie for " + uri + ": " + headerValue);
+ }
+ }
for (HttpCookie cookie : cookies) {
if (cookie.getPath() == null) {
// If no path is specified, then by default
--- a/jdk/src/share/classes/java/net/HttpCookie.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/net/HttpCookie.java Wed Dec 16 16:25:08 2009 -0800
@@ -1036,7 +1036,7 @@
int version = Integer.parseInt(attrValue);
cookie.setVersion(version);
} catch (NumberFormatException ignored) {
- throw new IllegalArgumentException("Illegal cookie version attribute");
+ // Just ignore bogus version, it will default to 0 or 1
}
}
});
@@ -1147,12 +1147,15 @@
}
private static String stripOffSurroundingQuote(String str) {
- if (str != null && str.length() > 0 &&
+ if (str != null && str.length() > 2 &&
str.charAt(0) == '"' && str.charAt(str.length() - 1) == '"') {
return str.substring(1, str.length() - 1);
- } else {
- return str;
}
+ if (str != null && str.length() > 2 &&
+ str.charAt(0) == '\'' && str.charAt(str.length() - 1) == '\'') {
+ return str.substring(1, str.length() - 1);
+ }
+ return str;
}
private static boolean equalsIgnoreCase(String s, String t) {
--- a/jdk/src/share/classes/java/nio/channels/Selector.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/nio/channels/Selector.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,6 +25,7 @@
package java.nio.channels;
+import java.io.Closeable;
import java.io.IOException;
import java.nio.channels.spi.SelectorProvider;
import java.util.Set;
@@ -202,7 +203,7 @@
* @see SelectionKey
*/
-public abstract class Selector {
+public abstract class Selector implements Closeable {
/**
* Initializes a new instance of this class.
--- a/jdk/src/share/classes/java/util/DualPivotQuicksort.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/util/DualPivotQuicksort.java Wed Dec 16 16:25:08 2009 -0800
@@ -36,12 +36,12 @@
* @author Jon Bentley
* @author Josh Bloch
*
- * @version 2009.11.16 m765.827.v12a
+ * @version 2009.11.29 m765.827.12i
*/
final class DualPivotQuicksort {
/**
- * Suppresses default constructor.
+ * Prevents instantiation.
*/
private DualPivotQuicksort() {}
@@ -84,7 +84,7 @@
* Sorts the specified range of the array into ascending order. The range
* to be sorted extends from the index {@code fromIndex}, inclusive, to
* the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
- * the range to be sorted is empty.
+ * the range to be sorted is empty (and the call is a no-op).
*
* @param a the array to be sorted
* @param fromIndex the index of the first element, inclusive, to be sorted
@@ -101,8 +101,8 @@
/**
* Sorts the specified range of the array into ascending order. This
* method differs from the public {@code sort} method in that the
- * {@code right} index is inclusive, and it does no range checking on
- * {@code left} or {@code right}.
+ * {@code right} index is inclusive, and it does no range checking
+ * on {@code left} or {@code right}.
*
* @param a the array to be sorted
* @param left the index of the first element, inclusive, to be sorted
@@ -111,13 +111,13 @@
private static void doSort(int[] a, int left, int right) {
// Use insertion sort on tiny arrays
if (right - left + 1 < INSERTION_SORT_THRESHOLD) {
- for (int k = left + 1; k <= right; k++) {
- int ak = a[k];
+ for (int i = left + 1; i <= right; i++) {
+ int ai = a[i];
int j;
- for (j = k - 1; j >= left && ak < a[j]; j--) {
+ for (j = i - 1; j >= left && ai < a[j]; j--) {
a[j + 1] = a[j];
}
- a[j + 1] = ak;
+ a[j + 1] = ai;
}
} else { // Use Dual-Pivot Quicksort on large arrays
dualPivotQuicksort(a, left, right);
@@ -162,7 +162,7 @@
* second terciles of the array. Note that pivot1 <= pivot2.
*
* The pivots are stored in local variables, and the first and
- * the last of the sorted elements are moved to the locations
+ * the last of the elements to be sorted are moved to the locations
* formerly occupied by the pivots. When partitioning is complete,
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
@@ -170,27 +170,26 @@
int pivot1 = ae2; a[e2] = a[left];
int pivot2 = ae4; a[e4] = a[right];
- /*
- * Partitioning
- *
- * left part center part right part
- * ------------------------------------------------------------
- * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ]
- * ------------------------------------------------------------
- * ^ ^ ^
- * | | |
- * less k great
- */
-
// Pointers
int less = left + 1; // The index of first element of center part
int great = right - 1; // The index before first element of right part
- boolean pivotsDiffer = pivot1 != pivot2;
+ boolean pivotsDiffer = (pivot1 != pivot2);
if (pivotsDiffer) {
/*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +------------------------------------------------------------+
+ * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
+ * +------------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
* Invariants:
+ *
* all in (left, less) < pivot1
* pivot1 <= all in [less, k) <= pivot2
* all in (great, right) > pivot2
@@ -200,37 +199,37 @@
outer:
for (int k = less; k <= great; k++) {
int ak = a[k];
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else if (ak > pivot2) {
+ } else if (ak > pivot2) { // Move a[k] to right part
while (a[great] > pivot2) {
- if (k == great--) {
+ if (great-- == k) {
break outer;
}
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // pivot1 <= a[great] <= pivot2
+ a[k] = a[great];
+ a[great--] = ak;
}
}
}
} else { // Pivots are equal
/*
- * Partition degenerates to the traditional 3-way
- * (or "Dutch National Flag") partition:
+ * Partition degenerates to the traditional 3-way,
+ * or "Dutch National Flag", partition:
*
* left part center part right part
- * -------------------------------------------------
- * [ < pivot | == pivot | ? | > pivot ]
- * -------------------------------------------------
- *
+ * +----------------------------------------------+
+ * | < pivot | == pivot | ? | > pivot |
+ * +----------------------------------------------+
* ^ ^ ^
* | | |
* less k great
@@ -243,30 +242,34 @@
*
* Pointer k is the first index of ?-part
*/
- outer:
for (int k = less; k <= great; k++) {
int ak = a[k];
if (ak == pivot1) {
continue;
}
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else { // a[k] > pivot
+ } else { // (a[k] > pivot1) - Move a[k] to right part
+ /*
+ * We know that pivot1 == a[e3] == pivot2. Thus, we know
+ * that great will still be >= k when the following loop
+ * terminates, even though we don't test for it explicitly.
+ * In other words, a[e3] acts as a sentinel for great.
+ */
while (a[great] > pivot1) {
- if (k == great--) {
- break outer;
- }
+ great--;
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // a[great] == pivot1
+ a[k] = pivot1;
+ a[great--] = ak;
}
}
}
@@ -289,26 +292,55 @@
}
/*
- * If center part is too large (comprises > 5/6 of
- * the array), swap internal pivot values to ends
+ * If center part is too large (comprises > 2/3 of the array),
+ * swap internal pivot values to ends
*/
- if (less < e1 && e5 < great) {
+ if (less < e1 && great > e5) {
while (a[less] == pivot1) {
less++;
}
while (a[great] == pivot2) {
great--;
}
- for (int k = less + 1; k <= great; ) {
+
+ /*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +----------------------------------------------------------+
+ * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
+ * +----------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (*, less) == pivot1
+ * pivot1 < all in [less, k) < pivot2
+ * all in (great, *) == pivot2
+ *
+ * Pointer k is the first index of ?-part
+ */
+ outer:
+ for (int k = less; k <= great; k++) {
int ak = a[k];
- if (ak == pivot1) {
- a[k++] = a[less];
+ if (ak == pivot2) { // Move a[k] to right part
+ while (a[great] == pivot2) {
+ if (great-- == k) {
+ break outer;
+ }
+ }
+ if (a[great] == pivot1) {
+ a[k] = a[less];
+ a[less++] = pivot1;
+ } else { // pivot1 < a[great] < pivot2
+ a[k] = a[great];
+ }
+ a[great--] = pivot2;
+ } else if (ak == pivot1) { // Move a[k] to left part
+ a[k] = a[less];
a[less++] = pivot1;
- } else if (ak == pivot2) {
- a[k] = a[great];
- a[great--] = pivot2;
- } else {
- k++;
}
}
}
@@ -330,7 +362,7 @@
* Sorts the specified range of the array into ascending order. The range
* to be sorted extends from the index {@code fromIndex}, inclusive, to
* the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
- * the range to be sorted is empty.
+ * the range to be sorted is empty (and the call is a no-op).
*
* @param a the array to be sorted
* @param fromIndex the index of the first element, inclusive, to be sorted
@@ -357,13 +389,13 @@
private static void doSort(long[] a, int left, int right) {
// Use insertion sort on tiny arrays
if (right - left + 1 < INSERTION_SORT_THRESHOLD) {
- for (int k = left + 1; k <= right; k++) {
- long ak = a[k];
+ for (int i = left + 1; i <= right; i++) {
+ long ai = a[i];
int j;
- for (j = k - 1; j >= left && ak < a[j]; j--) {
+ for (j = i - 1; j >= left && ai < a[j]; j--) {
a[j + 1] = a[j];
}
- a[j + 1] = ak;
+ a[j + 1] = ai;
}
} else { // Use Dual-Pivot Quicksort on large arrays
dualPivotQuicksort(a, left, right);
@@ -408,7 +440,7 @@
* second terciles of the array. Note that pivot1 <= pivot2.
*
* The pivots are stored in local variables, and the first and
- * the last of the sorted elements are moved to the locations
+ * the last of the elements to be sorted are moved to the locations
* formerly occupied by the pivots. When partitioning is complete,
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
@@ -416,27 +448,26 @@
long pivot1 = ae2; a[e2] = a[left];
long pivot2 = ae4; a[e4] = a[right];
- /*
- * Partitioning
- *
- * left part center part right part
- * ------------------------------------------------------------
- * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ]
- * ------------------------------------------------------------
- * ^ ^ ^
- * | | |
- * less k great
- */
-
// Pointers
int less = left + 1; // The index of first element of center part
int great = right - 1; // The index before first element of right part
- boolean pivotsDiffer = pivot1 != pivot2;
+ boolean pivotsDiffer = (pivot1 != pivot2);
if (pivotsDiffer) {
/*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +------------------------------------------------------------+
+ * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
+ * +------------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
* Invariants:
+ *
* all in (left, less) < pivot1
* pivot1 <= all in [less, k) <= pivot2
* all in (great, right) > pivot2
@@ -446,37 +477,37 @@
outer:
for (int k = less; k <= great; k++) {
long ak = a[k];
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else if (ak > pivot2) {
+ } else if (ak > pivot2) { // Move a[k] to right part
while (a[great] > pivot2) {
- if (k == great--) {
+ if (great-- == k) {
break outer;
}
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // pivot1 <= a[great] <= pivot2
+ a[k] = a[great];
+ a[great--] = ak;
}
}
}
} else { // Pivots are equal
/*
- * Partition degenerates to the traditional 3-way
- * (or "Dutch National Flag") partition:
+ * Partition degenerates to the traditional 3-way,
+ * or "Dutch National Flag", partition:
*
* left part center part right part
- * -------------------------------------------------
- * [ < pivot | == pivot | ? | > pivot ]
- * -------------------------------------------------
- *
+ * +----------------------------------------------+
+ * | < pivot | == pivot | ? | > pivot |
+ * +----------------------------------------------+
* ^ ^ ^
* | | |
* less k great
@@ -489,30 +520,34 @@
*
* Pointer k is the first index of ?-part
*/
- outer:
for (int k = less; k <= great; k++) {
long ak = a[k];
if (ak == pivot1) {
continue;
}
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else { // a[k] > pivot
+ } else { // (a[k] > pivot1) - Move a[k] to right part
+ /*
+ * We know that pivot1 == a[e3] == pivot2. Thus, we know
+ * that great will still be >= k when the following loop
+ * terminates, even though we don't test for it explicitly.
+ * In other words, a[e3] acts as a sentinel for great.
+ */
while (a[great] > pivot1) {
- if (k == great--) {
- break outer;
- }
+ great--;
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // a[great] == pivot1
+ a[k] = pivot1;
+ a[great--] = ak;
}
}
}
@@ -535,26 +570,55 @@
}
/*
- * If center part is too large (comprises > 5/6 of
- * the array), swap internal pivot values to ends
+ * If center part is too large (comprises > 2/3 of the array),
+ * swap internal pivot values to ends
*/
- if (less < e1 && e5 < great) {
+ if (less < e1 && great > e5) {
while (a[less] == pivot1) {
less++;
}
while (a[great] == pivot2) {
great--;
}
- for (int k = less + 1; k <= great; ) {
+
+ /*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +----------------------------------------------------------+
+ * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
+ * +----------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (*, less) == pivot1
+ * pivot1 < all in [less, k) < pivot2
+ * all in (great, *) == pivot2
+ *
+ * Pointer k is the first index of ?-part
+ */
+ outer:
+ for (int k = less; k <= great; k++) {
long ak = a[k];
- if (ak == pivot1) {
- a[k++] = a[less];
+ if (ak == pivot2) { // Move a[k] to right part
+ while (a[great] == pivot2) {
+ if (great-- == k) {
+ break outer;
+ }
+ }
+ if (a[great] == pivot1) {
+ a[k] = a[less];
+ a[less++] = pivot1;
+ } else { // pivot1 < a[great] < pivot2
+ a[k] = a[great];
+ }
+ a[great--] = pivot2;
+ } else if (ak == pivot1) { // Move a[k] to left part
+ a[k] = a[less];
a[less++] = pivot1;
- } else if (ak == pivot2) {
- a[k] = a[great];
- a[great--] = pivot2;
- } else {
- k++;
}
}
}
@@ -576,7 +640,7 @@
* Sorts the specified range of the array into ascending order. The range
* to be sorted extends from the index {@code fromIndex}, inclusive, to
* the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
- * the range to be sorted is empty.
+ * the range to be sorted is empty (and the call is a no-op).
*
* @param a the array to be sorted
* @param fromIndex the index of the first element, inclusive, to be sorted
@@ -606,13 +670,13 @@
private static void doSort(short[] a, int left, int right) {
// Use insertion sort on tiny arrays
if (right - left + 1 < INSERTION_SORT_THRESHOLD) {
- for (int k = left + 1; k <= right; k++) {
- short ak = a[k];
+ for (int i = left + 1; i <= right; i++) {
+ short ai = a[i];
int j;
- for (j = k - 1; j >= left && ak < a[j]; j--) {
+ for (j = i - 1; j >= left && ai < a[j]; j--) {
a[j + 1] = a[j];
}
- a[j + 1] = ak;
+ a[j + 1] = ai;
}
} else if (right-left+1 > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) {
// Use counting sort on huge arrays
@@ -671,7 +735,7 @@
* second terciles of the array. Note that pivot1 <= pivot2.
*
* The pivots are stored in local variables, and the first and
- * the last of the sorted elements are moved to the locations
+ * the last of the elements to be sorted are moved to the locations
* formerly occupied by the pivots. When partitioning is complete,
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
@@ -679,27 +743,26 @@
short pivot1 = ae2; a[e2] = a[left];
short pivot2 = ae4; a[e4] = a[right];
- /*
- * Partitioning
- *
- * left part center part right part
- * ------------------------------------------------------------
- * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ]
- * ------------------------------------------------------------
- * ^ ^ ^
- * | | |
- * less k great
- */
-
// Pointers
int less = left + 1; // The index of first element of center part
int great = right - 1; // The index before first element of right part
- boolean pivotsDiffer = pivot1 != pivot2;
+ boolean pivotsDiffer = (pivot1 != pivot2);
if (pivotsDiffer) {
/*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +------------------------------------------------------------+
+ * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
+ * +------------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
* Invariants:
+ *
* all in (left, less) < pivot1
* pivot1 <= all in [less, k) <= pivot2
* all in (great, right) > pivot2
@@ -709,37 +772,37 @@
outer:
for (int k = less; k <= great; k++) {
short ak = a[k];
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else if (ak > pivot2) {
+ } else if (ak > pivot2) { // Move a[k] to right part
while (a[great] > pivot2) {
- if (k == great--) {
+ if (great-- == k) {
break outer;
}
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // pivot1 <= a[great] <= pivot2
+ a[k] = a[great];
+ a[great--] = ak;
}
}
}
} else { // Pivots are equal
/*
- * Partition degenerates to the traditional 3-way
- * (or "Dutch National Flag") partition:
+ * Partition degenerates to the traditional 3-way,
+ * or "Dutch National Flag", partition:
*
* left part center part right part
- * -------------------------------------------------
- * [ < pivot | == pivot | ? | > pivot ]
- * -------------------------------------------------
- *
+ * +----------------------------------------------+
+ * | < pivot | == pivot | ? | > pivot |
+ * +----------------------------------------------+
* ^ ^ ^
* | | |
* less k great
@@ -752,30 +815,34 @@
*
* Pointer k is the first index of ?-part
*/
- outer:
for (int k = less; k <= great; k++) {
short ak = a[k];
if (ak == pivot1) {
continue;
}
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else { // a[k] > pivot
+ } else { // (a[k] > pivot1) - Move a[k] to right part
+ /*
+ * We know that pivot1 == a[e3] == pivot2. Thus, we know
+ * that great will still be >= k when the following loop
+ * terminates, even though we don't test for it explicitly.
+ * In other words, a[e3] acts as a sentinel for great.
+ */
while (a[great] > pivot1) {
- if (k == great--) {
- break outer;
- }
+ great--;
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // a[great] == pivot1
+ a[k] = pivot1;
+ a[great--] = ak;
}
}
}
@@ -798,26 +865,55 @@
}
/*
- * If center part is too large (comprises > 5/6 of
- * the array), swap internal pivot values to ends
+ * If center part is too large (comprises > 2/3 of the array),
+ * swap internal pivot values to ends
*/
- if (less < e1 && e5 < great) {
+ if (less < e1 && great > e5) {
while (a[less] == pivot1) {
less++;
}
while (a[great] == pivot2) {
great--;
}
- for (int k = less + 1; k <= great; ) {
+
+ /*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +----------------------------------------------------------+
+ * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
+ * +----------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (*, less) == pivot1
+ * pivot1 < all in [less, k) < pivot2
+ * all in (great, *) == pivot2
+ *
+ * Pointer k is the first index of ?-part
+ */
+ outer:
+ for (int k = less; k <= great; k++) {
short ak = a[k];
- if (ak == pivot1) {
- a[k++] = a[less];
+ if (ak == pivot2) { // Move a[k] to right part
+ while (a[great] == pivot2) {
+ if (great-- == k) {
+ break outer;
+ }
+ }
+ if (a[great] == pivot1) {
+ a[k] = a[less];
+ a[less++] = pivot1;
+ } else { // pivot1 < a[great] < pivot2
+ a[k] = a[great];
+ }
+ a[great--] = pivot2;
+ } else if (ak == pivot1) { // Move a[k] to left part
+ a[k] = a[less];
a[less++] = pivot1;
- } else if (ak == pivot2) {
- a[k] = a[great];
- a[great--] = pivot2;
- } else {
- k++;
}
}
}
@@ -839,7 +935,7 @@
* Sorts the specified range of the array into ascending order. The range
* to be sorted extends from the index {@code fromIndex}, inclusive, to
* the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
- * the range to be sorted is empty.
+ * the range to be sorted is empty (and the call is a no-op).
*
* @param a the array to be sorted
* @param fromIndex the index of the first element, inclusive, to be sorted
@@ -869,13 +965,13 @@
private static void doSort(char[] a, int left, int right) {
// Use insertion sort on tiny arrays
if (right - left + 1 < INSERTION_SORT_THRESHOLD) {
- for (int k = left + 1; k <= right; k++) {
- char ak = a[k];
+ for (int i = left + 1; i <= right; i++) {
+ char ai = a[i];
int j;
- for (j = k - 1; j >= left && ak < a[j]; j--) {
+ for (j = i - 1; j >= left && ai < a[j]; j--) {
a[j + 1] = a[j];
}
- a[j + 1] = ak;
+ a[j + 1] = ai;
}
} else if (right-left+1 > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) {
// Use counting sort on huge arrays
@@ -932,7 +1028,7 @@
* second terciles of the array. Note that pivot1 <= pivot2.
*
* The pivots are stored in local variables, and the first and
- * the last of the sorted elements are moved to the locations
+ * the last of the elements to be sorted are moved to the locations
* formerly occupied by the pivots. When partitioning is complete,
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
@@ -940,27 +1036,26 @@
char pivot1 = ae2; a[e2] = a[left];
char pivot2 = ae4; a[e4] = a[right];
- /*
- * Partitioning
- *
- * left part center part right part
- * ------------------------------------------------------------
- * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ]
- * ------------------------------------------------------------
- * ^ ^ ^
- * | | |
- * less k great
- */
-
// Pointers
int less = left + 1; // The index of first element of center part
int great = right - 1; // The index before first element of right part
- boolean pivotsDiffer = pivot1 != pivot2;
+ boolean pivotsDiffer = (pivot1 != pivot2);
if (pivotsDiffer) {
/*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +------------------------------------------------------------+
+ * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
+ * +------------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
* Invariants:
+ *
* all in (left, less) < pivot1
* pivot1 <= all in [less, k) <= pivot2
* all in (great, right) > pivot2
@@ -970,37 +1065,37 @@
outer:
for (int k = less; k <= great; k++) {
char ak = a[k];
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else if (ak > pivot2) {
+ } else if (ak > pivot2) { // Move a[k] to right part
while (a[great] > pivot2) {
- if (k == great--) {
+ if (great-- == k) {
break outer;
}
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // pivot1 <= a[great] <= pivot2
+ a[k] = a[great];
+ a[great--] = ak;
}
}
}
} else { // Pivots are equal
/*
- * Partition degenerates to the traditional 3-way
- * (or "Dutch National Flag") partition:
+ * Partition degenerates to the traditional 3-way,
+ * or "Dutch National Flag", partition:
*
* left part center part right part
- * -------------------------------------------------
- * [ < pivot | == pivot | ? | > pivot ]
- * -------------------------------------------------
- *
+ * +----------------------------------------------+
+ * | < pivot | == pivot | ? | > pivot |
+ * +----------------------------------------------+
* ^ ^ ^
* | | |
* less k great
@@ -1013,30 +1108,34 @@
*
* Pointer k is the first index of ?-part
*/
- outer:
for (int k = less; k <= great; k++) {
char ak = a[k];
if (ak == pivot1) {
continue;
}
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else { // a[k] > pivot
+ } else { // (a[k] > pivot1) - Move a[k] to right part
+ /*
+ * We know that pivot1 == a[e3] == pivot2. Thus, we know
+ * that great will still be >= k when the following loop
+ * terminates, even though we don't test for it explicitly.
+ * In other words, a[e3] acts as a sentinel for great.
+ */
while (a[great] > pivot1) {
- if (k == great--) {
- break outer;
- }
+ great--;
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // a[great] == pivot1
+ a[k] = pivot1;
+ a[great--] = ak;
}
}
}
@@ -1059,26 +1158,55 @@
}
/*
- * If center part is too large (comprises > 5/6 of
- * the array), swap internal pivot values to ends
+ * If center part is too large (comprises > 2/3 of the array),
+ * swap internal pivot values to ends
*/
- if (less < e1 && e5 < great) {
+ if (less < e1 && great > e5) {
while (a[less] == pivot1) {
less++;
}
while (a[great] == pivot2) {
great--;
}
- for (int k = less + 1; k <= great; ) {
+
+ /*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +----------------------------------------------------------+
+ * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
+ * +----------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (*, less) == pivot1
+ * pivot1 < all in [less, k) < pivot2
+ * all in (great, *) == pivot2
+ *
+ * Pointer k is the first index of ?-part
+ */
+ outer:
+ for (int k = less; k <= great; k++) {
char ak = a[k];
- if (ak == pivot1) {
- a[k++] = a[less];
+ if (ak == pivot2) { // Move a[k] to right part
+ while (a[great] == pivot2) {
+ if (great-- == k) {
+ break outer;
+ }
+ }
+ if (a[great] == pivot1) {
+ a[k] = a[less];
+ a[less++] = pivot1;
+ } else { // pivot1 < a[great] < pivot2
+ a[k] = a[great];
+ }
+ a[great--] = pivot2;
+ } else if (ak == pivot1) { // Move a[k] to left part
+ a[k] = a[less];
a[less++] = pivot1;
- } else if (ak == pivot2) {
- a[k] = a[great];
- a[great--] = pivot2;
- } else {
- k++;
}
}
}
@@ -1100,7 +1228,7 @@
* Sorts the specified range of the array into ascending order. The range
* to be sorted extends from the index {@code fromIndex}, inclusive, to
* the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
- * the range to be sorted is empty.
+ * the range to be sorted is empty (and the call is a no-op).
*
* @param a the array to be sorted
* @param fromIndex the index of the first element, inclusive, to be sorted
@@ -1130,13 +1258,13 @@
private static void doSort(byte[] a, int left, int right) {
// Use insertion sort on tiny arrays
if (right - left + 1 < INSERTION_SORT_THRESHOLD) {
- for (int k = left + 1; k <= right; k++) {
- byte ak = a[k];
+ for (int i = left + 1; i <= right; i++) {
+ byte ai = a[i];
int j;
- for (j = k - 1; j >= left && ak < a[j]; j--) {
+ for (j = i - 1; j >= left && ai < a[j]; j--) {
a[j + 1] = a[j];
}
- a[j + 1] = ak;
+ a[j + 1] = ai;
}
} else if (right - left + 1 > COUNTING_SORT_THRESHOLD_FOR_BYTE) {
// Use counting sort on huge arrays
@@ -1195,7 +1323,7 @@
* second terciles of the array. Note that pivot1 <= pivot2.
*
* The pivots are stored in local variables, and the first and
- * the last of the sorted elements are moved to the locations
+ * the last of the elements to be sorted are moved to the locations
* formerly occupied by the pivots. When partitioning is complete,
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
@@ -1203,27 +1331,26 @@
byte pivot1 = ae2; a[e2] = a[left];
byte pivot2 = ae4; a[e4] = a[right];
- /*
- * Partitioning
- *
- * left part center part right part
- * ------------------------------------------------------------
- * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ]
- * ------------------------------------------------------------
- * ^ ^ ^
- * | | |
- * less k great
- */
-
// Pointers
int less = left + 1; // The index of first element of center part
int great = right - 1; // The index before first element of right part
- boolean pivotsDiffer = pivot1 != pivot2;
+ boolean pivotsDiffer = (pivot1 != pivot2);
if (pivotsDiffer) {
/*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +------------------------------------------------------------+
+ * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
+ * +------------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
* Invariants:
+ *
* all in (left, less) < pivot1
* pivot1 <= all in [less, k) <= pivot2
* all in (great, right) > pivot2
@@ -1233,37 +1360,37 @@
outer:
for (int k = less; k <= great; k++) {
byte ak = a[k];
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else if (ak > pivot2) {
+ } else if (ak > pivot2) { // Move a[k] to right part
while (a[great] > pivot2) {
- if (k == great--) {
+ if (great-- == k) {
break outer;
}
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // pivot1 <= a[great] <= pivot2
+ a[k] = a[great];
+ a[great--] = ak;
}
}
}
} else { // Pivots are equal
/*
- * Partition degenerates to the traditional 3-way
- * (or "Dutch National Flag") partition:
+ * Partition degenerates to the traditional 3-way,
+ * or "Dutch National Flag", partition:
*
* left part center part right part
- * -------------------------------------------------
- * [ < pivot | == pivot | ? | > pivot ]
- * -------------------------------------------------
- *
+ * +----------------------------------------------+
+ * | < pivot | == pivot | ? | > pivot |
+ * +----------------------------------------------+
* ^ ^ ^
* | | |
* less k great
@@ -1276,30 +1403,34 @@
*
* Pointer k is the first index of ?-part
*/
- outer:
for (int k = less; k <= great; k++) {
byte ak = a[k];
if (ak == pivot1) {
continue;
}
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else { // a[k] > pivot
+ } else { // (a[k] > pivot1) - Move a[k] to right part
+ /*
+ * We know that pivot1 == a[e3] == pivot2. Thus, we know
+ * that great will still be >= k when the following loop
+ * terminates, even though we don't test for it explicitly.
+ * In other words, a[e3] acts as a sentinel for great.
+ */
while (a[great] > pivot1) {
- if (k == great--) {
- break outer;
- }
+ great--;
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // a[great] == pivot1
+ a[k] = pivot1;
+ a[great--] = ak;
}
}
}
@@ -1322,26 +1453,55 @@
}
/*
- * If center part is too large (comprises > 5/6 of
- * the array), swap internal pivot values to ends
+ * If center part is too large (comprises > 2/3 of the array),
+ * swap internal pivot values to ends
*/
- if (less < e1 && e5 < great) {
+ if (less < e1 && great > e5) {
while (a[less] == pivot1) {
less++;
}
while (a[great] == pivot2) {
great--;
}
- for (int k = less + 1; k <= great; ) {
+
+ /*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +----------------------------------------------------------+
+ * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
+ * +----------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (*, less) == pivot1
+ * pivot1 < all in [less, k) < pivot2
+ * all in (great, *) == pivot2
+ *
+ * Pointer k is the first index of ?-part
+ */
+ outer:
+ for (int k = less; k <= great; k++) {
byte ak = a[k];
- if (ak == pivot1) {
- a[k++] = a[less];
+ if (ak == pivot2) { // Move a[k] to right part
+ while (a[great] == pivot2) {
+ if (great-- == k) {
+ break outer;
+ }
+ }
+ if (a[great] == pivot1) {
+ a[k] = a[less];
+ a[less++] = pivot1;
+ } else { // pivot1 < a[great] < pivot2
+ a[k] = a[great];
+ }
+ a[great--] = pivot2;
+ } else if (ak == pivot1) { // Move a[k] to left part
+ a[k] = a[less];
a[less++] = pivot1;
- } else if (ak == pivot2) {
- a[k] = a[great];
- a[great--] = pivot2;
- } else {
- k++;
}
}
}
@@ -1371,7 +1531,7 @@
* Sorts the specified range of the array into ascending order. The range
* to be sorted extends from the index {@code fromIndex}, inclusive, to
* the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
- * the range to be sorted is empty.
+ * the range to be sorted is empty and the call is a no-op).
*
* <p>The {@code <} relation does not provide a total order on all float
* values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN}
@@ -1485,13 +1645,13 @@
private static void doSort(float[] a, int left, int right) {
// Use insertion sort on tiny arrays
if (right - left + 1 < INSERTION_SORT_THRESHOLD) {
- for (int k = left + 1; k <= right; k++) {
- float ak = a[k];
+ for (int i = left + 1; i <= right; i++) {
+ float ai = a[i];
int j;
- for (j = k - 1; j >= left && ak < a[j]; j--) {
+ for (j = i - 1; j >= left && ai < a[j]; j--) {
a[j + 1] = a[j];
}
- a[j + 1] = ak;
+ a[j + 1] = ai;
}
} else { // Use Dual-Pivot Quicksort on large arrays
dualPivotQuicksort(a, left, right);
@@ -1536,7 +1696,7 @@
* second terciles of the array. Note that pivot1 <= pivot2.
*
* The pivots are stored in local variables, and the first and
- * the last of the sorted elements are moved to the locations
+ * the last of the elements to be sorted are moved to the locations
* formerly occupied by the pivots. When partitioning is complete,
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
@@ -1544,27 +1704,26 @@
float pivot1 = ae2; a[e2] = a[left];
float pivot2 = ae4; a[e4] = a[right];
- /*
- * Partitioning
- *
- * left part center part right part
- * ------------------------------------------------------------
- * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ]
- * ------------------------------------------------------------
- * ^ ^ ^
- * | | |
- * less k great
- */
-
// Pointers
int less = left + 1; // The index of first element of center part
int great = right - 1; // The index before first element of right part
- boolean pivotsDiffer = pivot1 != pivot2;
+ boolean pivotsDiffer = (pivot1 != pivot2);
if (pivotsDiffer) {
/*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +------------------------------------------------------------+
+ * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
+ * +------------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
* Invariants:
+ *
* all in (left, less) < pivot1
* pivot1 <= all in [less, k) <= pivot2
* all in (great, right) > pivot2
@@ -1574,37 +1733,37 @@
outer:
for (int k = less; k <= great; k++) {
float ak = a[k];
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else if (ak > pivot2) {
+ } else if (ak > pivot2) { // Move a[k] to right part
while (a[great] > pivot2) {
- if (k == great--) {
+ if (great-- == k) {
break outer;
}
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // pivot1 <= a[great] <= pivot2
+ a[k] = a[great];
+ a[great--] = ak;
}
}
}
} else { // Pivots are equal
/*
- * Partition degenerates to the traditional 3-way
- * (or "Dutch National Flag") partition:
+ * Partition degenerates to the traditional 3-way,
+ * or "Dutch National Flag", partition:
*
* left part center part right part
- * -------------------------------------------------
- * [ < pivot | == pivot | ? | > pivot ]
- * -------------------------------------------------
- *
+ * +----------------------------------------------+
+ * | < pivot | == pivot | ? | > pivot |
+ * +----------------------------------------------+
* ^ ^ ^
* | | |
* less k great
@@ -1617,30 +1776,34 @@
*
* Pointer k is the first index of ?-part
*/
- outer:
for (int k = less; k <= great; k++) {
float ak = a[k];
if (ak == pivot1) {
continue;
}
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else { // a[k] > pivot
+ } else { // (a[k] > pivot1) - Move a[k] to right part
+ /*
+ * We know that pivot1 == a[e3] == pivot2. Thus, we know
+ * that great will still be >= k when the following loop
+ * terminates, even though we don't test for it explicitly.
+ * In other words, a[e3] acts as a sentinel for great.
+ */
while (a[great] > pivot1) {
- if (k == great--) {
- break outer;
- }
+ great--;
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // a[great] == pivot1
+ a[k] = pivot1;
+ a[great--] = ak;
}
}
}
@@ -1663,26 +1826,55 @@
}
/*
- * If center part is too large (comprises > 5/6 of
- * the array), swap internal pivot values to ends
+ * If center part is too large (comprises > 2/3 of the array),
+ * swap internal pivot values to ends
*/
- if (less < e1 && e5 < great) {
+ if (less < e1 && great > e5) {
while (a[less] == pivot1) {
less++;
}
while (a[great] == pivot2) {
great--;
}
- for (int k = less + 1; k <= great; ) {
+
+ /*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +----------------------------------------------------------+
+ * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
+ * +----------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (*, less) == pivot1
+ * pivot1 < all in [less, k) < pivot2
+ * all in (great, *) == pivot2
+ *
+ * Pointer k is the first index of ?-part
+ */
+ outer:
+ for (int k = less; k <= great; k++) {
float ak = a[k];
- if (ak == pivot1) {
- a[k++] = a[less];
+ if (ak == pivot2) { // Move a[k] to right part
+ while (a[great] == pivot2) {
+ if (great-- == k) {
+ break outer;
+ }
+ }
+ if (a[great] == pivot1) {
+ a[k] = a[less];
+ a[less++] = pivot1;
+ } else { // pivot1 < a[great] < pivot2
+ a[k] = a[great];
+ }
+ a[great--] = pivot2;
+ } else if (ak == pivot1) { // Move a[k] to left part
+ a[k] = a[less];
a[less++] = pivot1;
- } else if (ak == pivot2) {
- a[k] = a[great];
- a[great--] = pivot2;
- } else {
- k++;
}
}
}
@@ -1712,7 +1904,7 @@
* Sorts the specified range of the array into ascending order. The range
* to be sorted extends from the index {@code fromIndex}, inclusive, to
* the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex},
- * the range to be sorted is empty.
+ * the range to be sorted is empty (and the call is a no-op).
*
* <p>The {@code <} relation does not provide a total order on all double
* values: {@code -0.0d == 0.0d} is {@code true} and a {@code Double.NaN}
@@ -1826,13 +2018,13 @@
private static void doSort(double[] a, int left, int right) {
// Use insertion sort on tiny arrays
if (right - left + 1 < INSERTION_SORT_THRESHOLD) {
- for (int k = left + 1; k <= right; k++) {
- double ak = a[k];
+ for (int i = left + 1; i <= right; i++) {
+ double ai = a[i];
int j;
- for (j = k - 1; j >= left && ak < a[j]; j--) {
+ for (j = i - 1; j >= left && ai < a[j]; j--) {
a[j + 1] = a[j];
}
- a[j + 1] = ak;
+ a[j + 1] = ai;
}
} else { // Use Dual-Pivot Quicksort on large arrays
dualPivotQuicksort(a, left, right);
@@ -1877,7 +2069,7 @@
* second terciles of the array. Note that pivot1 <= pivot2.
*
* The pivots are stored in local variables, and the first and
- * the last of the sorted elements are moved to the locations
+ * the last of the elements to be sorted are moved to the locations
* formerly occupied by the pivots. When partitioning is complete,
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
@@ -1885,27 +2077,26 @@
double pivot1 = ae2; a[e2] = a[left];
double pivot2 = ae4; a[e4] = a[right];
- /*
- * Partitioning
- *
- * left part center part right part
- * ------------------------------------------------------------
- * [ < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 ]
- * ------------------------------------------------------------
- * ^ ^ ^
- * | | |
- * less k great
- */
-
// Pointers
int less = left + 1; // The index of first element of center part
int great = right - 1; // The index before first element of right part
- boolean pivotsDiffer = pivot1 != pivot2;
+ boolean pivotsDiffer = (pivot1 != pivot2);
if (pivotsDiffer) {
/*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +------------------------------------------------------------+
+ * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
+ * +------------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
* Invariants:
+ *
* all in (left, less) < pivot1
* pivot1 <= all in [less, k) <= pivot2
* all in (great, right) > pivot2
@@ -1915,37 +2106,37 @@
outer:
for (int k = less; k <= great; k++) {
double ak = a[k];
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else if (ak > pivot2) {
+ } else if (ak > pivot2) { // Move a[k] to right part
while (a[great] > pivot2) {
- if (k == great--) {
+ if (great-- == k) {
break outer;
}
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // pivot1 <= a[great] <= pivot2
+ a[k] = a[great];
+ a[great--] = ak;
}
}
}
} else { // Pivots are equal
/*
- * Partition degenerates to the traditional 3-way
- * (or "Dutch National Flag") partition:
+ * Partition degenerates to the traditional 3-way,
+ * or "Dutch National Flag", partition:
*
* left part center part right part
- * -------------------------------------------------
- * [ < pivot | == pivot | ? | > pivot ]
- * -------------------------------------------------
- *
+ * +----------------------------------------------+
+ * | < pivot | == pivot | ? | > pivot |
+ * +----------------------------------------------+
* ^ ^ ^
* | | |
* less k great
@@ -1958,30 +2149,34 @@
*
* Pointer k is the first index of ?-part
*/
- outer:
for (int k = less; k <= great; k++) {
double ak = a[k];
if (ak == pivot1) {
continue;
}
- if (ak < pivot1) {
- if (k > less) {
+ if (ak < pivot1) { // Move a[k] to left part
+ if (k != less) {
a[k] = a[less];
a[less] = ak;
}
less++;
- } else { // a[k] > pivot
+ } else { // (a[k] > pivot1) - Move a[k] to right part
+ /*
+ * We know that pivot1 == a[e3] == pivot2. Thus, we know
+ * that great will still be >= k when the following loop
+ * terminates, even though we don't test for it explicitly.
+ * In other words, a[e3] acts as a sentinel for great.
+ */
while (a[great] > pivot1) {
- if (k == great--) {
- break outer;
- }
+ great--;
}
- a[k] = a[great];
- a[great--] = ak;
-
- if ((ak = a[k]) < pivot1) {
+ if (a[great] < pivot1) {
a[k] = a[less];
- a[less++] = ak;
+ a[less++] = a[great];
+ a[great--] = ak;
+ } else { // a[great] == pivot1
+ a[k] = pivot1;
+ a[great--] = ak;
}
}
}
@@ -2004,26 +2199,55 @@
}
/*
- * If center part is too large (comprises > 5/6 of
- * the array), swap internal pivot values to ends
+ * If center part is too large (comprises > 2/3 of the array),
+ * swap internal pivot values to ends
*/
- if (less < e1 && e5 < great) {
+ if (less < e1 && great > e5) {
while (a[less] == pivot1) {
less++;
}
while (a[great] == pivot2) {
great--;
}
- for (int k = less + 1; k <= great; ) {
+
+ /*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +----------------------------------------------------------+
+ * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
+ * +----------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (*, less) == pivot1
+ * pivot1 < all in [less, k) < pivot2
+ * all in (great, *) == pivot2
+ *
+ * Pointer k is the first index of ?-part
+ */
+ outer:
+ for (int k = less; k <= great; k++) {
double ak = a[k];
- if (ak == pivot1) {
- a[k++] = a[less];
+ if (ak == pivot2) { // Move a[k] to right part
+ while (a[great] == pivot2) {
+ if (great-- == k) {
+ break outer;
+ }
+ }
+ if (a[great] == pivot1) {
+ a[k] = a[less];
+ a[less++] = pivot1;
+ } else { // pivot1 < a[great] < pivot2
+ a[k] = a[great];
+ }
+ a[great--] = pivot2;
+ } else if (ak == pivot1) { // Move a[k] to left part
+ a[k] = a[less];
a[less++] = pivot1;
- } else if (ak == pivot2) {
- a[k] = a[great];
- a[great--] = pivot2;
- } else {
- k++;
}
}
}
--- a/jdk/src/share/classes/java/util/Formatter.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/util/Formatter.java Wed Dec 16 16:25:08 2009 -0800
@@ -2552,9 +2552,6 @@
private boolean dt = false;
private char c;
- // cache the line separator
- private String ls;
-
private int index(String s) {
if (s != null) {
try {
@@ -2702,9 +2699,7 @@
printHashCode(arg);
break;
case Conversion.LINE_SEPARATOR:
- if (ls == null)
- ls = System.getProperty("line.separator");
- a.append(ls);
+ a.append(System.lineSeparator());
break;
case Conversion.PERCENT_SIGN:
a.append('%');
--- a/jdk/src/share/classes/java/util/zip/Deflater.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/util/zip/Deflater.java Wed Dec 16 16:25:08 2009 -0800
@@ -318,7 +318,7 @@
/**
* Compresses the input data and fills specified buffer with compressed
* data. Returns actual number of bytes of compressed data. A return value
- * of 0 indicates that {@link needsInput() needsInput} should be called
+ * of 0 indicates that {@link #needsInput() needsInput} should be called
* in order to determine if more input data is required.
*
* <p>This method uses {@link #NO_FLUSH} as its compression flush mode.
@@ -339,7 +339,7 @@
/**
* Compresses the input data and fills specified buffer with compressed
* data. Returns actual number of bytes of compressed data. A return value
- * of 0 indicates that {@link needsInput() needsInput} should be called
+ * of 0 indicates that {@link #needsInput() needsInput} should be called
* in order to determine if more input data is required.
*
* <p>This method uses {@link #NO_FLUSH} as its compression flush mode.
--- a/jdk/src/share/classes/java/util/zip/DeflaterOutputStream.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/java/util/zip/DeflaterOutputStream.java Wed Dec 16 16:25:08 2009 -0800
@@ -66,7 +66,7 @@
* @param def the compressor ("deflater")
* @param size the output buffer size
* @param syncFlush
- * if {@code true} the {@link flush()} method of this
+ * if {@code true} the {@link #flush()} method of this
* instance flushes the compressor with flush mode
* {@link Deflater#SYNC_FLUSH} before flushing the output
* stream, otherwise only flushes the output stream
@@ -114,7 +114,7 @@
* @param out the output stream
* @param def the compressor ("deflater")
* @param syncFlush
- * if {@code true} the {@link flush()} method of this
+ * if {@code true} the {@link #flush()} method of this
* instance flushes the compressor with flush mode
* {@link Deflater#SYNC_FLUSH} before flushing the output
* stream, otherwise only flushes the output stream
@@ -151,7 +151,7 @@
*
* @param out the output stream
* @param syncFlush
- * if {@code true} the {@link flush()} method of this
+ * if {@code true} the {@link #flush()} method of this
* instance flushes the compressor with flush mode
* {@link Deflater#SYNC_FLUSH} before flushing the output
* stream, otherwise only flushes the output stream
@@ -262,10 +262,10 @@
/**
* Flushes the compressed output stream.
*
- * If {@link DeflaterOutputStream(OutputStream, Deflater, int, boolean)
+ * If {@link #DeflaterOutputStream(OutputStream, Deflater, int, boolean)
* syncFlush} is {@code true} when this compressed output stream is
- * constructed this method flushes the underlying {@code compressor}
- * first with the flush mode {@link Deflater#SYNC_FLUSH} to force
+ * constructed, this method first flushes the underlying {@code compressor}
+ * with the flush mode {@link Deflater#SYNC_FLUSH} to force
* all pending data to be flushed out to the output stream and then
* flushes the output stream. Otherwise this method only flushes the
* output stream without flushing the {@code compressor}.
--- a/jdk/src/share/classes/javax/naming/InitialContext.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/javax/naming/InitialContext.java Wed Dec 16 16:25:08 2009 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -198,6 +198,8 @@
*
* <p> This constructor will not modify <tt>environment</tt>
* or save a reference to it, but may save a clone.
+ * Caller should not modify mutable keys and values in
+ * <tt>environment</tt> after it has been passed to the constructor.
*
* @param environment
* environment used to create the initial context.
--- a/jdk/src/share/classes/javax/naming/directory/InitialDirContext.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/javax/naming/directory/InitialDirContext.java Wed Dec 16 16:25:08 2009 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -86,6 +86,8 @@
*
* <p> This constructor will not modify <tt>environment</tt>
* or save a reference to it, but may save a clone.
+ * Caller should not modify mutable keys and values in
+ * <tt>environment</tt> after it has been passed to the constructor.
*
* @param environment
* environment used to create the initial DirContext.
--- a/jdk/src/share/classes/javax/naming/ldap/InitialLdapContext.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/javax/naming/ldap/InitialLdapContext.java Wed Dec 16 16:25:08 2009 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -110,6 +110,8 @@
*
* <p> This constructor will not modify its parameters or
* save references to them, but may save a clone or copy.
+ * Caller should not modify mutable keys and values in
+ * <tt>environment</tt> after it has been passed to the constructor.
*
* <p> <tt>connCtls</tt> is used as the underlying context instance's
* connection request controls. See the class description
--- a/jdk/src/share/classes/javax/security/auth/Subject.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/javax/security/auth/Subject.java Wed Dec 16 16:25:08 2009 -0800
@@ -40,7 +40,6 @@
import java.security.PrivilegedActionException;
import java.security.ProtectionDomain;
import sun.security.util.ResourcesMgr;
-import sun.security.util.SecurityConstants;
/**
* <p> A <code>Subject</code> represents a grouping of related information
@@ -239,7 +238,7 @@
public void setReadOnly() {
java.lang.SecurityManager sm = System.getSecurityManager();
if (sm != null) {
- sm.checkPermission(new AuthPermission("setReadOnly"));
+ sm.checkPermission(AuthPermissionHolder.SET_READ_ONLY_PERMISSION);
}
this.readOnly = true;
@@ -285,7 +284,7 @@
java.lang.SecurityManager sm = System.getSecurityManager();
if (sm != null) {
- sm.checkPermission(new AuthPermission("getSubject"));
+ sm.checkPermission(AuthPermissionHolder.GET_SUBJECT_PERMISSION);
}
if (acc == null) {
@@ -343,7 +342,7 @@
java.lang.SecurityManager sm = System.getSecurityManager();
if (sm != null) {
- sm.checkPermission(SecurityConstants.DO_AS_PERMISSION);
+ sm.checkPermission(AuthPermissionHolder.DO_AS_PERMISSION);
}
if (action == null)
throw new NullPointerException
@@ -402,7 +401,7 @@
java.lang.SecurityManager sm = System.getSecurityManager();
if (sm != null) {
- sm.checkPermission(SecurityConstants.DO_AS_PERMISSION);
+ sm.checkPermission(AuthPermissionHolder.DO_AS_PERMISSION);
}
if (action == null)
@@ -456,7 +455,7 @@
java.lang.SecurityManager sm = System.getSecurityManager();
if (sm != null) {
- sm.checkPermission(SecurityConstants.DO_AS_PRIVILEGED_PERMISSION);
+ sm.checkPermission(AuthPermissionHolder.DO_AS_PRIVILEGED_PERMISSION);
}
if (action == null)
@@ -520,7 +519,7 @@
java.lang.SecurityManager sm = System.getSecurityManager();
if (sm != null) {
- sm.checkPermission(SecurityConstants.DO_AS_PRIVILEGED_PERMISSION);
+ sm.checkPermission(AuthPermissionHolder.DO_AS_PRIVILEGED_PERMISSION);
}
if (action == null)
@@ -1044,16 +1043,13 @@
if (sm != null) {
switch (which) {
case Subject.PRINCIPAL_SET:
- sm.checkPermission(new AuthPermission
- ("modifyPrincipals"));
+ sm.checkPermission(AuthPermissionHolder.MODIFY_PRINCIPALS_PERMISSION);
break;
case Subject.PUB_CREDENTIAL_SET:
- sm.checkPermission(new AuthPermission
- ("modifyPublicCredentials"));
+ sm.checkPermission(AuthPermissionHolder.MODIFY_PUBLIC_CREDENTIALS_PERMISSION);
break;
default:
- sm.checkPermission(new AuthPermission
- ("modifyPrivateCredentials"));
+ sm.checkPermission(AuthPermissionHolder.MODIFY_PRIVATE_CREDENTIALS_PERMISSION);
break;
}
}
@@ -1073,16 +1069,13 @@
if (sm != null) {
switch (which) {
case Subject.PRINCIPAL_SET:
- sm.checkPermission
- (new AuthPermission("modifyPrincipals"));
+ sm.checkPermission(AuthPermissionHolder.MODIFY_PRINCIPALS_PERMISSION);
break;
case Subject.PUB_CREDENTIAL_SET:
- sm.checkPermission
- (new AuthPermission("modifyPublicCredentials"));
+ sm.checkPermission(AuthPermissionHolder.MODIFY_PUBLIC_CREDENTIALS_PERMISSION);
break;
default:
- sm.checkPermission
- (new AuthPermission("modifyPrivateCredentials"));
+ sm.checkPermission(AuthPermissionHolder.MODIFY_PRIVATE_CREDENTIALS_PERMISSION);
break;
}
}
@@ -1405,4 +1398,27 @@
return set.add(o);
}
}
+
+ static class AuthPermissionHolder {
+ static final AuthPermission DO_AS_PERMISSION =
+ new AuthPermission("doAs");
+
+ static final AuthPermission DO_AS_PRIVILEGED_PERMISSION =
+ new AuthPermission("doAsPrivileged");
+
+ static final AuthPermission SET_READ_ONLY_PERMISSION =
+ new AuthPermission("setReadOnly");
+
+ static final AuthPermission GET_SUBJECT_PERMISSION =
+ new AuthPermission("getSubject");
+
+ static final AuthPermission MODIFY_PRINCIPALS_PERMISSION =
+ new AuthPermission("modifyPrincipals");
+
+ static final AuthPermission MODIFY_PUBLIC_CREDENTIALS_PERMISSION =
+ new AuthPermission("modifyPublicCredentials");
+
+ static final AuthPermission MODIFY_PRIVATE_CREDENTIALS_PERMISSION =
+ new AuthPermission("modifyPrivateCredentials");
+ }
}
--- a/jdk/src/share/classes/javax/swing/Popup.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/javax/swing/Popup.java Wed Dec 16 16:25:08 2009 -0800
@@ -227,12 +227,8 @@
HeavyWeightWindow(Window parent) {
super(parent);
setFocusableWindowState(false);
- Toolkit tk = Toolkit.getDefaultToolkit();
- if (tk instanceof SunToolkit) {
- // all the short-lived windows like Popups should be
- // OverrideRedirect on X11 platforms
- ((SunToolkit)tk).setOverrideRedirect(this);
- }
+ setType(Window.Type.POPUP);
+
// Popups are typically transient and most likely won't benefit
// from true double buffering. Turn it off here.
getRootPane().setUseTrueDoubleBuffering(false);
--- a/jdk/src/share/classes/org/ietf/jgss/GSSContext.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/org/ietf/jgss/GSSContext.java Wed Dec 16 16:25:08 2009 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2001 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -678,7 +678,7 @@
* are not definitive then the method will attempt to treat all
* available bytes as part of the token.<p>
*
- * Other than the possible blocking behaviour described above, this
+ * Other than the possible blocking behavior described above, this
* method is equivalent to the byte array based {@link #unwrap(byte[],
* int, int, MessageProp) unwrap} method.<p>
*
@@ -826,7 +826,7 @@
* are not definitive then the method will attempt to treat all
* available bytes as part of the token.<p>
*
- * Other than the possible blocking behaviour described above, this
+ * Other than the possible blocking behavior described above, this
* method is equivalent to the byte array based {@link #verifyMIC(byte[],
* int, int, byte[], int, int, MessageProp) verifyMIC} method.<p>
*
@@ -917,7 +917,7 @@
* getMutualAuthState} method.<p>
*
* @param state a boolean value indicating whether mutual
- * authentication shouls be used or not.
+ * authentication should be used or not.
* @see #getMutualAuthState()
*
* @throws GSSException containing the following
@@ -928,7 +928,7 @@
/**
* Requests that replay detection be enabled for the
- * per-message security services after context establishemnt. This
+ * per-message security services after context establishment. This
* request can only be made on the context initiator's side and it has
* to be done prior to the first call to
* <code>initSecContext</code>. During context establishment replay
@@ -958,7 +958,7 @@
/**
* Requests that sequence checking be enabled for the
- * per-message security services after context establishemnt. This
+ * per-message security services after context establishment. This
* request can only be made on the context initiator's side and it has
* to be done prior to the first call to
* <code>initSecContext</code>. During context establishment sequence
--- a/jdk/src/share/classes/sun/awt/AWTAccessor.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java Wed Dec 16 16:25:08 2009 -0800
@@ -98,7 +98,7 @@
* Returns whether the component is visible without invoking
* any client code.
*/
- boolean isVisible_NoClientCode(Component comp);
+ boolean isVisible(Component comp);
/**
* Sets the RequestFocusController.
@@ -114,6 +114,112 @@
* Sets the appContext of the component.
*/
void setAppContext(Component comp, AppContext appContext);
+
+ /**
+ * Returns the parent of the component.
+ */
+ Container getParent(Component comp);
+
+ /**
+ * Sets the parent of the component to the specified parent.
+ */
+ void setParent(Component comp, Container parent);
+
+ /**
+ * Resizes the component to the specified width and height.
+ */
+ void setSize(Component comp, int width, int height);
+
+ /**
+ * Returns the location of the component.
+ */
+ Point getLocation(Component comp);
+
+ /**
+ * Moves the component to the new location.
+ */
+ void setLocation(Component comp, int x, int y);
+
+ /**
+ * Determines whether this component is enabled.
+ */
+ boolean isEnabled(Component comp);
+
+ /**
+ * Determines whether this component is displayable.
+ */
+ boolean isDisplayable(Component comp);
+
+ /**
+ * Gets the cursor set in the component.
+ */
+ Cursor getCursor(Component comp);
+
+ /**
+ * Returns the peer of the component.
+ */
+ ComponentPeer getPeer(Component comp);
+
+ /**
+ * Sets the peer of the component to the specified peer.
+ */
+ void setPeer(Component comp, ComponentPeer peer);
+
+ /**
+ * Determines whether this component is lightweight.
+ */
+ boolean isLightweight(Component comp);
+
+ /**
+ * Returns whether or not paint messages received from
+ * the operating system should be ignored.
+ */
+ boolean getIgnoreRepaint(Component comp);
+
+ /**
+ * Returns the width of the component.
+ */
+ int getWidth(Component comp);
+
+ /**
+ * Returns the height of the component.
+ */
+ int getHeight(Component comp);
+
+ /**
+ * Returns the x coordinate of the component.
+ */
+ int getX(Component comp);
+
+ /**
+ * Returns the y coordinate of the component.
+ */
+ int getY(Component comp);
+
+ /**
+ * Gets the foreground color of this component.
+ */
+ Color getForeground(Component comp);
+
+ /**
+ * Gets the background color of this component.
+ */
+ Color getBackground(Component comp);
+
+ /**
+ * Sets the background of this component to the specified color.
+ */
+ void setBackground(Component comp, Color background);
+
+ /**
+ * Gets the font of the component.
+ */
+ Font getFont(Component comp);
+
+ /**
+ * Processes events occurring on this component.
+ */
+ void processEvent(Component comp, AWTEvent e);
}
/*
@@ -169,6 +275,22 @@
* components in the specified window to the specified value.
*/
void setLWRequestStatus(Window changed, boolean status);
+
+ /**
+ * Indicates whether this window should receive focus on subsequently
+ * being shown, or being moved to the front.
+ */
+ boolean isAutoRequestFocus(Window w);
+
+ /**
+ * Indicates whether the specified window is an utility window for TrayIcon.
+ */
+ boolean isTrayIconWindow(Window w);
+
+ /**
+ * Marks the specified window as an utility window for TrayIcon.
+ */
+ void setTrayIconWindow(Window w, boolean isTrayIconWindow);
}
/*
@@ -249,13 +371,13 @@
*/
public interface EventQueueAccessor {
/*
- * Gets the next event queue.
- */
- EventQueue getNextQueue(EventQueue eventQueue);
- /*
* Gets the event dispatch thread.
*/
Thread getDispatchThread(EventQueue eventQueue);
+ /*
+ * Checks if the current thread is EDT for the given EQ.
+ */
+ public boolean isDispatchThreadImpl(EventQueue eventQueue);
}
/*
--- a/jdk/src/share/classes/sun/awt/AppContext.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/awt/AppContext.java Wed Dec 16 16:25:08 2009 -0800
@@ -43,6 +43,9 @@
import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeListener;
import sun.util.logging.PlatformLogger;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
/**
* The AppContext is a table referenced by ThreadGroup which stores
@@ -132,10 +135,17 @@
/* Since the contents of an AppContext are unique to each Java
* session, this class should never be serialized. */
- /* The key to put()/get() the Java EventQueue into/from the AppContext.
+ /*
+ * The key to put()/get() the Java EventQueue into/from the AppContext.
*/
public static final Object EVENT_QUEUE_KEY = new StringBuffer("EventQueue");
+ /*
+ * The keys to store EventQueue push/pop lock and condition.
+ */
+ public final static Object EVENT_QUEUE_LOCK_KEY = new StringBuilder("EventQueue.Lock");
+ public final static Object EVENT_QUEUE_COND_KEY = new StringBuilder("EventQueue.Condition");
+
/* A map of AppContexts, referenced by ThreadGroup.
*/
private static final Map<ThreadGroup, AppContext> threadGroup2appContext =
@@ -244,6 +254,13 @@
return Thread.currentThread().getContextClassLoader();
}
});
+
+ // Initialize push/pop lock and its condition to be used by all the
+ // EventQueues within this AppContext
+ Lock eventQueuePushPopLock = new ReentrantLock();
+ put(EVENT_QUEUE_LOCK_KEY, eventQueuePushPopLock);
+ Condition eventQueuePushPopCond = eventQueuePushPopLock.newCondition();
+ put(EVENT_QUEUE_COND_KEY, eventQueuePushPopCond);
}
private static final ThreadLocal<AppContext> threadAppContext =
--- a/jdk/src/share/classes/sun/awt/ComponentAccessor.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,483 +0,0 @@
-/*
- * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.awt;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.AWTEvent;
-import java.awt.Font;
-import java.awt.Color;
-import java.awt.Cursor;
-import java.awt.Point;
-
-import java.awt.peer.ComponentPeer;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-
-import sun.util.logging.PlatformLogger;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-/**
- * A collection of methods for modifying package private fields in AWT components.
- * This class is meant to be used by Peer code only. Previously peer code
- * got around this problem by modifying fields from native code. However
- * as we move away from native code to Pure-java peers we need this class.
- *
- * @author Bino George
- */
-
-
-public class ComponentAccessor
-{
- private static Class componentClass;
- private static Field fieldX;
- private static Field fieldY;
- private static Field fieldWidth;
- private static Field fieldHeight;
- private static Method methodGetParentNoClientCode;
- private static Method methodGetFontNoClientCode;
- private static Method methodProcessEvent;
- private static Method methodEnableEvents;
- private static Field fieldParent;
- private static Field fieldBackground;
- private static Field fieldForeground;
- private static Field fieldFont;
- private static Field fieldPacked;
- private static Field fieldIgnoreRepaint;
- private static Field fieldPeer;
- private static Field fieldVisible;
- private static Method methodIsEnabledImpl;
- private static Method methodGetCursorNoClientCode;
- private static Method methodLocationNoClientCode;
-
- private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.ComponentAccessor");
-
- private ComponentAccessor() {
- }
-
- static {
- AccessController.doPrivileged( new PrivilegedAction() {
- public Object run() {
- try {
- componentClass = Class.forName("java.awt.Component");
- fieldX = componentClass.getDeclaredField("x");
- fieldX.setAccessible(true);
- fieldY = componentClass.getDeclaredField("y");
- fieldY.setAccessible(true);
- fieldWidth = componentClass.getDeclaredField("width");
- fieldWidth.setAccessible(true);
- fieldHeight = componentClass.getDeclaredField("height");
- fieldHeight.setAccessible(true);
- fieldForeground = componentClass.getDeclaredField("foreground");
- fieldForeground.setAccessible(true);
- fieldBackground = componentClass.getDeclaredField("background");
- fieldBackground.setAccessible(true);
- fieldFont = componentClass.getDeclaredField("font");
- fieldFont.setAccessible(true);
- methodGetParentNoClientCode = componentClass.getDeclaredMethod("getParent_NoClientCode", (Class[]) null);
- methodGetParentNoClientCode.setAccessible(true);
- methodGetFontNoClientCode = componentClass.getDeclaredMethod("getFont_NoClientCode", (Class[]) null);
- methodGetFontNoClientCode.setAccessible(true);
- Class[] argTypes = { AWTEvent.class };
- methodProcessEvent = componentClass.getDeclaredMethod("processEvent",argTypes);
- methodProcessEvent.setAccessible(true);
- Class[] argTypesForMethodEnableEvents = { Long.TYPE };
- methodEnableEvents = componentClass.getDeclaredMethod("enableEvents",argTypesForMethodEnableEvents);
- methodEnableEvents.setAccessible(true);
-
- fieldParent = componentClass.getDeclaredField("parent");
- fieldParent.setAccessible(true);
- fieldPacked = componentClass.getDeclaredField("isPacked");
- fieldPacked.setAccessible(true);
- fieldIgnoreRepaint = componentClass.getDeclaredField("ignoreRepaint");
- fieldIgnoreRepaint.setAccessible(true);
-
- fieldPeer = componentClass.getDeclaredField("peer");
- fieldPeer.setAccessible(true);
-
- fieldVisible = componentClass.getDeclaredField("visible");
- fieldVisible.setAccessible(true);
-
- methodIsEnabledImpl = componentClass.getDeclaredMethod("isEnabledImpl", (Class[]) null);
- methodIsEnabledImpl.setAccessible(true);
-
- methodGetCursorNoClientCode = componentClass.getDeclaredMethod("getCursor_NoClientCode", (Class[]) null);
- methodGetCursorNoClientCode.setAccessible(true);
-
- methodLocationNoClientCode = componentClass.getDeclaredMethod("location_NoClientCode", (Class[]) null);
- methodLocationNoClientCode.setAccessible(true);
- }
- catch (NoSuchFieldException e) {
- log.fine("Unable to initialize ComponentAccessor", e);
- }
- catch (ClassNotFoundException e) {
- log.fine("Unable to initialize ComponentAccessor", e);
- }
- catch (NoSuchMethodException e) {
- log.fine("Unable to initialize ComponentAccessor", e);
- }
- // to please javac
- return null;
- }
- });
- }
-
- public static void setX(Component c, int x)
- {
- try {
- fieldX.setInt(c,x);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- }
-
- public static void setY(Component c, int y)
- {
- try {
- fieldY.setInt(c,y);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- }
-
- public static void setWidth(Component c, int width)
- {
- try {
- fieldWidth.setInt(c,width);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- }
-
- public static void setHeight(Component c, int height)
- {
- try {
- fieldHeight.setInt(c,height);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- }
-
- public static void setBounds(Component c, int x, int y, int width, int height)
- {
- try {
- fieldX.setInt(c,x);
- fieldY.setInt(c,y);
- fieldWidth.setInt(c,width);
- fieldHeight.setInt(c,height);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- }
-
- public static int getX(Component c) {
- try {
- return fieldX.getInt(c);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- return 0;
- }
-
- public static int getY(Component c) {
- try {
- return fieldY.getInt(c);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- return 0;
- }
-
- public static int getWidth(Component c) {
- try {
- return fieldWidth.getInt(c);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- return 0;
- }
-
- public static int getHeight(Component c) {
- try {
- return fieldHeight.getInt(c);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- return 0;
- }
-
- public static boolean getIsPacked(Component c) {
- try {
- return fieldPacked.getBoolean(c);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- return false;
- }
-
- public static Container getParent_NoClientCode(Component c) {
- Container parent=null;
-
- try {
- parent = (Container) methodGetParentNoClientCode.invoke(c, (Object[]) null);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- catch (InvocationTargetException e) {
- log.fine("Unable to invoke on the Component object", e);
- }
-
- return parent;
- }
-
- public static Font getFont_NoClientCode(Component c) {
- Font font=null;
-
- try {
- font = (Font) methodGetFontNoClientCode.invoke(c, (Object[]) null);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- catch (InvocationTargetException e) {
- log.fine("Unable to invoke on the Component object", e);
- }
-
- return font;
- }
-
- public static void processEvent(Component c, AWTEvent event) {
- Font font=null;
-
- try {
- Object[] args = new Object[1];
- args[0] = event;
- methodProcessEvent.invoke(c,args);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- catch (InvocationTargetException e) {
- log.fine("Unable to invoke on the Component object", e);
- }
- }
-
- public static void enableEvents(Component c, long event_mask) {
- try {
- Object[] args = new Object[1];
- args[0] = Long.valueOf(event_mask);
- methodEnableEvents.invoke(c,args);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- catch (InvocationTargetException e) {
- log.fine("Unable to invoke on the Component object", e);
- }
- }
-
- public static void setParent(Component c, Container parent)
- {
- try {
- fieldParent.set(c,parent);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- }
-
- public static Color getForeground(Component c)
- {
- Color color = null;
- try {
- color = (Color) fieldForeground.get(c);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- return color;
- }
-
- public static Color getBackground(Component c)
- {
- Color color = null;
- try {
- color = (Color) fieldBackground.get(c);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- return color;
- }
-
- public static void setBackground(Component c, Color color) {
- try {
- fieldBackground.set(c, color);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- }
-
- public static Font getFont(Component c)
- {
- Font f = null;
- try {
- f = (Font) fieldFont.get(c);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- return f;
- }
-
- public static ComponentPeer getPeer(Component c) {
- ComponentPeer peer = null;
- try {
- peer = (ComponentPeer)fieldPeer.get(c);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- return peer;
- }
-
- public static void setPeer(Component c, ComponentPeer peer) {
- try {
- fieldPeer.set(c, peer);
- } catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- }
-
- public static boolean getIgnoreRepaint(Component comp) {
- try {
- return fieldIgnoreRepaint.getBoolean(comp);
- }
- catch (IllegalAccessException e) {
- log.fine("Unable to access the Component object", e);
- }
-
- return false;
- }
-
- public static boolean getVisible(Component c) {
- try {
- return fieldVisible.getBoolean(c);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- return false;
- }
-
- public static boolean isEnabledImpl(Component c) {
- boolean enabled = true;
- try {
- enabled = (Boolean) methodIsEnabledImpl.invoke(c, (Object[]) null);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- catch (InvocationTargetException e) {
- log.fine("Unable to invoke on the Component object", e);
- }
- return enabled;
- }
-
- public static Cursor getCursor_NoClientCode(Component c) {
- Cursor cursor = null;
-
- try {
- cursor = (Cursor) methodGetCursorNoClientCode.invoke(c, (Object[]) null);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- catch (InvocationTargetException e) {
- log.fine("Unable to invoke on the Component object", e);
- }
-
- return cursor;
- }
-
- public static Point getLocation_NoClientCode(Component c) {
- Point loc = null;
-
- try {
- loc = (Point) methodLocationNoClientCode.invoke(c, (Object[]) null);
- }
- catch (IllegalAccessException e)
- {
- log.fine("Unable to access the Component object", e);
- }
- catch (InvocationTargetException e) {
- log.fine("Unable to invoke on the Component object", e);
- }
-
- return loc;
- }
-
-}
--- a/jdk/src/share/classes/sun/awt/GlobalCursorManager.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/awt/GlobalCursorManager.java Wed Dec 16 16:25:08 2009 -0800
@@ -183,7 +183,7 @@
}
if (comp instanceof Window) {
- p = ComponentAccessor.getLocation_NoClientCode(comp);
+ p = AWTAccessor.getComponentAccessor().getLocation(comp);
} else if (comp instanceof Container) {
p = getLocationOnScreen(comp);
}
@@ -202,7 +202,7 @@
}
}
- setCursor(comp, ComponentAccessor.getCursor_NoClientCode(comp), useCache);
+ setCursor(comp, AWTAccessor.getComponentAccessor().getCursor(comp), useCache);
} catch (IllegalComponentStateException e) {
// Shouldn't happen, but if it does, abort.
--- a/jdk/src/share/classes/sun/awt/SunToolkit.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/awt/SunToolkit.java Wed Dec 16 16:25:08 2009 -0800
@@ -722,13 +722,7 @@
EventQueue eq = (EventQueue)appContext.get(AppContext.EVENT_QUEUE_KEY);
AWTAccessor.EventQueueAccessor accessor = AWTAccessor.getEventQueueAccessor();
- EventQueue next = accessor.getNextQueue(eq);
- while (next != null) {
- eq = next;
- next = accessor.getNextQueue(eq);
- }
-
- return (Thread.currentThread() == accessor.getDispatchThread(eq));
+ return accessor.isDispatchThreadImpl(eq);
}
public Dimension getScreenSize() {
@@ -806,17 +800,9 @@
}
- /**
- * Makes the window OverrideRedirect, on X11 platforms. See
- * ICCCM specification for more details about OverrideRedirect
- * windows. Implemented in XToolkit, no-op in WToolkit.
- */
- public void setOverrideRedirect(Window target) {
- }
+ static final SoftCache imgCache = new SoftCache();
- static SoftCache imgCache = new SoftCache();
-
- static synchronized Image getImageFromHash(Toolkit tk, URL url) {
+ static Image getImageFromHash(Toolkit tk, URL url) {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
try {
@@ -844,32 +830,36 @@
sm.checkConnect(url.getHost(), url.getPort());
}
}
- Image img = (Image)imgCache.get(url);
- if (img == null) {
- try {
- img = tk.createImage(new URLImageSource(url));
- imgCache.put(url, img);
- } catch (Exception e) {
+ synchronized (imgCache) {
+ Image img = (Image)imgCache.get(url);
+ if (img == null) {
+ try {
+ img = tk.createImage(new URLImageSource(url));
+ imgCache.put(url, img);
+ } catch (Exception e) {
+ }
}
+ return img;
}
- return img;
}
- static synchronized Image getImageFromHash(Toolkit tk,
+ static Image getImageFromHash(Toolkit tk,
String filename) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(filename);
}
- Image img = (Image)imgCache.get(filename);
- if (img == null) {
- try {
- img = tk.createImage(new FileImageSource(filename));
- imgCache.put(filename, img);
- } catch (Exception e) {
+ synchronized (imgCache) {
+ Image img = (Image)imgCache.get(filename);
+ if (img == null) {
+ try {
+ img = tk.createImage(new FileImageSource(filename));
+ imgCache.put(filename, img);
+ } catch (Exception e) {
+ }
}
+ return img;
}
- return img;
}
public Image getImage(String filename) {
@@ -1129,6 +1119,18 @@
}
/**
+ * Gives native peers the ability to query the closest HW component.
+ * If the given component is heavyweight, then it returns this. Otherwise,
+ * it goes one level up in the hierarchy and tests next component.
+ */
+ public static Component getHeavyweightComponent(Component c) {
+ while (c != null && AWTAccessor.getComponentAccessor().isLightweight(c)) {
+ c = AWTAccessor.getComponentAccessor().getParent(c);
+ }
+ return c;
+ }
+
+ /**
* Returns a new input method window, with behavior as specified in
* {@link java.awt.im.spi.InputMethodContext#createInputMethodWindow}.
* If the inputContext is not null, the window should return it from its
--- a/jdk/src/share/classes/sun/awt/WindowAccessor.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-/*
- * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.awt;
-
-import java.awt.Window;
-
-import java.lang.reflect.Field;
-
-import sun.util.logging.PlatformLogger;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-public class WindowAccessor {
-
- private static Class windowClass;
- private static Field fieldIsAutoRequestFocus;
- private static Field fieldIsTrayIconWindow;
-
- private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.WindowAccessor");
-
- private WindowAccessor() {
- }
-
- static {
- AccessController.doPrivileged( new PrivilegedAction() {
- public Object run() {
- try {
- windowClass = Class.forName("java.awt.Window");
- fieldIsAutoRequestFocus = windowClass.getDeclaredField("autoRequestFocus");
- fieldIsAutoRequestFocus.setAccessible(true);
- fieldIsTrayIconWindow = windowClass.getDeclaredField("isTrayIconWindow");
- fieldIsTrayIconWindow.setAccessible(true);
-
- } catch (NoSuchFieldException e) {
- log.fine("Unable to initialize WindowAccessor: ", e);
- } catch (ClassNotFoundException e) {
- log.fine("Unable to initialize WindowAccessor: ", e);
- }
- return null;
- }
- });
- }
-
- public static boolean isAutoRequestFocus(Window w) {
- try {
- return fieldIsAutoRequestFocus.getBoolean(w);
-
- } catch (IllegalAccessException e) {
- log.fine("Unable to access the Window object", e);
- }
- return true;
- }
-
- public static boolean isTrayIconWindow(Window w) {
- try {
- return fieldIsTrayIconWindow.getBoolean(w);
-
- } catch (IllegalAccessException e) {
- log.fine("Unable to access the Window object", e);
- }
- return false;
- }
-
- public static void setTrayIconWindow(Window w, boolean isTrayIconWindow) {
- try {
- fieldIsTrayIconWindow.set(w, isTrayIconWindow);
-
- } catch (IllegalAccessException e) {
- log.fine("Unable to access the Window object", e);
- }
- }
-}
--- a/jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Wed Dec 16 16:25:08 2009 -0800
@@ -51,6 +51,9 @@
import java.io.SequenceInputStream;
import java.io.StringReader;
+import java.net.URI;
+import java.net.URISyntaxException;
+
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
@@ -626,6 +629,14 @@
public abstract boolean isImageFormat(long format);
/**
+ * Determines whether the format is a URI list we can convert to
+ * a DataFlavor.javaFileListFlavor.
+ */
+ protected boolean isURIListFormat(long format) {
+ return false;
+ }
+
+ /**
* Returns a Map whose keys are all of the possible formats into which the
* Transferable's transfer data flavors can be translated. The value of
* each key is the DataFlavor in which the Transferable's data should be
@@ -1297,45 +1308,53 @@
if (!DataFlavor.javaFileListFlavor.equals(flavor)) {
throw new IOException("data translation failed");
}
+
final List list = (List)obj;
- final ArrayList fileList = new ArrayList();
-
final ProtectionDomain userProtectionDomain = getUserProtectionDomain(contents);
- int nFiles = 0;
- for (int i = 0; i < list.size(); i++) {
- Object o = list.get(i);
- if (o instanceof File || o instanceof String) {
- nFiles++;
+ final ArrayList<String> fileList = castToFiles(list, userProtectionDomain);
+
+ bos = convertFileListToBytes(fileList);
+
+
+ // Target data is a URI list. Source data must be a
+ // java.util.List which contains java.io.File or String instances.
+ } else if (isURIListFormat(format)) {
+ if (!DataFlavor.javaFileListFlavor.equals(flavor)) {
+ throw new IOException("data translation failed");
+ }
+ String nat = getNativeForFormat(format);
+ String targetCharset = null;
+ if (nat != null) {
+ try {
+ targetCharset = new DataFlavor(nat).getParameter("charset");
+ } catch (ClassNotFoundException cnfe) {
+ throw new IOException(cnfe);
}
}
-
- try {
- AccessController.doPrivileged(new PrivilegedExceptionAction() {
- public Object run() throws IOException {
- for (Object fileObject : list)
- {
- File file = castToFile(fileObject);
- if (null == System.getSecurityManager() ||
- !(isFileInWebstartedCache(file) ||
- isForbiddenToRead(file, userProtectionDomain)))
- {
- fileList.add(file.getCanonicalPath());
- }
- }
- return null;
- }
- });
- } catch (PrivilegedActionException pae) {
- throw new IOException(pae.getMessage());
+ if (targetCharset == null) {
+ targetCharset = "UTF-8";
}
-
- for (int i = 0; i < fileList.size(); i++)
- {
- byte[] bytes = ((String)fileList.get(i)).getBytes();
- if (i != 0) bos.write(0);
+ final List list = (List)obj;
+ final ProtectionDomain userProtectionDomain = getUserProtectionDomain(contents);
+ final ArrayList<String> fileList = castToFiles(list, userProtectionDomain);
+ final ArrayList<String> uriList = new ArrayList<String>(fileList.size());
+ for (String fileObject : fileList) {
+ final URI uri = new File(fileObject).toURI();
+ // Some implementations are fussy about the number of slashes (file:///path/to/file is best)
+ try {
+ uriList.add(new URI(uri.getScheme(), "", uri.getPath(), uri.getFragment()).toString());
+ } catch (URISyntaxException uriSyntaxException) {
+ throw new IOException(uriSyntaxException);
+ }
+ }
+
+ byte[] eoln = "\r\n".getBytes(targetCharset);
+ for (int i = 0; i < uriList.size(); i++) {
+ byte[] bytes = uriList.get(i).getBytes(targetCharset);
bos.write(bytes, 0, bytes.length);
+ bos.write(eoln, 0, eoln.length);
}
// Source data is an InputStream. For arbitrary flavors, just grab the
@@ -1385,6 +1404,8 @@
return ret;
}
+ protected abstract ByteArrayOutputStream convertFileListToBytes(ArrayList<String> fileList) throws IOException;
+
private String removeSuspectedData(DataFlavor flavor, final Transferable contents, final String str)
throws IOException
{
@@ -1452,6 +1473,33 @@
return true;
}
+ private ArrayList<String> castToFiles(final List files,
+ final ProtectionDomain userProtectionDomain) throws IOException
+ {
+ final ArrayList<String> fileList = new ArrayList<String>();
+ try {
+ AccessController.doPrivileged(new PrivilegedExceptionAction() {
+ public Object run() throws IOException {
+ for (Object fileObject : files)
+ {
+ File file = castToFile(fileObject);
+ if (file != null &&
+ (null == System.getSecurityManager() ||
+ !(isFileInWebstartedCache(file) ||
+ isForbiddenToRead(file, userProtectionDomain))))
+ {
+ fileList.add(file.getCanonicalPath());
+ }
+ }
+ return null;
+ }
+ });
+ } catch (PrivilegedActionException pae) {
+ throw new IOException(pae.getMessage());
+ }
+ return fileList;
+ }
+
// It is important do not use user's successors
// of File class.
private File castToFile(Object fileObject) throws IOException {
@@ -1460,6 +1508,8 @@
filePath = ((File)fileObject).getCanonicalPath();
} else if (fileObject instanceof String) {
filePath = (String) fileObject;
+ } else {
+ return null;
}
return new File(filePath);
}
@@ -1565,6 +1615,29 @@
// Turn the list of Files into a List and return
return Arrays.asList(files);
+ // Source data is a URI list. Convert to DataFlavor.javaFileListFlavor
+ // where possible.
+ } else if (isURIListFormat(format) && DataFlavor.javaFileListFlavor.equals(flavor)) {
+ try {
+ URI uris[] = dragQueryURIs(str, bytes, format, localeTransferable);
+ if (uris == null) {
+ return null;
+ }
+ ArrayList files = new ArrayList();
+ for (URI uri : uris) {
+ try {
+ files.add(new File(uri));
+ } catch (IllegalArgumentException illegalArg) {
+ // When converting from URIs to less generic files,
+ // common practice (Wine, SWT) seems to be to
+ // silently drop the URIs that aren't local files.
+ }
+ }
+ return files;
+ } finally {
+ str.close();
+ }
+
// Target data is a String. Strip terminating NUL bytes. Decode bytes
// into characters. Search-and-replace EOLN.
} else if (String.class.equals(flavor.getRepresentationClass()) &&
@@ -1950,6 +2023,19 @@
protected abstract String[] dragQueryFile(byte[] bytes);
/**
+ * Decodes URIs from either a byte array or a stream.
+ */
+ protected URI[] dragQueryURIs(InputStream stream,
+ byte[] bytes,
+ long format,
+ Transferable localeTransferable)
+ throws IOException
+ {
+ throw new IOException(
+ new UnsupportedOperationException("not implemented on this platform"));
+ }
+
+ /**
* Translates either a byte array or an input stream which contain
* platform-specific image data in the given format into an Image.
*/
--- a/jdk/src/share/classes/sun/font/StandardGlyphVector.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/font/StandardGlyphVector.java Wed Dec 16 16:25:08 2009 -0800
@@ -396,12 +396,19 @@
// !!! not cached, assume TextLayout will cache if necessary
public Rectangle2D getVisualBounds() {
- if (glyphs.length == 0) {
- return new Rectangle2D.Float(0, 0, 0, 0);
+ Rectangle2D result = null;
+ for (int i = 0; i < glyphs.length; ++i) {
+ Rectangle2D glyphVB = getGlyphVisualBounds(i).getBounds2D();
+ if (!glyphVB.isEmpty()) {
+ if (result == null) {
+ result = glyphVB;
+ } else {
+ Rectangle2D.union(result, glyphVB, result);
+ }
+ }
}
- Rectangle2D result = getGlyphVisualBounds(0).getBounds2D();
- for (int i = 1; i < glyphs.length; ++i) {
- Rectangle2D.union(result, getGlyphVisualBounds(i).getBounds2D(), result);
+ if (result == null) {
+ result = new Rectangle2D.Float(0, 0, 0, 0);
}
return result;
}
@@ -1787,8 +1794,19 @@
gp.transform(sgv.invdtx);
result = gp.getBounds2D();
}
- result.setRect(result.getMinX() + x + dx, result.getMinY() + y + dy,
- result.getWidth(), result.getHeight());
+ /* Since x is the logical advance of the glyph to this point.
+ * Because of the way that Rectangle.union is specified, this
+ * means that subsequent unioning of a rect including that
+ * will be affected, even if the glyph is empty. So skip such
+ * cases. This alone isn't a complete solution since x==0
+ * may also not be what is wanted. The code that does the
+ * unioning also needs to be aware to ignore empty glyphs.
+ */
+ if (!result.isEmpty()) {
+ result.setRect(result.getMinX() + x + dx,
+ result.getMinY() + y + dy,
+ result.getWidth(), result.getHeight());
+ }
return result;
}
--- a/jdk/src/share/classes/sun/net/www/protocol/http/spnego/NegotiatorImpl.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/spnego/NegotiatorImpl.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,6 +25,7 @@
package sun.net.www.protocol.http.spnego;
+import com.sun.security.jgss.ExtendedGSSContext;
import java.io.IOException;
import org.ietf.jgss.GSSContext;
@@ -100,15 +101,10 @@
null,
GSSContext.DEFAULT_LIFETIME);
- // In order to support credential delegation in HTTP/SPNEGO,
- // we always request it before initSecContext. The current
- // implementation will check the OK-AS-DELEGATE flag inside
- // the service ticket of the web server, and only enable
- // delegation when this flag is set. This check is only
- // performed when the GSS caller is CALLER_HTTP_NEGOTIATE,
- // so all other normal GSS-API calls are not affected.
-
- context.requestCredDeleg(true);
+ // Always respect delegation policy in HTTP/SPNEGO.
+ if (context instanceof ExtendedGSSContext) {
+ ((ExtendedGSSContext)context).requestDelegPolicy(true);
+ }
oneToken = context.initSecContext(new byte[0], 0, 0);
}
--- a/jdk/src/share/classes/sun/security/jgss/GSSContextImpl.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/jgss/GSSContextImpl.java Wed Dec 16 16:25:08 2009 -0800
@@ -89,7 +89,8 @@
*/
class GSSContextImpl implements ExtendedGSSContext {
- private GSSManagerImpl gssManager = null;
+ private final GSSManagerImpl gssManager;
+ private final boolean initiator;
// private flags for the context state
private static final int PRE_INIT = 1;
@@ -99,14 +100,12 @@
// instance variables
private int currentState = PRE_INIT;
- private boolean initiator;
private GSSContextSpi mechCtxt = null;
private Oid mechOid = null;
private ObjectIdentifier objId = null;
private GSSCredentialImpl myCred = null;
- private GSSCredentialImpl delegCred = null;
private GSSNameImpl srcName = null;
private GSSNameImpl targName = null;
@@ -121,6 +120,7 @@
private boolean reqSequenceDetState = true;
private boolean reqCredDelegState = false;
private boolean reqAnonState = false;
+ private boolean reqDelegPolicyState = false;
/**
* Creates a GSSContextImp on the context initiator's side.
@@ -221,6 +221,7 @@
mechCtxt.requestSequenceDet(reqSequenceDetState);
mechCtxt.requestAnonymity(reqAnonState);
mechCtxt.setChannelBinding(channelBindings);
+ mechCtxt.requestDelegPolicy(reqDelegPolicyState);
objId = new ObjectIdentifier(mechOid.toString());
@@ -465,42 +466,42 @@
}
public void requestMutualAuth(boolean state) throws GSSException {
- if (mechCtxt == null)
+ if (mechCtxt == null && initiator)
reqMutualAuthState = state;
}
public void requestReplayDet(boolean state) throws GSSException {
- if (mechCtxt == null)
+ if (mechCtxt == null && initiator)
reqReplayDetState = state;
}
public void requestSequenceDet(boolean state) throws GSSException {
- if (mechCtxt == null)
+ if (mechCtxt == null && initiator)
reqSequenceDetState = state;
}
public void requestCredDeleg(boolean state) throws GSSException {
- if (mechCtxt == null)
+ if (mechCtxt == null && initiator)
reqCredDelegState = state;
}
public void requestAnonymity(boolean state) throws GSSException {
- if (mechCtxt == null)
+ if (mechCtxt == null && initiator)
reqAnonState = state;
}
public void requestConf(boolean state) throws GSSException {
- if (mechCtxt == null)
+ if (mechCtxt == null && initiator)
reqConfState = state;
}
public void requestInteg(boolean state) throws GSSException {
- if (mechCtxt == null)
+ if (mechCtxt == null && initiator)
reqIntegState = state;
}
public void requestLifetime(int lifetime) throws GSSException {
- if (mechCtxt == null)
+ if (mechCtxt == null && initiator)
reqLifetime = lifetime;
}
@@ -630,6 +631,8 @@
targName = null;
}
+ // ExtendedGSSContext methods:
+
@Override
public Object inquireSecContext(InquireType type) throws GSSException {
SecurityManager security = System.getSecurityManager();
@@ -641,4 +644,18 @@
}
return mechCtxt.inquireSecContext(type);
}
+
+ @Override
+ public void requestDelegPolicy(boolean state) throws GSSException {
+ if (mechCtxt == null && initiator)
+ reqDelegPolicyState = state;
+ }
+
+ @Override
+ public boolean getDelegPolicyState() {
+ if (mechCtxt != null)
+ return mechCtxt.getDelegPolicyState();
+ else
+ return reqDelegPolicyState;
+ }
}
--- a/jdk/src/share/classes/sun/security/jgss/krb5/InitialToken.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/jgss/krb5/InitialToken.java Wed Dec 16 16:25:08 2009 -0800
@@ -85,34 +85,41 @@
int size = CHECKSUM_LENGTH_SIZE + CHECKSUM_BINDINGS_SIZE +
CHECKSUM_FLAGS_SIZE;
- if (context.getCredDelegState()) {
- if (context.getCaller() instanceof HttpCaller &&
- !serviceTicket.getFlags()[Krb5.TKT_OPTS_DELEGATE]) {
- // When the caller is HTTP/SPNEGO and OK-AS-DELEGATE
- // is not present in the service ticket, delegation
- // is disabled.
- context.setCredDelegState(false);
- } else if (!tgt.isForwardable()) {
- // XXX log this resetting of delegation state
- context.setCredDelegState(false);
+ if (!tgt.isForwardable()) {
+ context.setCredDelegState(false);
+ context.setDelegPolicyState(false);
+ } else if (context.getCredDelegState()) {
+ if (context.getDelegPolicyState()) {
+ if (!serviceTicket.checkDelegate()) {
+ // delegation not permitted by server policy, mark it
+ context.setDelegPolicyState(false);
+ }
+ }
+ } else if (context.getDelegPolicyState()) {
+ if (serviceTicket.checkDelegate()) {
+ context.setCredDelegState(true);
} else {
- KrbCred krbCred = null;
- CipherHelper cipherHelper =
- context.getCipherHelper(serviceTicket.getSessionKey());
- if (useNullKey(cipherHelper)) {
- krbCred = new KrbCred(tgt, serviceTicket,
- EncryptionKey.NULL_KEY);
- } else {
- krbCred = new KrbCred(tgt, serviceTicket,
- serviceTicket.getSessionKey());
- }
- krbCredMessage = krbCred.getMessage();
- size += CHECKSUM_DELEG_OPT_SIZE +
- CHECKSUM_DELEG_LGTH_SIZE +
- krbCredMessage.length;
+ context.setDelegPolicyState(false);
}
}
+ if (context.getCredDelegState()) {
+ KrbCred krbCred = null;
+ CipherHelper cipherHelper =
+ context.getCipherHelper(serviceTicket.getSessionKey());
+ if (useNullKey(cipherHelper)) {
+ krbCred = new KrbCred(tgt, serviceTicket,
+ EncryptionKey.NULL_KEY);
+ } else {
+ krbCred = new KrbCred(tgt, serviceTicket,
+ serviceTicket.getSessionKey());
+ }
+ krbCredMessage = krbCred.getMessage();
+ size += CHECKSUM_DELEG_OPT_SIZE +
+ CHECKSUM_DELEG_LGTH_SIZE +
+ krbCredMessage.length;
+ }
+
checksumBytes = new byte[size];
checksumBytes[pos++] = CHECKSUM_FIRST_BYTES[0];
@@ -296,6 +303,7 @@
return delegCreds;
}
+ // Only called by acceptor
public void setContextFlags(Krb5Context context) {
// default for cred delegation is false
if ((flags & CHECKSUM_DELEG_FLAG) > 0)
--- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Wed Dec 16 16:25:08 2009 -0800
@@ -78,6 +78,7 @@
private boolean sequenceDetState = true;
private boolean confState = true;
private boolean integState = true;
+ private boolean delegPolicyState = false;
private int mySeqNumber;
private int peerSeqNumber;
@@ -299,6 +300,21 @@
return sequenceDetState || replayDetState;
}
+ /**
+ * Requests that the deleg policy be respected.
+ */
+ public final void requestDelegPolicy(boolean value) {
+ if (state == STATE_NEW && isInitiator())
+ delegPolicyState = value;
+ }
+
+ /**
+ * Is deleg policy respected?
+ */
+ public final boolean getDelegPolicyState() {
+ return delegPolicyState;
+ }
+
/*
* Anonymity is a little different in that after an application
* requests anonymity it will want to know whether the mechanism
@@ -422,6 +438,10 @@
integState = state;
}
+ final void setDelegPolicyState(boolean state) {
+ delegPolicyState = state;
+ }
+
/**
* Sets the channel bindings to be used during context
* establishment.
--- a/jdk/src/share/classes/sun/security/jgss/spi/GSSContextSpi.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/jgss/spi/GSSContextSpi.java Wed Dec 16 16:25:08 2009 -0800
@@ -124,6 +124,8 @@
public void requestInteg(boolean state) throws GSSException;
+ public void requestDelegPolicy(boolean state) throws GSSException;
+
public void setChannelBinding(ChannelBinding cb) throws GSSException;
public boolean getCredDelegState();
@@ -136,6 +138,8 @@
public boolean getAnonymityState();
+ public boolean getDelegPolicyState();
+
public boolean isTransferable() throws GSSException;
public boolean isProtReady();
--- a/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java Wed Dec 16 16:25:08 2009 -0800
@@ -63,6 +63,7 @@
private boolean sequenceDetState = true;
private boolean confState = true;
private boolean integState = true;
+ private boolean delegPolicyState = false;
private GSSNameSpi peerName = null;
private GSSNameSpi myName = null;
@@ -154,6 +155,14 @@
}
/**
+ * Requests that deleg policy be respected.
+ */
+ public final void requestDelegPolicy(boolean value) throws GSSException {
+ if (state == STATE_NEW && isInitiator())
+ delegPolicyState = value;
+ }
+
+ /**
* Is integrity available?
*/
public final boolean getIntegState() {
@@ -161,6 +170,19 @@
}
/**
+ * Is deleg policy respected?
+ */
+ public final boolean getDelegPolicyState() {
+ if (isInitiator() && mechContext != null &&
+ mechContext instanceof ExtendedGSSContext &&
+ (state == STATE_IN_PROCESS || state == STATE_DONE)) {
+ return ((ExtendedGSSContext)mechContext).getDelegPolicyState();
+ } else {
+ return delegPolicyState;
+ }
+ }
+
+ /**
* Requests that credential delegation be done during context
* establishment.
*/
@@ -173,7 +195,7 @@
* Is credential delegation enabled?
*/
public final boolean getCredDelegState() {
- if (mechContext != null &&
+ if (isInitiator() && mechContext != null &&
(state == STATE_IN_PROCESS || state == STATE_DONE)) {
return mechContext.getCredDelegState();
} else {
@@ -201,30 +223,6 @@
return mutualAuthState;
}
- final void setCredDelegState(boolean state) {
- credDelegState = state;
- }
-
- final void setMutualAuthState(boolean state) {
- mutualAuthState = state;
- }
-
- final void setReplayDetState(boolean state) {
- replayDetState = state;
- }
-
- final void setSequenceDetState(boolean state) {
- sequenceDetState = state;
- }
-
- final void setConfState(boolean state) {
- confState = state;
- }
-
- final void setIntegState(boolean state) {
- integState = state;
- }
-
/**
* Returns the mechanism oid.
*
@@ -319,14 +317,9 @@
mechToken = GSS_initSecContext(null);
errorCode = GSSException.DEFECTIVE_TOKEN;
- byte[] micToken = null;
- if (!GSSUtil.useMSInterop()) {
- // calculate MIC only in normal mode
- micToken = generateMechListMIC(DER_mechTypes);
- }
// generate SPNEGO token
initToken = new NegTokenInit(DER_mechTypes, getContextFlags(),
- mechToken, micToken);
+ mechToken, null);
if (DEBUG) {
System.out.println("SpNegoContext.initSecContext: " +
"sending token of type = " +
@@ -585,15 +578,9 @@
"negotiated result = " + negoResult);
}
- // calculate MIC only in normal mode
- byte[] micToken = null;
- if (!GSSUtil.useMSInterop() && valid) {
- micToken = generateMechListMIC(DER_mechTypes);
- }
-
// generate SPNEGO token
NegTokenTarg targToken = new NegTokenTarg(negoResult.ordinal(),
- mech_wanted, accept_token, micToken);
+ mech_wanted, accept_token, null);
if (DEBUG) {
System.out.println("SpNegoContext.acceptSecContext: " +
"sending token of type = " +
@@ -653,6 +640,10 @@
throw gssException;
}
+ if (state == STATE_DONE) {
+ // now set the context flags for acceptor
+ setContextFlags();
+ }
return retVal;
}
@@ -703,36 +694,39 @@
return out;
}
+ // Only called on acceptor side. On the initiator side, most flags
+ // are already set at request. For those that might get chanegd,
+ // state from mech below is used.
private void setContextFlags() {
if (mechContext != null) {
// default for cred delegation is false
if (mechContext.getCredDelegState()) {
- setCredDelegState(true);
+ credDelegState = true;
}
// default for the following are true
if (!mechContext.getMutualAuthState()) {
- setMutualAuthState(false);
+ mutualAuthState = false;
}
if (!mechContext.getReplayDetState()) {
- setReplayDetState(false);
+ replayDetState = false;
}
if (!mechContext.getSequenceDetState()) {
- setSequenceDetState(false);
+ sequenceDetState = false;
}
if (!mechContext.getIntegState()) {
- setIntegState(false);
+ integState = false;
}
if (!mechContext.getConfState()) {
- setConfState(false);
+ confState = false;
}
}
}
/**
- * generate MIC on mechList
+ * generate MIC on mechList. Not used at the moment.
*/
- private byte[] generateMechListMIC(byte[] mechTypes)
+ /*private byte[] generateMechListMIC(byte[] mechTypes)
throws GSSException {
// sanity check the required input
@@ -769,7 +763,7 @@
}
}
return mic;
- }
+ }*/
/**
* verify MIC on MechList
@@ -837,6 +831,10 @@
mechContext.requestMutualAuth(mutualAuthState);
mechContext.requestReplayDet(replayDetState);
mechContext.requestSequenceDet(sequenceDetState);
+ if (mechContext instanceof ExtendedGSSContext) {
+ ((ExtendedGSSContext)mechContext).requestDelegPolicy(
+ delegPolicyState);
+ }
}
// pass token
@@ -1202,5 +1200,5 @@
"inquireSecContext not supported by underlying mech.");
}
}
+}
-}
--- a/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoMechFactory.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoMechFactory.java Wed Dec 16 16:25:08 2009 -0800
@@ -57,6 +57,12 @@
GSSName.NT_HOSTBASED_SERVICE,
GSSName.NT_EXPORT_NAME};
+ // The default underlying mech of SPNEGO, must not be SPNEGO itself.
+ private static final Oid DEFAULT_SPNEGO_MECH_OID =
+ ProviderList.DEFAULT_MECH_OID.equals(GSS_SPNEGO_MECH_OID)?
+ GSSUtil.GSS_KRB5_MECH_OID:
+ ProviderList.DEFAULT_MECH_OID;
+
// Use an instance of a GSSManager whose provider list
// does not include native provider
final GSSManagerImpl manager;
@@ -100,18 +106,27 @@
availableMechs[j++] = mechs[i];
}
}
+ // Move the preferred mech to first place
+ for (int i=0; i<availableMechs.length; i++) {
+ if (availableMechs[i].equals(DEFAULT_SPNEGO_MECH_OID)) {
+ if (i != 0) {
+ availableMechs[i] = availableMechs[0];
+ availableMechs[0] = DEFAULT_SPNEGO_MECH_OID;
+ }
+ break;
+ }
+ }
}
public GSSNameSpi getNameElement(String nameStr, Oid nameType)
- throws GSSException {
- // get NameElement for the default Mechanism
- return manager.getNameElement(nameStr, nameType, null);
+ throws GSSException {
+ return manager.getNameElement(
+ nameStr, nameType, DEFAULT_SPNEGO_MECH_OID);
}
public GSSNameSpi getNameElement(byte[] name, Oid nameType)
- throws GSSException {
- // get NameElement for the default Mechanism
- return manager.getNameElement(name, nameType, null);
+ throws GSSException {
+ return manager.getNameElement(name, nameType, DEFAULT_SPNEGO_MECH_OID);
}
public GSSCredentialSpi getCredentialElement(GSSNameSpi name,
--- a/jdk/src/share/classes/sun/security/jgss/wrapper/NativeGSSContext.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/jgss/wrapper/NativeGSSContext.java Wed Dec 16 16:25:08 2009 -0800
@@ -549,6 +549,9 @@
public void requestInteg(boolean state) throws GSSException {
changeFlags(GSS_C_INTEG_FLAG, state);
}
+ public void requestDelegPolicy(boolean state) throws GSSException {
+ // Not supported, ignore
+ }
public void requestLifetime(int lifetime) throws GSSException {
if (isInitiator && pContext == 0) {
this.lifetime = lifetime;
@@ -590,6 +593,9 @@
public boolean getIntegState() {
return checkFlags(GSS_C_INTEG_FLAG);
}
+ public boolean getDelegPolicyState() {
+ return false;
+ }
public int getLifetime() {
return cStub.getContextTime(pContext);
}
--- a/jdk/src/share/classes/sun/security/krb5/Credentials.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/krb5/Credentials.java Wed Dec 16 16:25:08 2009 -0800
@@ -234,7 +234,19 @@
* @return true if OK-AS_DELEGATE flag is set, otherwise, return false.
*/
public boolean checkDelegate() {
- return (flags.get(Krb5.TKT_OPTS_DELEGATE));
+ return flags.get(Krb5.TKT_OPTS_DELEGATE);
+ }
+
+ /**
+ * Reset TKT_OPTS_DELEGATE to false, called at credentials acquirement
+ * when one of the cross-realm TGTs does not have the OK-AS-DELEGATE
+ * flag set. This info must be preservable and restorable through
+ * the Krb5Util.credsToTicket/ticketToCreds() methods so that even if
+ * the service ticket is cached it still remembers the cross-realm
+ * authentication result.
+ */
+ public void resetDelegate() {
+ flags.set(Krb5.TKT_OPTS_DELEGATE, false);
}
public Credentials renew() throws KrbException, IOException {
--- a/jdk/src/share/classes/sun/security/krb5/internal/CredentialsUtil.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/krb5/internal/CredentialsUtil.java Wed Dec 16 16:25:08 2009 -0800
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2001-2004 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -117,6 +117,7 @@
// Get a list of realms to traverse
String[] realms = Realm.getRealmsList(localRealm, serviceRealm);
+ boolean okAsDelegate = true;
if (realms == null || realms.length == 0)
{
@@ -194,6 +195,15 @@
*/
newTgtRealm = newTgt.getServer().getInstanceComponent();
+ if (okAsDelegate && !newTgt.checkDelegate()) {
+ if (DEBUG)
+ {
+ System.out.println(">>> Credentials acquireServiceCreds: " +
+ "global OK-AS-DELEGATE turned off at " +
+ newTgt.getServer());
+ }
+ okAsDelegate = false;
+ }
if (DEBUG)
{
@@ -283,6 +293,9 @@
System.out.println(">>> Credentials acquireServiceCreds: returning creds:");
Credentials.printDebug(theCreds);
}
+ if (!okAsDelegate) {
+ theCreds.resetDelegate();
+ }
return theCreds;
}
throw new KrbApErrException(Krb5.KRB_AP_ERR_GEN_CRED,
--- a/jdk/src/share/classes/sun/security/pkcs/PKCS10.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/pkcs/PKCS10.java Wed Dec 16 16:25:08 2009 -0800
@@ -44,7 +44,6 @@
import sun.security.x509.AlgorithmId;
import sun.security.x509.X509Key;
import sun.security.x509.X500Name;
-import sun.security.x509.X500Signer;
/**
* A PKCS #10 certificate request is created and sent to a Certificate
@@ -183,13 +182,13 @@
* Create the signed certificate request. This will later be
* retrieved in either string or binary format.
*
- * @param requester identifies the signer (by X.500 name)
- * and provides the private key used to sign.
+ * @param subject identifies the signer (by X.500 name).
+ * @param signature private key and signing algorithm to use.
* @exception IOException on errors.
* @exception CertificateException on certificate handling errors.
* @exception SignatureException on signature handling errors.
*/
- public void encodeAndSign(X500Signer requester)
+ public void encodeAndSign(X500Name subject, Signature signature)
throws CertificateException, IOException, SignatureException {
DerOutputStream out, scratch;
byte[] certificateRequestInfo;
@@ -198,7 +197,7 @@
if (encoded != null)
throw new SignatureException("request is already signed");
- subject = requester.getSigner();
+ this.subject = subject;
/*
* Encode cert request info, wrap in a sequence for signing
@@ -217,14 +216,20 @@
/*
* Sign it ...
*/
- requester.update(certificateRequestInfo, 0,
+ signature.update(certificateRequestInfo, 0,
certificateRequestInfo.length);
- sig = requester.sign();
+ sig = signature.sign();
/*
* Build guts of SIGNED macro
*/
- requester.getAlgorithmId().encode(scratch); // sig algorithm
+ AlgorithmId algId = null;
+ try {
+ algId = AlgorithmId.getAlgorithmId(signature.getAlgorithm());
+ } catch (NoSuchAlgorithmException nsae) {
+ throw new SignatureException(nsae);
+ }
+ algId.encode(scratch); // sig algorithm
scratch.putBitString(sig); // sig
/*
--- a/jdk/src/share/classes/sun/security/provider/IdentityDatabase.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,427 +0,0 @@
-/*
- * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.security.provider;
-
-import java.io.*;
-import java.util.*;
-import java.security.*;
-
-/**
- * An implementation of IdentityScope as a persistent identity
- * database.
- *
- * @see Identity
- * @see Key
- *
- * @author Benjamin Renaud
- */
-public
-class IdentityDatabase extends IdentityScope implements Serializable {
-
- /** use serialVersionUID from JDK 1.1. for interoperability */
- private static final long serialVersionUID = 4923799573357658384L;
-
- /* Are we debugging? */
- private static final boolean debug = false;
-
- /* Are we printing out error messages? */
- private static final boolean error = true;
-
- /* The source file, if any, for this database.*/
- File sourceFile;
-
- /* The private representation of the database.*/
- Hashtable<String, Identity> identities;
-
- IdentityDatabase() throws InvalidParameterException {
- this("restoring...");
- }
-
- /**
- * Construct a new, empty database with a specified source file.
- *
- * @param file the source file.
- */
- public IdentityDatabase(File file) throws InvalidParameterException {
- this(file.getName());
- sourceFile = file;
- }
-
- /**
- * Construct a new, empty database.
- */
- public IdentityDatabase(String name) throws InvalidParameterException {
- super(name);
- identities = new Hashtable<String, Identity>();
- }
-
- /**
- * Initialize an identity database from a stream. The stream should
- * contain data to initialized a serialized IdentityDatabase
- * object.
- *
- * @param is the input stream from which to restore the database.
- *
- * @exception IOException if a stream IO exception occurs
- */
- public static IdentityDatabase fromStream(InputStream is)
- throws IOException {
- IdentityDatabase db = null;
- try {
- ObjectInputStream ois = new ObjectInputStream(is);
- db = (IdentityDatabase)ois.readObject();
- } catch (ClassNotFoundException e) {
- // this can't happen.
- debug("This should not be happening.", e);
- error(
- "The version of the database is obsolete. Cannot initialize.");
-
- } catch (InvalidClassException e) {
- // this may happen in developers workspaces happen.
- debug("This should not be happening.", e);
- error("Unable to initialize system identity scope: " +
- " InvalidClassException. \nThis is most likely due to " +
- "a serialization versioning problem: a class used in " +
- "key management was obsoleted");
-
- } catch (StreamCorruptedException e) {
- debug("The serialization stream is corrupted. Unable to load.", e);
- error("Unable to initialize system identity scope." +
- " StreamCorruptedException.");
- }
-
- if (db == null) {
- db = new IdentityDatabase("uninitialized");
- }
-
- return db;
- }
-
- /**
- * Initialize an IdentityDatabase from file.
- *
- * @param f the filename where the identity database is stored.
- *
- * @exception IOException a file-related exception occurs (e.g.
- * the directory of the file passed does not exists, etc.
- *
- * @IOException if a file IO exception occurs.
- */
- public static IdentityDatabase fromFile(File f) throws IOException {
- FileInputStream fis = new FileInputStream(f);
- IdentityDatabase edb = fromStream(fis);
- edb.sourceFile = f;
- return edb;
- }
-
-
-
- /**
- * @return the number of identities in the database.
- */
- public int size() {
- return identities.size();
- }
-
-
- /**
- * @param name the name of the identity to be retrieved.
- *
- * @return the identity named name, or null if there are
- * no identities named name in the database.
- */
- public Identity getIdentity(String name) {
- Identity id = identities.get(name);
- if (id instanceof Signer) {
- localCheck("get.signer");
- }
- return id;
- }
-
- /**
- * Get an identity by key.
- *
- * @param name the key of the identity to be retrieved.
- *
- * @return the identity with a given key, or null if there are no
- * identities with that key in the database.
- */
- public Identity getIdentity(PublicKey key) {
- if (key == null) {
- return null;
- }
- Enumeration<Identity> e = identities();
- while (e.hasMoreElements()) {
- Identity i = e.nextElement();
- PublicKey k = i.getPublicKey();
- if (k != null && keyEqual(k, key)) {
- if (i instanceof Signer) {
- localCheck("get.signer");
- }
- return i;
- }
- }
- return null;
- }
-
- private boolean keyEqual(Key key1, Key key2) {
- if (key1 == key2) {
- return true;
- } else {
- return MessageDigest.isEqual(key1.getEncoded(), key2.getEncoded());
- }
- }
-
- /**
- * Adds an identity to the database.
- *
- * @param identity the identity to be added.
- *
- * @exception KeyManagementException if a name or key clash
- * occurs, or if another exception occurs.
- */
- public void addIdentity(Identity identity)
- throws KeyManagementException {
- localCheck("add.identity");
- Identity byName = getIdentity(identity.getName());
- Identity byKey = getIdentity(identity.getPublicKey());
- String msg = null;
-
- if (byName != null) {
- msg = "name conflict";
- }
- if (byKey != null) {
- msg = "key conflict";
- }
- if (msg != null) {
- throw new KeyManagementException(msg);
- }
- identities.put(identity.getName(), identity);
- }
-
- /**
- * Removes an identity to the database.
- */
- public void removeIdentity(Identity identity)
- throws KeyManagementException {
- localCheck("remove.identity");
- String name = identity.getName();
- if (identities.get(name) == null) {
- throw new KeyManagementException("there is no identity named " +
- name + " in " + this);
- }
- identities.remove(name);
- }
-
- /**
- * @return an enumeration of all identities in the database.
- */
- public Enumeration<Identity> identities() {
- return identities.elements();
- }
-
- /**
- * Set the source file for this database.
- */
- void setSourceFile(File f) {
- sourceFile = f;
- }
-
- /**
- * @return the source file for this database.
- */
- File getSourceFile() {
- return sourceFile;
- }
-
- /**
- * Save the database in its current state to an output stream.
- *
- * @param os the output stream to which the database should be serialized.
- *
- * @exception IOException if an IO exception is raised by stream
- * operations.
- */
- public void save(OutputStream os) throws IOException {
- try {
- ObjectOutputStream oos = new ObjectOutputStream(os);
- oos.writeObject(this);
- oos.flush();
- } catch (InvalidClassException e) {
- debug("This should not be happening.", e);
- return;
- }
- }
-
- /**
- * Save the database to a file.
- *
- * @exception IOException if an IO exception is raised by stream
- * operations.
- */
- void save(File f) throws IOException {
- setSourceFile(f);
- FileOutputStream fos = new FileOutputStream(f);
- save(fos);
- }
-
- /**
- * Saves the database to the default source file.
- *
- * @exception KeyManagementException when there is no default source
- * file specified for this database.
- */
- public void save() throws IOException {
- if (sourceFile == null) {
- throw new IOException("this database has no source file");
- }
- save(sourceFile);
- }
-
- /**
- * This method returns the file from which to initialize the
- * system database.
- */
- private static File systemDatabaseFile() {
-
- // First figure out where the identity database is hiding, if anywhere.
- String dbPath = Security.getProperty("identity.database");
- // if nowhere, it's the canonical place.
- if (dbPath == null) {
- dbPath = System.getProperty("user.home") + File.separatorChar +
- "identitydb.obj";
- }
- return new File(dbPath);
- }
-
-
- /* This block initializes the system database, if there is one. */
- static {
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<Void>() {
- public Void run() {
- initializeSystem();
- return null;
- }
- });
- }
-
- /**
- * This method initializes the system's identity database. The
- * canonical location is
- * <user.home>/identitydatabase.obj. This is settable through
- * the identity.database property. */
- private static void initializeSystem() {
-
- IdentityDatabase systemDatabase;
- File dbFile = systemDatabaseFile();
-
- // Second figure out if it's there, and if it isn't, create one.
- try {
- if (dbFile.exists()) {
- debug("loading system database from file: " + dbFile);
- systemDatabase = fromFile(dbFile);
- } else {
- systemDatabase = new IdentityDatabase(dbFile);
- }
- IdentityScope.setSystemScope(systemDatabase);
- debug("System database initialized: " + systemDatabase);
- } catch (IOException e) {
- debug("Error initializing identity database: " + dbFile, e);
- return;
- } catch (InvalidParameterException e) {
- debug("Error trying to instantiate a system identities db in " +
- dbFile, e);
- return;
- }
- }
-
- /*
- private static File securityPropFile(String filename) {
- // maybe check for a system property which will specify where to
- // look.
- String sep = File.separator;
- return new File(System.getProperty("java.home") +
- sep + "lib" + sep + "security" +
- sep + filename);
- }
- */
-
- public String toString() {
- return "sun.security.provider.IdentityDatabase, source file: " +
- sourceFile;
- }
-
-
- private static void debug(String s) {
- if (debug) {
- System.err.println(s);
- }
- }
-
- private static void debug(String s, Throwable t) {
- if (debug) {
- t.printStackTrace();
- System.err.println(s);
- }
- }
-
- private static void error(String s) {
- if (error) {
- System.err.println(s);
- }
- }
-
- void localCheck(String directive) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- directive = this.getClass().getName() + "." +
- directive + "." + localFullName();
- security.checkSecurityAccess(directive);
- }
- }
-
- /**
- * Returns a parsable name for identity: identityName.scopeName
- */
- String localFullName() {
- String parsable = getName();
- if (getScope() != null) {
- parsable += "." +getScope().getName();
- }
- return parsable;
- }
-
- /**
- * Serialization write.
- */
- private synchronized void writeObject (java.io.ObjectOutputStream stream)
- throws IOException {
- localCheck("serialize.identity.database");
- stream.writeObject(identities);
- stream.writeObject(sourceFile);
- }
-}
--- a/jdk/src/share/classes/sun/security/provider/PolicyFile.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/provider/PolicyFile.java Wed Dec 16 16:25:08 2009 -0800
@@ -295,16 +295,13 @@
private static final int DEFAULT_CACHE_SIZE = 1;
- /** the scope to check */
- private static IdentityScope scope = null;
-
// contains the policy grant entries, PD cache, and alias mapping
private AtomicReference<PolicyInfo> policyInfo =
new AtomicReference<PolicyInfo>();
private boolean constructed = false;
private boolean expandProperties = true;
- private boolean ignoreIdentityScope = false;
+ private boolean ignoreIdentityScope = true;
private boolean allowSystemProperties = true;
private boolean notUtf8 = false;
private URL url;
@@ -2024,85 +2021,9 @@
private boolean checkForTrustedIdentity(final Certificate cert,
PolicyInfo myInfo)
{
- if (cert == null)
- return false;
-
- // see if we are ignoring the identity scope or not
- if (ignoreIdentityScope)
- return false;
-
- // try to initialize scope
- synchronized(PolicyFile.class) {
- if (scope == null) {
- IdentityScope is = IdentityScope.getSystemScope();
-
- if (is instanceof sun.security.provider.IdentityDatabase) {
- scope = is;
- } else {
- // leave scope null
- }
- }
- }
-
- if (scope == null) {
- ignoreIdentityScope = true;
- return false;
- }
-
- // need privileged block for getIdentity in case we are trying
- // to get a signer
- final Identity id = AccessController.doPrivileged(
- new java.security.PrivilegedAction<Identity>() {
- public Identity run() {
- return scope.getIdentity(cert.getPublicKey());
- }
- });
-
- if (isTrusted(id)) {
- if (debug != null) {
- debug.println("Adding policy entry for trusted Identity: ");
- //needed for identity toString!
- AccessController.doPrivileged(
- new java.security.PrivilegedAction<Void>() {
- public Void run() {
- debug.println(" identity = " + id);
- return null;
- }
- });
- debug.println("");
- }
-
- // add it to the policy for future reference
- Certificate certs[] = new Certificate[] {cert};
- PolicyEntry pe = new PolicyEntry(new CodeSource(null, certs));
- pe.add(SecurityConstants.ALL_PERMISSION);
-
- myInfo.identityPolicyEntries.add(pe);
-
- // add it to the mapping as well so
- // we don't have to go through this again
- myInfo.aliasMapping.put(cert, id.getName());
-
- return true;
- }
return false;
}
- private static boolean isTrusted(Identity id) {
- if (id instanceof SystemIdentity) {
- SystemIdentity sysid = (SystemIdentity)id;
- if (sysid.isTrusted()) {
- return true;
- }
- } else if (id instanceof SystemSigner) {
- SystemSigner sysid = (SystemSigner)id;
- if (sysid.isTrusted()) {
- return true;
- }
- }
- return false;
- }
-
/**
* Each entry in the policy configuration file is represented by a
* PolicyEntry object. <p>
--- a/jdk/src/share/classes/sun/security/provider/SystemIdentity.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-/*
- * Copyright 1996-2000 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.security.provider;
-
-import java.io.Serializable;
-import java.util.Enumeration;
-import java.security.*;
-
-/**
- * An identity with a very simple trust mechanism.
- *
- * @author Benjamin Renaud
- */
-
-public class SystemIdentity extends Identity implements Serializable {
-
- /** use serialVersionUID from JDK 1.1. for interoperability */
- private static final long serialVersionUID = 9060648952088498478L;
-
- /* This should be changed to ACL */
- boolean trusted = false;
-
- /* Free form additional information about this identity. */
- private String info;
-
- public SystemIdentity(String name, IdentityScope scope)
- throws InvalidParameterException, KeyManagementException {
- super(name, scope);
- }
-
- /**
- * Is this identity trusted by sun.* facilities?
- */
- public boolean isTrusted() {
- return trusted;
- }
-
- /**
- * Set the trust status of this identity.
- */
- protected void setTrusted(boolean trusted) {
- this.trusted = trusted;
- }
-
- void setIdentityInfo(String info) {
- super.setInfo(info);
- }
-
- String getIndentityInfo() {
- return super.getInfo();
- }
-
- /**
- * Call back method into a protected method for package friends.
- */
- void setIdentityPublicKey(PublicKey key) throws KeyManagementException {
- setPublicKey(key);
- }
-
- /**
- * Call back method into a protected method for package friends.
- */
- void addIdentityCertificate(Certificate cert)
- throws KeyManagementException {
- addCertificate(cert);
- }
-
- void clearCertificates() throws KeyManagementException {
- Certificate[] certs = certificates();
- for (int i = 0; i < certs.length; i++) {
- removeCertificate(certs[i]);
- }
- }
-
- public String toString() {
- String trustedString = "not trusted";
- if (trusted) {
- trustedString = "trusted";
- }
- return super.toString() + "[" + trustedString + "]";
- }
-
-
-}
--- a/jdk/src/share/classes/sun/security/provider/SystemSigner.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-/*
- * Copyright 1996-2000 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.security.provider;
-
-import java.util.*;
-import java.security.*;
-
-/**
- * SunSecurity signer. Like SystemIdentity, it has a trust bit, which
- * can be set by SunSecurity classes, and a set of accessors for other
- * classes in sun.security.*.
- *
- * @author Benjamin Renaud
- */
-
-public class SystemSigner extends Signer {
-
- /** use serialVersionUID from JDK 1.1. for interoperability */
- private static final long serialVersionUID = -2127743304301557711L;
-
- /* Is this signer trusted */
- private boolean trusted = false;
-
- /**
- * Construct a signer with a given name.
- */
- public SystemSigner(String name) {
- super(name);
- }
-
- /**
- * Construct a signer with a name and a scope.
- *
- * @param name the signer's name.
- *
- * @param scope the scope for this signer.
- */
- public SystemSigner(String name, IdentityScope scope)
- throws KeyManagementException {
-
- super(name, scope);
- }
-
- /* Set the trust status of this signer */
- void setTrusted(boolean trusted) {
- this.trusted = trusted;
- }
-
- /**
- * Returns true if this signer is trusted.
- */
- public boolean isTrusted() {
- return trusted;
- }
-
- /* friendly callback for set keys */
- void setSignerKeyPair(KeyPair pair)
- throws InvalidParameterException, KeyException {
- setKeyPair(pair);
- }
-
- /* friendly callback for getting private keys */
- PrivateKey getSignerPrivateKey() {
- return getPrivateKey();
- }
-
- void setSignerInfo(String s) {
- setInfo(s);
- }
-
- /**
- * Call back method into a protected method for package friends.
- */
- void addSignerCertificate(Certificate cert) throws KeyManagementException {
- addCertificate(cert);
- }
-
- void clearCertificates() throws KeyManagementException {
- Certificate[] certs = certificates();
- for (int i = 0; i < certs.length; i++) {
- removeCertificate(certs[i]);
- }
- }
-
- public String toString() {
- String trustedString = "not trusted";
- if (trusted) {
- trustedString = "trusted";
- }
- return super.toString() + "[" + trustedString + "]";
- }
-}
--- a/jdk/src/share/classes/sun/security/provider/certpath/OCSPChecker.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/provider/certpath/OCSPChecker.java Wed Dec 16 16:25:08 2009 -0800
@@ -335,10 +335,13 @@
response = OCSP.check(Collections.singletonList(certId), uri,
responderCert, pkixParams.getDate());
} catch (Exception e) {
- // Wrap all exceptions in CertPathValidatorException so that
- // we can fallback to CRLs, if enabled.
- throw new CertPathValidatorException
- ("Unable to send OCSP request", e);
+ if (e instanceof CertPathValidatorException) {
+ throw (CertPathValidatorException) e;
+ } else {
+ // Wrap exceptions in CertPathValidatorException so that
+ // we can fallback to CRLs, if enabled.
+ throw new CertPathValidatorException(e);
+ }
}
RevocationStatus rs = (RevocationStatus) response.getSingleResponse(certId);
--- a/jdk/src/share/classes/sun/security/tools/JarSigner.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/tools/JarSigner.java Wed Dec 16 16:25:08 2009 -0800
@@ -118,8 +118,6 @@
KeyStore store; // the keystore specified by -keystore
// or the default keystore, never null
- IdentityScope scope;
-
String keystore; // key store file
boolean nullStream = false; // null keystore input stream (NONE)
boolean token = false; // token-based keystore
@@ -212,7 +210,6 @@
if (verify) {
try {
loadKeyStore(keystore, false);
- scope = IdentityScope.getSystemScope();
} catch (Exception e) {
if ((keystore != null) || (storepass != null)) {
System.out.println(rb.getString("jarsigner error: ") +
@@ -984,13 +981,6 @@
result |= IN_KEYSTORE;
}
}
- if (!found && (scope != null)) {
- Identity id = scope.getIdentity(c.getPublicKey());
- if (id != null) {
- result |= IN_SCOPE;
- storeHash.put(c, "[" + id.getName() + "]");
- }
- }
if (ckaliases.contains(alias)) {
result |= SIGNED_BY_ALIAS;
}
--- a/jdk/src/share/classes/sun/security/tools/KeyTool.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/tools/KeyTool.java Wed Dec 16 16:25:08 2009 -0800
@@ -40,7 +40,6 @@
import java.security.UnrecoverableKeyException;
import java.security.Principal;
import java.security.Provider;
-import java.security.Identity;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
@@ -57,9 +56,6 @@
import sun.misc.BASE64Encoder;
import sun.security.util.ObjectIdentifier;
import sun.security.pkcs.PKCS10;
-import sun.security.provider.IdentityDatabase;
-import sun.security.provider.SystemSigner;
-import sun.security.provider.SystemIdentity;
import sun.security.provider.X509Factory;
import sun.security.util.DerOutputStream;
import sun.security.util.Password;
@@ -1163,18 +1159,16 @@
Signature signature = Signature.getInstance(sigAlgName);
signature.initSign(privateKey);
- X500Signer signer = new X500Signer(signature, issuer);
-
X509CertInfo info = new X509CertInfo();
info.set(X509CertInfo.VALIDITY, interval);
info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(
new java.util.Random().nextInt() & 0x7fffffff));
info.set(X509CertInfo.VERSION,
- new CertificateVersion(CertificateVersion.V3));
+ new CertificateVersion(CertificateVersion.V3));
info.set(X509CertInfo.ALGORITHM_ID,
- new CertificateAlgorithmId(signer.getAlgorithmId()));
- info.set(X509CertInfo.ISSUER,
- new CertificateIssuerName(signer.getSigner()));
+ new CertificateAlgorithmId(
+ AlgorithmId.getAlgorithmId(sigAlgName)));
+ info.set(X509CertInfo.ISSUER, new CertificateIssuerName(issuer));
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
boolean canRead = false;
@@ -1249,7 +1243,7 @@
request.getAttributes().setAttribute(X509CertInfo.EXTENSIONS,
new PKCS10Attribute(PKCS9Attribute.EXTENSION_REQUEST_OID, ext));
- // Construct an X500Signer object, so that we can sign the request
+ // Construct a Signature object, so that we can sign the request
if (sigAlgName == null) {
sigAlgName = getCompatibleSigAlgName(privKey.getAlgorithm());
}
@@ -1259,10 +1253,9 @@
X500Name subject = dname == null?
new X500Name(((X509Certificate)cert).getSubjectDN().toString()):
new X500Name(dname);
- X500Signer signer = new X500Signer(signature, subject);
// Sign the request and base-64 encode it
- request.encodeAndSign(signer);
+ request.encodeAndSign(subject, signature);
request.print(out);
}
@@ -1564,75 +1557,8 @@
private void doImportIdentityDatabase(InputStream in)
throws Exception
{
- byte[] encoded;
- ByteArrayInputStream bais;
- java.security.cert.X509Certificate newCert;
- java.security.cert.Certificate[] chain = null;
- PrivateKey privKey;
- boolean modified = false;
-
- IdentityDatabase idb = IdentityDatabase.fromStream(in);
- for (Enumeration<Identity> enum_ = idb.identities();
- enum_.hasMoreElements();) {
- Identity id = enum_.nextElement();
- newCert = null;
- // only store trusted identities in keystore
- if ((id instanceof SystemSigner && ((SystemSigner)id).isTrusted())
- || (id instanceof SystemIdentity
- && ((SystemIdentity)id).isTrusted())) {
- // ignore if keystore entry with same alias name already exists
- if (keyStore.containsAlias(id.getName())) {
- MessageFormat form = new MessageFormat
- (rb.getString("Keystore entry for <id.getName()> already exists"));
- Object[] source = {id.getName()};
- System.err.println(form.format(source));
- continue;
- }
- java.security.Certificate[] certs = id.certificates();
- if (certs!=null && certs.length>0) {
- // we can only store one user cert per identity.
- // convert old-style to new-style cert via the encoding
- DerOutputStream dos = new DerOutputStream();
- certs[0].encode(dos);
- encoded = dos.toByteArray();
- bais = new ByteArrayInputStream(encoded);
- newCert = (X509Certificate)cf.generateCertificate(bais);
- bais.close();
-
- // if certificate is self-signed, make sure it verifies
- if (isSelfSigned(newCert)) {
- PublicKey pubKey = newCert.getPublicKey();
- try {
- newCert.verify(pubKey);
- } catch (Exception e) {
- // ignore this cert
- continue;
- }
- }
-
- if (id instanceof SystemSigner) {
- MessageFormat form = new MessageFormat(rb.getString
- ("Creating keystore entry for <id.getName()> ..."));
- Object[] source = {id.getName()};
- System.err.println(form.format(source));
- if (chain==null) {
- chain = new java.security.cert.Certificate[1];
- }
- chain[0] = newCert;
- privKey = ((SystemSigner)id).getPrivateKey();
- keyStore.setKeyEntry(id.getName(), privKey, storePass,
- chain);
- } else {
- keyStore.setCertificateEntry(id.getName(), newCert);
- }
- kssave = true;
- }
- }
- }
- if (!kssave) {
- System.err.println(rb.getString
- ("No entries from identity database added"));
- }
+ System.err.println(rb.getString
+ ("No entries from identity database added"));
}
/**
--- a/jdk/src/share/classes/sun/security/util/SecurityConstants.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/util/SecurityConstants.java Wed Dec 16 16:25:08 2009 -0800
@@ -33,7 +33,6 @@
import java.security.BasicPermission;
import java.security.SecurityPermission;
import java.security.AllPermission;
-import javax.security.auth.AuthPermission;
/**
* Permission constants and string constants used to create permissions
@@ -259,12 +258,4 @@
// java.lang.SecurityManager
public static final SocketPermission LOCAL_LISTEN_PERMISSION =
new SocketPermission("localhost:1024-", SOCKET_LISTEN_ACTION);
-
- // javax.security.auth.Subject
- public static final AuthPermission DO_AS_PERMISSION =
- new AuthPermission("doAs");
-
- // javax.security.auth.Subject
- public static final AuthPermission DO_AS_PRIVILEGED_PERMISSION =
- new AuthPermission("doAsPrivileged");
}
--- a/jdk/src/share/classes/sun/security/validator/PKIXValidator.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/validator/PKIXValidator.java Wed Dec 16 16:25:08 2009 -0800
@@ -150,9 +150,17 @@
("null or zero-length certificate chain");
}
if (TRY_VALIDATOR) {
- // check if chain contains trust anchor
+ // check that chain is in correct order and check if chain contains
+ // trust anchor
+ X500Principal prevIssuer = null;
for (int i = 0; i < chain.length; i++) {
- if (trustedCerts.contains(chain[i])) {
+ X509Certificate cert = chain[i];
+ if (i != 0 &&
+ !cert.getSubjectX500Principal().equals(prevIssuer)) {
+ // chain is not ordered correctly, call builder instead
+ return doBuild(chain, otherCerts);
+ }
+ if (trustedCerts.contains(cert)) {
if (i == 0) {
return new X509Certificate[] {chain[0]};
}
@@ -161,6 +169,7 @@
System.arraycopy(chain, 0, newChain, 0, i);
return doValidate(newChain);
}
+ prevIssuer = cert.getIssuerX500Principal();
}
// apparently issued by trust anchor?
@@ -303,5 +312,4 @@
("PKIX path building failed: " + e.toString(), e);
}
}
-
}
--- a/jdk/src/share/classes/sun/security/x509/CertAndKeyGen.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/security/x509/CertAndKeyGen.java Wed Dec 16 16:25:08 2009 -0800
@@ -190,41 +190,6 @@
/**
- * Returns a self-signed X.509v1 certificate for the public key.
- * The certificate is immediately valid.
- *
- * <P>Such certificates normally are used to identify a "Certificate
- * Authority" (CA). Accordingly, they will not always be accepted by
- * other parties. However, such certificates are also useful when
- * you are bootstrapping your security infrastructure, or deploying
- * system prototypes.
- *
- * @deprecated Use the new <a href =
- * "#getSelfCertificate(sun.security.x509.X500Name, long)">
- *
- * @param myname X.500 name of the subject (who is also the issuer)
- * @param validity how long the certificate should be valid, in seconds
- */
- @Deprecated
- public X509Cert getSelfCert (X500Name myname, long validity)
- throws InvalidKeyException, SignatureException, NoSuchAlgorithmException
- {
- X509Certificate cert;
-
- try {
- cert = getSelfCertificate(myname, validity);
- return new X509Cert(cert.getEncoded());
- } catch (CertificateException e) {
- throw new SignatureException(e.getMessage());
- } catch (NoSuchProviderException e) {
- throw new NoSuchAlgorithmException(e.getMessage());
- } catch (IOException e) {
- throw new SignatureException(e.getMessage());
- }
- }
-
-
- /**
* Returns a self-signed X.509v3 certificate for the public key.
* The certificate is immediately valid. No extensions.
*
@@ -248,13 +213,10 @@
throws CertificateException, InvalidKeyException, SignatureException,
NoSuchAlgorithmException, NoSuchProviderException
{
- X500Signer issuer;
X509CertImpl cert;
Date lastDate;
try {
- issuer = getSigner (myname);
-
lastDate = new Date ();
lastDate.setTime (firstDate.getTime () + validity * 1000);
@@ -267,14 +229,13 @@
new CertificateVersion(CertificateVersion.V3));
info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(
new java.util.Random().nextInt() & 0x7fffffff));
- AlgorithmId algID = issuer.getAlgorithmId();
+ AlgorithmId algID = AlgorithmId.getAlgorithmId(sigAlg);
info.set(X509CertInfo.ALGORITHM_ID,
new CertificateAlgorithmId(algID));
info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(myname));
info.set(X509CertInfo.KEY, new CertificateX509Key(publicKey));
info.set(X509CertInfo.VALIDITY, interval);
- info.set(X509CertInfo.ISSUER,
- new CertificateIssuerName(issuer.getSigner()));
+ info.set(X509CertInfo.ISSUER, new CertificateIssuerName(myname));
cert = new X509CertImpl(info);
cert.sign(privateKey, this.sigAlg);
@@ -315,7 +276,9 @@
PKCS10 req = new PKCS10 (publicKey);
try {
- req.encodeAndSign (getSigner (myname));
+ Signature signature = Signature.getInstance(sigAlg);
+ signature.initSign (privateKey);
+ req.encodeAndSign(myname, signature);
} catch (CertificateException e) {
throw new SignatureException (sigAlg + " CertificateException");
@@ -330,18 +293,6 @@
return req;
}
- private X500Signer getSigner (X500Name me)
- throws InvalidKeyException, NoSuchAlgorithmException
- {
- Signature signature = Signature.getInstance(sigAlg);
-
- // XXX should have a way to pass prng to the signature
- // algorithm ... appropriate for DSS/DSA, not RSA
-
- signature.initSign (privateKey);
- return new X500Signer (signature, me);
- }
-
private SecureRandom prng;
private String sigAlg;
private KeyPairGenerator keyGen;
--- a/jdk/src/share/classes/sun/security/x509/X500Signer.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-/*
- * Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.security.x509;
-
-import java.security.Signature;
-import java.security.SignatureException;
-import java.security.Signer;
-import java.security.NoSuchAlgorithmException;
-
-/**
- * This class provides a binding between a Signature object and an
- * authenticated X.500 name (from an X.509 certificate chain), which
- * is needed in many public key signing applications.
- *
- * <P>The name of the signer is important, both because knowing it is the
- * whole point of the signature, and because the associated X.509 certificate
- * is always used to verify the signature.
- *
- * <P><em>The X.509 certificate chain is temporarily not associated with
- * the signer, but this omission will be resolved.</em>
- *
- *
- * @author David Brownell
- * @author Amit Kapoor
- * @author Hemma Prafullchandra
- */
-public final class X500Signer extends Signer
-{
- private static final long serialVersionUID = -8609982645394364834L;
-
- /**
- * Called for each chunk of the data being signed. That
- * is, you can present the data in many chunks, so that
- * it doesn't need to be in a single sequential buffer.
- *
- * @param buf buffer holding the next chunk of the data to be signed
- * @param offset starting point of to-be-signed data
- * @param len how many bytes of data are to be signed
- * @exception SignatureException on errors.
- */
- public void update(byte buf[], int offset, int len)
- throws SignatureException {
- sig.update (buf, offset, len);
- }
-
- /**
- * Produces the signature for the data processed by update().
- *
- * @exception SignatureException on errors.
- */
- public byte[] sign() throws SignatureException {
- return sig.sign();
- }
-
- /**
- * Returns the algorithm used to sign.
- */
- public AlgorithmId getAlgorithmId() {
- return algid;
- }
-
- /**
- * Returns the name of the signing agent.
- */
- public X500Name getSigner() {
- return agent;
- }
-
- /*
- * Constructs a binding between a signature and an X500 name
- * from an X.509 certificate.
- */
- // package private ----hmmmmm ?????
- public X500Signer(Signature sig, X500Name agent) {
- if (sig == null || agent == null)
- throw new IllegalArgumentException ("null parameter");
-
- this.sig = sig;
- this.agent = agent;
-
- try {
- this.algid = AlgorithmId.getAlgorithmId(sig.getAlgorithm());
-
- } catch (NoSuchAlgorithmException e) {
- throw new RuntimeException("internal error! " + e.getMessage());
- }
- }
-
- private Signature sig;
- private X500Name agent; // XXX should be X509CertChain
- private AlgorithmId algid;
-}
--- a/jdk/src/share/classes/sun/security/x509/X509Cert.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,892 +0,0 @@
-/*
- * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.security.x509;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.math.BigInteger;
-import java.security.*;
-import java.util.Date;
-import java.util.Enumeration;
-
-import sun.security.util.*; // DER
-
-/**
- * @author David Brownell
- *
- * @see CertAndKeyGen
- * @deprecated Use the new X509Certificate class.
- * This class is only restored for backwards compatibility.
- */
-@Deprecated
-public class X509Cert implements Certificate, Serializable {
-
- static final long serialVersionUID = -52595524744692374L;
-
- /*
- * NOTE: All fields are marked transient, because we do not want them to
- * be included in the class description when we serialize an object of
- * this class. We override "writeObject" and "readObject" to use the
- * ASN.1 encoding of a certificate as the serialized form, instead of
- * calling the default routines which would operate on the field values.
- *
- * MAKE SURE TO MARK ANY FIELDS THAT ARE ADDED IN THE FUTURE AS TRANSIENT.
- */
-
- /* The algorithm id */
- transient protected AlgorithmId algid;
-
- /*
- * Certificate data, and its envelope
- */
- transient private byte rawCert [];
- transient private byte signature [];
- transient private byte signedCert [];
-
- /*
- * X509.v1 data (parsed)
- */
- transient private X500Name subject; // from subject
- transient private PublicKey pubkey;
-
- transient private Date notafter; // from CA (constructor)
- transient private Date notbefore;
-
- transient private int version; // from CA (signAndEncode)
- transient private BigInteger serialnum;
- transient private X500Name issuer;
- transient private AlgorithmId issuerSigAlg;
-
- /*
- * flag to indicate whether or not this certificate has already been parsed
- * (through a call to one of the constructors or the "decode" or
- * "readObject" methods). This is to ensure that certificates are
- * immutable.
- */
- transient private boolean parsed=false;
-
- /*
- * X509.v2 extensions
- */
-
- /*
- * X509.v3 extensions
- */
-
- /*
- * Other extensions ... Netscape, Verisign, SET, etc
- */
-
-
- /**
- * Construct a uninitialized X509 Cert on which <a href="#decode">
- * decode</a> must later be called (or which may be deserialized).
- */
- // XXX deprecated, delete this
- public X509Cert() { }
-
-
- /**
- * Unmarshals a certificate from its encoded form, parsing the
- * encoded bytes. This form of constructor is used by agents which
- * need to examine and use certificate contents. That is, this is
- * one of the more commonly used constructors. Note that the buffer
- * must include only a certificate, and no "garbage" may be left at
- * the end. If you need to ignore data at the end of a certificate,
- * use another constructor.
- *
- * @param cert the encoded bytes, with no terminatu (CONSUMED)
- * @exception IOException when the certificate is improperly encoded.
- */
- public X509Cert(byte cert []) throws IOException
- {
- DerValue in = new DerValue (cert);
- parse (in);
- if (in.data.available () != 0)
- throw new CertParseError ("garbage at end");
- signedCert = cert;
- }
-
-
- /**
- * Unmarshals a certificate from its encoded form, parsing the
- * encoded bytes. This form of constructor is used by agents which
- * need to examine and use certificate contents. That is, this is
- * one of the most commonly used constructors.
- *
- * @param buf the buffer holding the encoded bytes
- * @param offset the offset in the buffer where the bytes begin
- * @param len how many bytes of certificate exist
- *
- * @exception IOException when the certificate is improperly encoded.
- */
- public X509Cert(byte buf [], int offset, int len) throws IOException
- {
- DerValue in = new DerValue (buf, offset, len);
-
- parse (in);
- if (in.data.available () != 0)
- throw new CertParseError ("garbage at end");
- signedCert = new byte [len];
- System.arraycopy (buf, offset, signedCert, 0, len);
- }
-
-
- /**
- * Unmarshal a certificate from its encoded form, parsing a DER value.
- * This form of constructor is used by agents which need to examine
- * and use certificate contents.
- *
- * @param derVal the der value containing the encoded cert.
- * @exception IOException when the certificate is improperly encoded.
- */
- public X509Cert(DerValue derVal) throws IOException
- {
- parse (derVal);
- if (derVal.data.available () != 0)
- throw new CertParseError ("garbage at end");
- signedCert = derVal.toByteArray ();
- }
-
-
- /**
- * Partially constructs a certificate from descriptive parameters.
- * This constructor may be used by Certificate Authority (CA) code,
- * which later <a href="#signAndEncode">signs and encodes</a> the
- * certificate. Also, self-signed certificates serve as CA certificates,
- * and are sometimes used as certificate requests.
- *
- * <P>Until the certificate has been signed and encoded, some of
- * the mandatory fields in the certificate will not be available
- * via accessor functions: the serial number, issuer name and signing
- * algorithm, and of course the signed certificate. The fields passed
- * to this constructor are available, and must be non-null.
- *
- * <P>Note that the public key being signed is generally independent of
- * the signature algorithm being used. So for example Diffie-Hellman
- * keys (which do not support signatures) can be placed in X.509
- * certificates when some other signature algorithm (e.g. DSS/DSA,
- * or one of the RSA based algorithms) is used.
- *
- * @see CertAndKeyGen
- *
- * @param subjectName the X.500 distinguished name being certified
- * @param subjectPublicKey the public key being certified. This
- * must be an "X509Key" implementing the "PublicKey" interface.
- * @param notBefore the first time the certificate is valid
- * @param notAfter the last time the certificate is valid
- *
- * @exception CertException if the public key is inappropriate
- */
- public X509Cert(X500Name subjectName, X509Key subjectPublicKey,
- Date notBefore, Date notAfter) throws CertException
- {
- subject = subjectName;
-
- if (!(subjectPublicKey instanceof PublicKey))
- throw new CertException (CertException.err_INVALID_PUBLIC_KEY,
- "Doesn't implement PublicKey interface");
-
- // The X509 cert API requires X509 keys, else things break.
- pubkey = subjectPublicKey;
- notbefore = notBefore;
- notafter = notAfter;
- version = 0;
- }
-
-
- /**
- * Decode an X.509 certificate from an input stream.
- *
- * @param in an input stream holding at least one certificate
- * @exception IOException when the certificate is improperly encoded, or
- * if it has already been parsed.
- */
- public void decode(InputStream in) throws IOException
- {
- DerValue val = new DerValue(in);
- parse(val);
- signedCert = val.toByteArray();
- }
-
-
- /**
- * Appends the certificate to an output stream.
- *
- * @param out an input stream to which the certificate is appended.
- * @exception IOException when appending fails.
- */
- public void encode (OutputStream out) throws IOException
- { out.write (getSignedCert ()); }
-
-
- /**
- * Compares two certificates. This is false if the
- * certificates are not both X.509 certs, otherwise it
- * compares them as binary data.
- *
- * @param other the object being compared with this one
- * @return true iff the certificates are equivalent
- */
- public boolean equals (Object other)
- {
- if (other instanceof X509Cert)
- return equals ((X509Cert) other);
- else
- return false;
- }
-
-
- /**
- * Compares two certificates, returning false if any data
- * differs between the two.
- *
- * @param other the object being compared with this one
- * @return true iff the certificates are equivalent
- */
- public boolean equals (X509Cert src)
- {
- if (this == src)
- return true;
- if (signedCert == null || src.signedCert == null)
- return false;
- if (signedCert.length != src.signedCert.length)
- return false;
- for (int i = 0; i < signedCert.length; i++)
- if (signedCert [i] != src.signedCert [i])
- return false;
- return true;
- }
-
-
- /** Returns the "X.509" format identifier. */
- public String getFormat () // for Certificate
- { return "X.509"; }
-
-
- /** Returns <a href="#getIssuerName">getIssuerName</a> */
- public Principal getGuarantor () // for Certificate
- { return getIssuerName (); }
-
-
- /** Returns <a href="#getSubjectName">getSubjectName</a> */
- public Principal getPrincipal ()
- { return getSubjectName (); }
-
-
- /**
- * Throws an exception if the certificate is invalid because it is
- * now outside of the certificate's validity period, or because it
- * was not signed using the verification key provided. Successfully
- * verifying a certificate does <em>not</em> indicate that one should
- * trust the entity which it represents.
- *
- * <P><em>Note that since this class represents only a single X.509
- * certificate, it cannot know anything about the certificate chain
- * which is used to provide the verification key and to establish trust.
- * Other code must manage and use those cert chains.
- *
- * <P>For now, you must walk the cert chain being used to verify any
- * given cert. Start at the root, which is a self-signed certificate;
- * verify it using the key inside the certificate. Then use that to
- * verify the next certificate in the chain, issued by that CA. In
- * this manner, verify each certificate until you reach the particular
- * certificate you wish to verify. You should not use a certificate
- * if any of the verification operations for its certificate chain
- * were unsuccessful.
- * </em>
- *
- * @param issuerPublicKey the public key of the issuing CA
- * @exception CertException when the certificate is not valid.
- */
- public void verify (PublicKey issuerPublicKey)
- throws CertException
- {
- Date now = new Date ();
-
- if (now.before (notbefore))
- throw new CertException (CertException.verf_INVALID_NOTBEFORE);
- if (now.after (notafter))
- throw new CertException (CertException.verf_INVALID_EXPIRED);
- if (signedCert == null)
- throw new CertException (CertException.verf_INVALID_SIG,
- "?? certificate is not signed yet ??");
-
- //
- // Verify the signature ...
- //
- String algName = null;
-
- try {
- Signature sigVerf = null;
-
- algName = issuerSigAlg.getName();
- sigVerf = Signature.getInstance(algName);
- sigVerf.initVerify (issuerPublicKey);
- sigVerf.update (rawCert, 0, rawCert.length);
-
- if (!sigVerf.verify (signature)) {
- throw new CertException (CertException.verf_INVALID_SIG,
- "Signature ... by <" + issuer + "> for <" + subject + ">");
- }
-
- // Gag -- too many catch clauses, let most through.
-
- } catch (NoSuchAlgorithmException e) {
- throw new CertException (CertException.verf_INVALID_SIG,
- "Unsupported signature algorithm (" + algName + ")");
-
- } catch (InvalidKeyException e) {
- // e.printStackTrace();
- throw new CertException (CertException.err_INVALID_PUBLIC_KEY,
- "Algorithm (" + algName + ") rejected public key");
-
- } catch (SignatureException e) {
- throw new CertException (CertException.verf_INVALID_SIG,
- "Signature by <" + issuer + "> for <" + subject + ">");
- }
- }
-
-
- /**
- * Creates an X.509 certificate, and signs it using the issuer
- * passed (associating a signature algorithm and an X.500 name).
- * This operation is used to implement the certificate generation
- * functionality of a certificate authority.
- *
- * @see #getSignedCert
- * @see #getSigner
- * @see CertAndKeyGen
- *
- * @param serial the serial number of the certificate (non-null)
- * @param issuer the certificate issuer (CA) (non-null)
- * @return the signed certificate, as returned by getSignedCert
- *
- * @exception IOException if any of the data could not be encoded,
- * or when any mandatory data was omitted
- * @exception SignatureException on signing failures
- */
- public byte []
- encodeAndSign (
- BigInteger serial,
- X500Signer issuer
- ) throws IOException, SignatureException
- {
- rawCert = null;
-
- /*
- * Get the remaining cert parameters, and make sure we have enough.
- *
- * We deduce version based on what attribute data are available
- * For now, we have no attributes, so we always deduce X.509v1 !
- */
- version = 0;
- serialnum = serial;
- this.issuer = issuer.getSigner ();
- issuerSigAlg = issuer.getAlgorithmId ();
-
- if (subject == null || pubkey == null
- || notbefore == null || notafter == null)
- throw new IOException ("not enough cert parameters");
-
- /*
- * Encode the raw cert, create its signature and put it
- * into the envelope.
- */
- rawCert = DERencode ();
- signedCert = sign (issuer, rawCert);
- return signedCert;
- }
-
-
- /**
- * Returns an X500Signer that may be used to create signatures. Those
- * signature may in turn be verified using this certificate (or a
- * copy of it).
- *
- * <P><em><b>NOTE:</b> If the private key is by itself capable of
- * creating signatures, this fact may not be recognized at this time.
- * Specifically, the case of DSS/DSA keys which get their algorithm
- * parameters from higher in the certificate chain is not supportable
- * without using an X509CertChain API, and there is no current support
- * for other sources of algorithm parameters.</em>
- *
- * @param algorithm the signature algorithm to be used. Note that a
- * given public/private key pair may support several such algorithms.
- * @param privateKey the private key used to create the signature,
- * which must correspond to the public key in this certificate
- * @return the Signer object
- *
- * @exception NoSuchAlgorithmException if the signature
- * algorithm is not supported
- * @exception InvalidKeyException if either the key in the certificate,
- * or the private key parameter, does not support the requested
- * signature algorithm
- */
- public X500Signer getSigner (AlgorithmId algorithmId,
- PrivateKey privateKey)
- throws NoSuchAlgorithmException, InvalidKeyException
- {
- String algorithm;
- Signature sig;
-
- if (privateKey instanceof Key) {
- Key key = (Key)privateKey;
- algorithm = key.getAlgorithm();
- } else {
- throw new InvalidKeyException("private key not a key!");
- }
-
- sig = Signature.getInstance(algorithmId.getName());
-
- if (!pubkey.getAlgorithm ().equals (algorithm)) {
-
- throw new InvalidKeyException( "Private key algorithm " +
- algorithm +
- " incompatible with certificate " +
- pubkey.getAlgorithm());
- }
- sig.initSign (privateKey);
- return new X500Signer (sig, subject);
- }
-
-
- /**
- * Returns a signature object that may be used to verify signatures
- * created using a specified signature algorithm and the public key
- * contained in this certificate.
- *
- * <P><em><b>NOTE:</b> If the public key in this certificate is not by
- * itself capable of verifying signatures, this may not be recognized
- * at this time. Specifically, the case of DSS/DSA keys which get
- * their algorithm parameters from higher in the certificate chain
- * is not supportable without using an X509CertChain API, and there
- * is no current support for other sources of algorithm parameters.</em>
- *
- * @param algorithm the algorithm of the signature to be verified
- * @return the Signature object
- * @exception NoSuchAlgorithmException if the signature
- * algorithm is not supported
- * @exception InvalidKeyException if the key in the certificate
- * does not support the requested signature algorithm
- */
- public Signature getVerifier(String algorithm)
- throws NoSuchAlgorithmException, InvalidKeyException
- {
- String algName;
- Signature sig;
-
- sig = Signature.getInstance(algorithm);
- sig.initVerify (pubkey);
- return sig;
- }
-
-
-
- /**
- * Return the signed X.509 certificate as a byte array.
- * The bytes are in standard DER marshaled form.
- * Null is returned in the case of a partially constructed cert.
- */
- public byte [] getSignedCert ()
- { return signedCert.clone(); }
-
-
- /**
- * Returns the certificate's serial number.
- * Null is returned in the case of a partially constructed cert.
- */
- public BigInteger getSerialNumber ()
- { return serialnum; }
-
-
- /**
- * Returns the subject's X.500 distinguished name.
- */
- public X500Name getSubjectName ()
- { return subject; }
-
-
- /**
- * Returns the certificate issuer's X.500 distinguished name.
- * Null is returned in the case of a partially constructed cert.
- */
- public X500Name getIssuerName ()
- { return issuer; }
-
-
- /**
- * Returns the algorithm used by the issuer to sign the certificate.
- * Null is returned in the case of a partially constructed cert.
- */
- public AlgorithmId getIssuerAlgorithmId ()
- { return issuerSigAlg; }
-
-
- /**
- * Returns the first time the certificate is valid.
- */
- public Date getNotBefore ()
- { return new Date(notbefore.getTime()); }
-
-
- /**
- * Returns the last time the certificate is valid.
- */
- public Date getNotAfter ()
- { return new Date(notafter.getTime()); }
-
-
- /**
- * Returns the subject's public key. Note that some public key
- * algorithms support an optional certificate generation policy
- * where the keys in the certificates are not in themselves sufficient
- * to perform a public key operation. Those keys need to be augmented
- * by algorithm parameters, which the certificate generation policy
- * chose not to place in the certificate.
- *
- * <P>Two such public key algorithms are: DSS/DSA, where algorithm
- * parameters could be acquired from a CA certificate in the chain
- * of issuers; and Diffie-Hellman, with a similar solution although
- * the CA then needs both a Diffie-Hellman certificate and a signature
- * capable certificate.
- */
- public PublicKey getPublicKey ()
- { return pubkey; }
-
-
- /**
- * Returns the X.509 version number of this certificate, zero based.
- * That is, "2" indicates an X.509 version 3 (1993) certificate,
- * and "0" indicates X.509v1 (1988).
- * Zero is returned in the case of a partially constructed cert.
- */
- public int getVersion ()
- { return version; }
-
-
- /**
- * Calculates a hash code value for the object. Objects
- * which are equal will also have the same hashcode.
- */
- public int hashCode ()
- {
- int retval = 0;
-
- for (int i = 0; i < signedCert.length; i++)
- retval += signedCert [i] * i;
- return retval;
- }
-
-
- /**
- * Returns a printable representation of the certificate. This does not
- * contain all the information available to distinguish this from any
- * other certificate. The certificate must be fully constructed
- * before this function may be called; in particular, if you are
- * creating certificates you must call encodeAndSign() before calling
- * this function.
- */
- public String toString ()
- {
- String s;
-
- if (subject == null || pubkey == null
- || notbefore == null || notafter == null
- || issuer == null || issuerSigAlg == null
- || serialnum == null)
- throw new NullPointerException ("X.509 cert is incomplete");
-
- s = " X.509v" + (version + 1) + " certificate,\n";
- s += " Subject is " + subject + "\n";
- s += " Key: " + pubkey;
- s += " Validity <" + notbefore + "> until <" + notafter + ">\n";
- s += " Issuer is " + issuer + "\n";
- s += " Issuer signature used " + issuerSigAlg.toString () + "\n";
- s += " Serial number = " + Debug.toHexString(serialnum) + "\n";
-
- // optional v2, v3 extras
-
- return "[\n" + s + "]";
- }
-
-
- /**
- * Returns a printable representation of the certificate.
- *
- * @param detailed true iff lots of detail is requested
- */
- public String toString (boolean detailed)
- { return toString (); }
-
-
- /************************************************************/
-
- /*
- * Cert is a SIGNED ASN.1 macro, a three elment sequence:
- *
- * - Data to be signed (ToBeSigned) -- the "raw" cert
- * - Signature algorithm (SigAlgId)
- * - The signature bits
- *
- * This routine unmarshals the certificate, saving the signature
- * parts away for later verification.
- */
- private void parse (DerValue val) throws IOException
- {
- if (parsed == true) {
- throw new IOException("Certificate already parsed");
- }
-
- DerValue seq [] = new DerValue [3];
-
- seq [0] = val.data.getDerValue ();
- seq [1] = val.data.getDerValue ();
- seq [2] = val.data.getDerValue ();
-
- if (val.data.available () != 0)
- throw new CertParseError ("signed overrun, bytes = "
- + val.data.available ());
- if (seq [0].tag != DerValue.tag_Sequence)
- throw new CertParseError ("signed fields invalid");
-
- rawCert = seq [0].toByteArray (); // XXX slow; fixme!
-
-
- issuerSigAlg = AlgorithmId.parse (seq [1]);
- signature = seq [2].getBitString ();
-
- if (seq [1].data.available () != 0) {
- // XXX why was this error check commented out?
- // It was originally part of the next check.
- throw new CertParseError ("algid field overrun");
- }
-
- if (seq [2].data.available () != 0)
- throw new CertParseError ("signed fields overrun");
-
- /*
- * Let's have fun parsing the cert itself.
- */
- DerInputStream in;
- DerValue tmp;
-
- in = seq [0].data;
-
- /*
- * Version -- this is optional (default zero). If it's there it's
- * the first field and is specially tagged.
- *
- * Both branches leave "tmp" holding a value for the serial
- * number that comes next.
- */
- version = 0;
- tmp = in.getDerValue ();
- if (tmp.isConstructed () && tmp.isContextSpecific ()) {
- version = tmp.data.getInteger();
- if (tmp.data.available () != 0)
- throw new IOException ("X.509 version, bad format");
- tmp = in.getDerValue ();
- }
-
- /*
- * serial number ... an integer
- */
- serialnum = tmp.getBigInteger ();
-
- /*
- * algorithm type for CA's signature ... needs to match the
- * one on the envelope, and that's about it! different IDs
- * may represent a signature attack. In general we want to
- * inherit parameters.
- */
- tmp = in.getDerValue ();
- {
- AlgorithmId algid;
-
-
- algid = AlgorithmId.parse(tmp);
-
- if (!algid.equals (issuerSigAlg))
- throw new CertParseError ("CA Algorithm mismatch!");
-
- this.algid = algid;
- }
-
- /*
- * issuer name
- */
- issuer = new X500Name (in);
-
- /*
- * validity: SEQUENCE { start date, end date }
- */
- tmp = in.getDerValue ();
- if (tmp.tag != DerValue.tag_Sequence)
- throw new CertParseError ("corrupt validity field");
-
- notbefore = tmp.data.getUTCTime ();
- notafter = tmp.data.getUTCTime ();
- if (tmp.data.available () != 0)
- throw new CertParseError ("excess validity data");
-
- /*
- * subject name and public key
- */
- subject = new X500Name (in);
-
- tmp = in.getDerValue ();
- pubkey = X509Key.parse (tmp);
-
- /*
- * XXX for v2 and later, a bunch of tagged options follow
- */
-
- if (in.available () != 0) {
- /*
- * Until we parse V2/V3 data ... ignore it.
- *
- // throw new CertParseError ("excess cert data");
- System.out.println (
- "@end'o'cert, optional V2/V3 data unparsed: "
- + in.available ()
- + " bytes"
- );
- */
- }
-
- parsed = true;
- }
-
-
- /*
- * Encode only the parts that will later be signed.
- */
- private byte [] DERencode () throws IOException
- {
- DerOutputStream raw = new DerOutputStream ();
-
- encode (raw);
- return raw.toByteArray ();
- }
-
-
- /*
- * Marshal the contents of a "raw" certificate into a DER sequence.
- */
- private void encode (DerOutputStream out) throws IOException
- {
- DerOutputStream tmp = new DerOutputStream ();
-
- /*
- * encode serial number, issuer signing algorithm,
- * and issuer name into the data we'll return
- */
- tmp.putInteger (serialnum);
- issuerSigAlg.encode (tmp);
- issuer.encode (tmp);
-
- /*
- * Validity is a two element sequence ... encode the
- * elements, then wrap them into the data we'll return
- */
- {
- DerOutputStream seq = new DerOutputStream ();
-
- seq.putUTCTime (notbefore);
- seq.putUTCTime (notafter);
- tmp.write (DerValue.tag_Sequence, seq);
- }
-
- /*
- * Encode subject (principal) and associated key
- */
- subject.encode (tmp);
- tmp.write(pubkey.getEncoded());
-
- /*
- * Wrap the data; encoding of the "raw" cert is now complete.
- */
- out.write (DerValue.tag_Sequence, tmp);
- }
-
-
- /*
- * Calculate the signature of the "raw" certificate,
- * and marshal the cert with the signature and a
- * description of the signing algorithm.
- */
- private byte [] sign (X500Signer issuer, byte data [])
- throws IOException, SignatureException
- {
- /*
- * Encode the to-be-signed data, then the algorithm used
- * to create the signature.
- */
- DerOutputStream out = new DerOutputStream ();
- DerOutputStream tmp = new DerOutputStream ();
-
- tmp.write (data);
- issuer.getAlgorithmId ().encode(tmp);
-
-
- /*
- * Create and encode the signature itself.
- */
- issuer.update (data, 0, data.length);
- signature = issuer.sign ();
- tmp.putBitString (signature);
-
- /*
- * Wrap the signed data in a SEQUENCE { data, algorithm, sig }
- */
- out.write (DerValue.tag_Sequence, tmp);
- return out.toByteArray ();
- }
-
-
- /**
- * Serialization write ... X.509 certificates serialize as
- * themselves, and they're parsed when they get read back.
- * (Actually they serialize as some type data from the
- * serialization subsystem, then the cert data.)
- */
- private void writeObject (java.io.ObjectOutputStream stream)
- throws IOException
- { encode(stream); }
-
- /**
- * Serialization read ... X.509 certificates serialize as
- * themselves, and they're parsed when they get read back.
- */
- private void readObject (ObjectInputStream stream)
- throws IOException
- { decode(stream); }
-}
--- a/jdk/src/share/classes/sun/tools/jar/JarVerifierStream.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,295 +0,0 @@
-/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.tools.jar;
-
-import java.io.*;
-import java.util.*;
-import java.util.zip.*;
-import java.util.jar.*;
-import java.security.cert.Certificate;
-import java.security.AccessController;
-import java.security.cert.X509Certificate;
-import java.security.PublicKey;
-import java.security.Principal;
-import sun.security.provider.SystemIdentity;
-
-/**
- * This is OBSOLETE. DO NOT USE THIS. Use
- * java.util.jar.JarEntry.getCertificates instead. It has to stay here
- * because some apps (namely HJ and HJV) call directly into it.
- *
- * This class is stripped down greatly from JDK 1.1.x.
- *
- * @author Roland Schemers
- */
-public class JarVerifierStream extends ZipInputStream {
-
- private JarEntry current;
- private Hashtable<String, Vector<SystemIdentity>> verified
- = new Hashtable<String, Vector<SystemIdentity>>();
- private JarInputStream jis;
- private sun.tools.jar.Manifest man = null;
-
- /**
- * construct a JarVerfierStream from an input stream.
- */
- public JarVerifierStream(InputStream is)
- throws IOException
- {
- super(is);
- jis = new JarInputStream(is);
- }
-
- public void close()
- throws IOException
- {
- jis.close();
- }
-
- public void closeEntry() throws IOException {
- jis.closeEntry();
- }
-
- /**
- * This method scans to see which entry we're parsing and
- * keeps various state information depending on what type of
- * file is being parsed. Files it treats specially are: <ul>
- *
- * <li>Manifest files. At any point, this stream can be queried
- * for a manifest. If it is present, a Manifest object will be
- * returned.
- *
- * <li>Block Signature file. Like with the manifest, the stream
- * can be queried at any time for all blocks parsed thus far.
- *
- * </ul>
- */
- public synchronized ZipEntry getNextEntry() throws IOException {
- current = (JarEntry) jis.getNextEntry();
- return current;
- }
-
- /**
- * read a single byte.
- */
- public int read() throws IOException {
- int n = jis.read();
- if (n == -1) {
- addIds();
- }
- return n;
- }
-
- /**
- * read an array of bytes.
- */
- public int read(byte[] b, int off, int len) throws IOException {
- int n = jis.read(b, off, len);
- if (n == -1) {
- addIds();
- }
- return n;
- }
-
- private void addIds()
- {
-
- if (current != null) {
- Certificate[] certs = current.getCertificates();
- if (certs != null) {
- Vector<SystemIdentity> ids = getIds(certs);
- if (ids != null) {
- verified.put(current.getName(), ids);
- }
- }
- }
- }
-
- /**
- * Returns a Hashtable mapping filenames to vectors of identities.
- */
- public Hashtable getVerifiedSignatures() {
- /* we may want to return a copy of this at some point.
- For now we simply trust the caller */
- if (verified.isEmpty())
- return null;
- else
- return verified;
- }
-
- /**
- * Returns an enumeration of PKCS7 blocks. This looks bogus,
- * but Hotjava just checks to see if enumeration is not null
- * to see if anything was signed!
- */
- public Enumeration getBlocks() {
- if (verified.isEmpty()) {
- return null;
- } else {
- return new Enumeration() {
- public boolean hasMoreElements() { return false; }
- public Object nextElement() { return null; }
- };
- }
- }
-
- /**
- * This method used to be called by various versions of
- * AppletResourceLoader, even though they didn't do anything with
- * the result. We leave them and return null for backwards compatability.
- */
- public Hashtable getNameToHash() {
- return null;
- }
-
- /**
- * Convert java.util.jar.Manifest object to a sun.tools.jar.Manifest
- * object.
- */
-
- public sun.tools.jar.Manifest getManifest() {
- if (man == null) {
- try {
- java.util.jar.Manifest jman = jis.getManifest();
- if (jman == null)
- return null;
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- jman.write(baos);
- byte[] data = baos.toByteArray();
- man = new sun.tools.jar.Manifest(data);
- } catch (IOException ioe) {
- // return null
- }
- }
- return man;
- }
-
- static class CertCache {
- Certificate [] certs;
- Vector<SystemIdentity> ids;
-
- boolean equals(Certificate[] certs) {
- if (this.certs == null) {
- if (certs!= null)
- return false;
- else
- return true;
- }
-
- if (certs == null)
- return false;
-
- boolean match;
-
- for (int i = 0; i < certs.length; i++) {
- match = false;
- for (int j = 0; j < this.certs.length; j++) {
- if (certs[i].equals(this.certs[j])) {
- match = true;
- break;
- }
- }
- if (!match) return false;
- }
-
- for (int i = 0; i < this.certs.length; i++) {
- match = false;
- for (int j = 0; j < certs.length; j++) {
- if (this.certs[i].equals(certs[j])) {
- match = true;
- break;
- }
- }
- if (!match) return false;
- }
- return true;
- }
- }
-
- private ArrayList<CertCache> certCache = null;
-
-
- /**
- * Returns the Identity vector for the given array of Certificates
- */
- protected Vector<SystemIdentity> getIds(Certificate[] certs) {
- if (certs == null)
- return null;
-
- if (certCache == null)
- certCache = new ArrayList<CertCache>();
- CertCache cc;
- for (int i = 0; i < certCache.size(); i++) {
- cc = certCache.get(i);
- if (cc.equals(certs)) {
- return cc.ids;
- }
- }
- cc = new CertCache();
- cc.certs = certs;
-
- if (certs.length > 0) {
- for (int i=0; i<certs.length; i++) {
- try {
- X509Certificate cert = (X509Certificate) certs[i];
- Principal tmpName = cert.getSubjectDN();
- final SystemIdentity id = new SystemIdentity(
- tmpName.getName(),
- null);
-
- byte[] encoded = cert.getEncoded();
- final java.security.Certificate oldC =
- new sun.security.x509.X509Cert(encoded);
- try {
- AccessController.doPrivileged(
- new java.security.PrivilegedExceptionAction<Void>() {
- public Void run()
- throws java.security.KeyManagementException
- {
- id.addCertificate(oldC);
- return null;
- }
- });
- } catch (java.security.PrivilegedActionException pae) {
- throw (java.security.KeyManagementException)
- pae.getException();
- }
- if (cc.ids == null)
- cc.ids = new Vector<SystemIdentity>();
- cc.ids.addElement(id);
- } catch (java.security.KeyManagementException kme) {
- // ignore if we can't create Identity
- } catch (IOException ioe) {
- // ignore if we can't parse
- } catch (java.security.cert.CertificateEncodingException cee) {
- // ignore if we can't encode
- }
- }
- }
- certCache.add(cc);
- return cc.ids;
- }
-}
--- a/jdk/src/share/classes/sun/tracing/MultiplexProviderFactory.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/tracing/MultiplexProviderFactory.java Wed Dec 16 16:25:08 2009 -0800
@@ -30,7 +30,6 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
-import java.util.logging.Logger;
import com.sun.tracing.ProviderFactory;
import com.sun.tracing.Provider;
@@ -65,13 +64,7 @@
providers.add(factory.createProvider(cls));
}
MultiplexProvider provider = new MultiplexProvider(cls, providers);
- try {
- provider.init();
- } catch (Exception e) {
- // Probably a permission problem (can't get declared members)
- Logger.getAnonymousLogger().warning(
- "Could not initialize tracing provider: " + e.getMessage());
- }
+ provider.init();
return provider.newProxyInstance();
}
}
--- a/jdk/src/share/classes/sun/tracing/NullProviderFactory.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/tracing/NullProviderFactory.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,6 @@
package sun.tracing;
import java.lang.reflect.Method;
-import java.util.logging.Logger;
import com.sun.tracing.ProviderFactory;
import com.sun.tracing.Provider;
@@ -53,13 +52,7 @@
*/
public <T extends Provider> T createProvider(Class<T> cls) {
NullProvider provider = new NullProvider(cls);
- try {
- provider.init();
- } catch (Exception e) {
- // Probably a permission problem (can't get declared members)
- Logger.getAnonymousLogger().warning(
- "Could not initialize tracing provider: " + e.getMessage());
- }
+ provider.init();
return provider.newProxyInstance();
}
}
--- a/jdk/src/share/classes/sun/tracing/PrintStreamProviderFactory.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/tracing/PrintStreamProviderFactory.java Wed Dec 16 16:25:08 2009 -0800
@@ -28,7 +28,6 @@
import java.lang.reflect.Method;
import java.io.PrintStream;
import java.util.HashMap;
-import java.util.logging.Logger;
import com.sun.tracing.ProviderFactory;
import com.sun.tracing.Provider;
@@ -54,13 +53,7 @@
public <T extends Provider> T createProvider(Class<T> cls) {
PrintStreamProvider provider = new PrintStreamProvider(cls, stream);
- try {
- provider.init();
- } catch (Exception e) {
- // Probably a permission problem (can't get declared members)
- Logger.getAnonymousLogger().warning(
- "Could not initialize tracing provider: " + e.getMessage());
- }
+ provider.init();
return provider.newProxyInstance();
}
}
--- a/jdk/src/share/classes/sun/tracing/ProviderSkeleton.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/tracing/ProviderSkeleton.java Wed Dec 16 16:25:08 2009 -0800
@@ -32,6 +32,8 @@
import java.lang.reflect.AnnotatedElement;
import java.lang.annotation.Annotation;
import java.util.HashMap;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import com.sun.tracing.Provider;
import com.sun.tracing.Probe;
@@ -99,7 +101,13 @@
* It is up to the factory implementations to call this after construction.
*/
public void init() {
- for (Method m : providerType.getDeclaredMethods()) {
+ Method[] methods = AccessController.doPrivileged(new PrivilegedAction<Method[]>() {
+ public Method[] run() {
+ return providerType.getDeclaredMethods();
+ }
+ });
+
+ for (Method m : methods) {
if ( m.getReturnType() != Void.TYPE ) {
throw new IllegalArgumentException(
"Return value of method is not void");
--- a/jdk/src/share/classes/sun/tracing/dtrace/DTraceProviderFactory.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/classes/sun/tracing/dtrace/DTraceProviderFactory.java Wed Dec 16 16:25:08 2009 -0800
@@ -29,7 +29,6 @@
import java.util.Set;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.logging.Logger;
import java.security.Permission;
import com.sun.tracing.ProviderFactory;
@@ -80,15 +79,8 @@
DTraceProvider jsdt = new DTraceProvider(cls);
T proxy = jsdt.newProxyInstance();
jsdt.setProxy(proxy);
- try {
- jsdt.init();
- new Activation(jsdt.getModuleName(), new DTraceProvider[] { jsdt });
- } catch (Exception e) {
- // Probably a permission problem (can't get declared members)
- Logger.getAnonymousLogger().warning(
- "Could not initialize tracing provider: " + e.getMessage());
- jsdt.dispose();
- }
+ jsdt.init();
+ new Activation(jsdt.getModuleName(), new DTraceProvider[] { jsdt });
return proxy;
}
--- a/jdk/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-/*
- * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-#warn This file is preprocessed before being compiled
-
-package sun.util;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.ResourceBundle;
-import java.util.ResourceBundle.Control;
-
-/**
- * This is a convenient class for loading some of internal resources faster
- * if they are built with Resources.gmk defined in J2SE workspace. Also,
- * they have to be in class file format.
- *
- * "LOCALE_LIST" will be replaced at built time by a list of locales we
- * defined in Defs.gmk. We want to exclude these locales from search to
- * gain better performance. For example, since we know if the resource
- * is built with Resources.gmk, they are not going to provide basename_en.class
- * & basename_en_US.class resources, in that case, continuing searching them
- * is expensive. By excluding them from the candidate locale list, these
- * resources won't be searched.
- *
- * @since 1.6.
- */
-public class CoreResourceBundleControl extends ResourceBundle.Control {
- /* the candidate locale list to search */
- private final Collection<Locale> excludedJDKLocales;
- /* singlton instance of the resource bundle control. */
- private static CoreResourceBundleControl resourceBundleControlInstance =
- new CoreResourceBundleControl();
-
- protected CoreResourceBundleControl() {
- excludedJDKLocales = Arrays.asList(#LOCALE_LIST#);
- }
-
- /**
- * This method is to provide a customized ResourceBundle.Control to speed
- * up the search of resources in JDK.
- *
- * @return the instance of resource bundle control.
- */
- public static CoreResourceBundleControl getRBControlInstance() {
- return resourceBundleControlInstance;
- }
-
- /**
- * This method is to provide a customized ResourceBundle.Control to speed
- * up the search of resources in JDK, with the bundle's package name check.
- *
- * @param bundleName bundle name to check
- * @return the instance of resource bundle control if the bundle is JDK's,
- * otherwise returns null.
- */
- public static CoreResourceBundleControl getRBControlInstance(String bundleName) {
- if (bundleName.startsWith("com.sun.") ||
- bundleName.startsWith("java.") ||
- bundleName.startsWith("javax.") ||
- bundleName.startsWith("sun.")) {
- return resourceBundleControlInstance;
- } else {
- return null;
- }
- }
-
- /**
- * @returns a list of candidate locales to search from.
- * @exception NullPointerException if baseName or locale is null.
- */
- @Override
- public List<Locale> getCandidateLocales(String baseName, Locale locale) {
- List<Locale> candidates = super.getCandidateLocales(baseName, locale);
- candidates.removeAll(excludedJDKLocales);
- return candidates;
- }
-
- /**
- * @ returns TTL_DONT_CACHE so that ResourceBundle instance won't be cached.
- * User of this CoreResourceBundleControl should probably maintain a hard reference
- * to the ResourceBundle object themselves.
- */
- @Override
- public long getTimeToLive(String baseName, Locale locale) {
- return ResourceBundle.Control.TTL_DONT_CACHE;
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java.template Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#warn This file is preprocessed before being compiled
+
+package sun.util;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.ResourceBundle.Control;
+
+/**
+ * This is a convenient class for loading some of internal resources faster
+ * if they are built with Resources.gmk defined in J2SE workspace. Also,
+ * they have to be in class file format.
+ *
+ * "LOCALE_LIST" will be replaced at built time by a list of locales we
+ * defined in Defs.gmk. We want to exclude these locales from search to
+ * gain better performance. For example, since we know if the resource
+ * is built with Resources.gmk, they are not going to provide basename_en.class
+ * & basename_en_US.class resources, in that case, continuing searching them
+ * is expensive. By excluding them from the candidate locale list, these
+ * resources won't be searched.
+ *
+ * @since 1.6.
+ */
+public class CoreResourceBundleControl extends ResourceBundle.Control {
+ /* the candidate locale list to search */
+ private final Collection<Locale> excludedJDKLocales;
+ /* singlton instance of the resource bundle control. */
+ private static CoreResourceBundleControl resourceBundleControlInstance =
+ new CoreResourceBundleControl();
+
+ protected CoreResourceBundleControl() {
+ excludedJDKLocales = Arrays.asList(#LOCALE_LIST#);
+ }
+
+ /**
+ * This method is to provide a customized ResourceBundle.Control to speed
+ * up the search of resources in JDK.
+ *
+ * @return the instance of resource bundle control.
+ */
+ public static CoreResourceBundleControl getRBControlInstance() {
+ return resourceBundleControlInstance;
+ }
+
+ /**
+ * This method is to provide a customized ResourceBundle.Control to speed
+ * up the search of resources in JDK, with the bundle's package name check.
+ *
+ * @param bundleName bundle name to check
+ * @return the instance of resource bundle control if the bundle is JDK's,
+ * otherwise returns null.
+ */
+ public static CoreResourceBundleControl getRBControlInstance(String bundleName) {
+ if (bundleName.startsWith("com.sun.") ||
+ bundleName.startsWith("java.") ||
+ bundleName.startsWith("javax.") ||
+ bundleName.startsWith("sun.")) {
+ return resourceBundleControlInstance;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @returns a list of candidate locales to search from.
+ * @exception NullPointerException if baseName or locale is null.
+ */
+ @Override
+ public List<Locale> getCandidateLocales(String baseName, Locale locale) {
+ List<Locale> candidates = super.getCandidateLocales(baseName, locale);
+ candidates.removeAll(excludedJDKLocales);
+ return candidates;
+ }
+
+ /**
+ * @ returns TTL_DONT_CACHE so that ResourceBundle instance won't be cached.
+ * User of this CoreResourceBundleControl should probably maintain a hard reference
+ * to the ResourceBundle object themselves.
+ */
+ @Override
+ public long getTimeToLive(String baseName, Locale locale) {
+ return ResourceBundle.Control.TTL_DONT_CACHE;
+ }
+}
--- a/jdk/src/share/classes/sun/util/LocaleDataMetaInfo-XLocales.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-/*
- * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-#warn This file is preprocessed before being compiled
-
-/*
- * This class contains a map which records the locale list string for
- * each resource in sun.util.resources & sun.text.resources.
- * It is used to avoid loading non-existent localized resources so that
- * jar files won't be opened unnecessary to look up them.
- *
- * @since 1.6
- */
-package sun.util;
-
-import java.util.HashMap;
-
-
-public class LocaleDataMetaInfo {
-
- private static final HashMap<String, String> resourceNameToLocales =
- new HashMap<String, String>(6);
-
-
- static {
- /* During JDK build time, #XXX_YYY# will be replaced by a string contain all the locales
- supported by the resource.
-
- Don't remove the space character between " and #. That is put there purposely so that
- look up locale string such as "en" could be based on if it contains " en ".
- */
- resourceNameToLocales.put("sun.text.resources.FormatData",
- " #FormatData_EuroLocales# | #FormatData_NonEuroLocales# ");
-
- resourceNameToLocales.put("sun.text.resources.CollationData",
- " #CollationData_EuroLocales# | #CollationData_NonEuroLocales# ");
-
- resourceNameToLocales.put("sun.util.resources.TimeZoneNames",
- " #TimeZoneNames_EuroLocales# | #TimeZoneNames_NonEuroLocales# ");
-
- resourceNameToLocales.put("sun.util.resources.LocaleNames",
- " #LocaleNames_EuroLocales# | #LocaleNames_NonEuroLocales# ");
-
- resourceNameToLocales.put("sun.util.resources.CurrencyNames",
- " #CurrencyNames_EuroLocales# | #CurrencyNames_NonEuroLocales# ");
-
- resourceNameToLocales.put("sun.util.resources.CalendarData",
- " #CalendarData_EuroLocales# | #CalendarData_NonEuroLocales# ");
- }
-
- /*
- * @param resourceName the resource name
- * @return the supported locale string for the passed in resource.
- */
- public static String getSupportedLocaleString(String resourceName) {
-
- return resourceNameToLocales.get(resourceName);
- }
-
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/util/LocaleDataMetaInfo-XLocales.java.template Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#warn This file is preprocessed before being compiled
+
+/*
+ * This class contains a map which records the locale list string for
+ * each resource in sun.util.resources & sun.text.resources.
+ * It is used to avoid loading non-existent localized resources so that
+ * jar files won't be opened unnecessary to look up them.
+ *
+ * @since 1.6
+ */
+package sun.util;
+
+import java.util.HashMap;
+
+
+public class LocaleDataMetaInfo {
+
+ private static final HashMap<String, String> resourceNameToLocales =
+ new HashMap<String, String>(6);
+
+
+ static {
+ /* During JDK build time, #XXX_YYY# will be replaced by a string contain all the locales
+ supported by the resource.
+
+ Don't remove the space character between " and #. That is put there purposely so that
+ look up locale string such as "en" could be based on if it contains " en ".
+ */
+ resourceNameToLocales.put("sun.text.resources.FormatData",
+ " #FormatData_EuroLocales# | #FormatData_NonEuroLocales# ");
+
+ resourceNameToLocales.put("sun.text.resources.CollationData",
+ " #CollationData_EuroLocales# | #CollationData_NonEuroLocales# ");
+
+ resourceNameToLocales.put("sun.util.resources.TimeZoneNames",
+ " #TimeZoneNames_EuroLocales# | #TimeZoneNames_NonEuroLocales# ");
+
+ resourceNameToLocales.put("sun.util.resources.LocaleNames",
+ " #LocaleNames_EuroLocales# | #LocaleNames_NonEuroLocales# ");
+
+ resourceNameToLocales.put("sun.util.resources.CurrencyNames",
+ " #CurrencyNames_EuroLocales# | #CurrencyNames_NonEuroLocales# ");
+
+ resourceNameToLocales.put("sun.util.resources.CalendarData",
+ " #CalendarData_EuroLocales# | #CalendarData_NonEuroLocales# ");
+ }
+
+ /*
+ * @param resourceName the resource name
+ * @return the supported locale string for the passed in resource.
+ */
+ public static String getSupportedLocaleString(String resourceName) {
+
+ return resourceNameToLocales.get(resourceName);
+ }
+
+}
--- a/jdk/src/share/native/java/lang/fdlibm/include/fdlibm.h Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/share/native/java/lang/fdlibm/include/fdlibm.h Wed Dec 16 16:25:08 2009 -0800
@@ -29,7 +29,7 @@
#ifdef __NEWVALID /* special setup for Sun test regime */
#if defined(i386) || defined(i486) || \
defined(intel) || defined(x86) || \
- defined(i86pc) || defined(_M_IA64)
+ defined(i86pc) || defined(_M_IA64) || defined(ia64)
#define _LITTLE_ENDIAN
#endif
#endif
--- a/jdk/src/solaris/bin/java_md.c Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/bin/java_md.c Wed Dec 16 16:25:08 2009 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -51,9 +51,9 @@
* two data models and cohabitation of jre/jdk bits with both data
* models is supported, then DUAL_MODE is defined. When DUAL_MODE is
* defined, the architecture names for the narrow and wide version of
- * the architecture are defined in LIBARCH64NAME and LIBARCH32NAME. Currently
- * only Solaris on sparc/sparcv9 and i586/amd64 is DUAL_MODE; linux
- * i586/amd64 could be defined as DUAL_MODE but that is not the
+ * the architecture are defined in LIBARCH64NAME and LIBARCH32NAME.
+ * Currently only Solaris on sparc/sparcv9 and i586/amd64 is DUAL_MODE;
+ * linux i586/amd64 could be defined as DUAL_MODE but that is not the
* current policy.
*/
@@ -103,49 +103,56 @@
* platform independent routine SelectVersion. This may result in
* the exec of the specified launcher version.
*
- * Typically, the launcher execs at least once to ensure a suitable
- * LD_LIBRARY_PATH is in effect for the process. The first exec
- * screens out all the data model options; leaving the choice of data
- * model implicit in the binary selected to run. However, in case no
- * exec is done, the data model options are screened out before the vm
- * is invoked.
+ * Previously the launcher modified the LD_LIBRARY_PATH appropriately for the
+ * desired data model path, regardless if data models matched or not. The
+ * launcher subsequently exec'ed the desired executable, in order to make the
+ * LD_LIBRARY_PATH path available for the runtime linker. This is no longer the
+ * case, the launcher dlopens the target libjvm.so. All other required
+ * libraries are loaded by the runtime linker, by virtue of the $ORIGIN paths
+ * baked into the shared libraries, by the build infrastructure at compile time.
*
- * incoming argv ------------------------------
- * | |
- * \|/ |
- * CheckJVMType |
- * (removes -client, -server, etc.) |
- * \|/
- * CreateExecutionEnvironment
- * (removes -d32 and -d64,
- * determines desired data model,
- * sets up LD_LIBRARY_PATH,
- * and exec's)
- * |
- * --------------------------------------------
+ * Main
+ * (incoming argv)
+ * |
+ * \|/
+ * SelectVersion
+ * (selects the JRE version, note: not data model)
+ * |
+ * \|/
+ * CreateExecutionEnvironment
+ * (determines desired data model)
+ * |
* |
* \|/
- * exec child 1 incoming argv -----------------
+ * Have Desired Model ? --> NO --> Is Dual-Mode ? --> NO --> Exit(with error)
+ * | |
* | |
- * \|/ |
- * CheckJVMType |
- * (removes -client, -server, etc.) |
+ * | \|/
+ * | YES
+ * | |
+ * | |
* | \|/
- * | CreateExecutionEnvironment
- * | (verifies desired data model
- * | is running and acceptable
- * | LD_LIBRARY_PATH;
- * | no-op in child)
+ * | CheckJvmType
+ * | (removes -client, -server etc.)
+ * | |
+ * | |
+ * \|/ \|/
+ * YES (find the desired executable and exec child)
+ * | |
+ * | |
+ * \|/ \|/
+ * CheckJvmType Main
+ * (removes -client, -server, etc.)
+ * |
* |
* \|/
* TranslateDashJArgs...
* (Prepare to pass args to vm)
* |
* |
- * |
* \|/
* ParseArguments
- * (ignores -d32 and -d64,
+ * (removes -d32 and -d64 if any,
* processes version options,
* creates argument list for vm,
* etc.)
@@ -199,17 +206,13 @@
/* Compute/set the name of the executable */
SetExecname(*_argvp);
- /* Set the LD_LIBRARY_PATH environment variable, check data model
- flags, and exec process, if needed */
+ /* Check data model flags, and exec process, if needed */
{
char *arch = (char *)GetArch(); /* like sparc or sparcv9 */
char * jvmtype = NULL;
int argc = *_argcp;
char **argv = original_argv;
- char *runpath = NULL; /* existing effective LD_LIBRARY_PATH
- setting */
-
int running = CURRENT_DATA_MODEL;
int wanted = running; /* What data mode is being
@@ -217,18 +220,8 @@
fine unless another model
is asked for */
- char* new_runpath = NULL; /* desired new LD_LIBRARY_PATH string */
- char* newpath = NULL; /* path on new LD_LIBRARY_PATH */
- char* lastslash = NULL;
-
- char** newenvp = NULL; /* current environment */
-
char** newargv = NULL;
int newargc = 0;
-#ifdef __solaris__
- char* dmpath = NULL; /* data model specific LD_LIBRARY_PATH,
- Solaris only */
-#endif
/*
* Starting in 1.5, all unix platforms accept the -d32 and -d64
@@ -306,6 +299,11 @@
JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath);
exit(4);
}
+ /*
+ * we seem to have everything we need, so without further ado
+ * we return back.
+ */
+ return;
} else { /* do the same speculatively or exit */
#ifdef DUAL_MODE
if (running != wanted) {
@@ -335,190 +333,6 @@
#endif
}
- /*
- * We will set the LD_LIBRARY_PATH as follows:
- *
- * o $JVMPATH (directory portion only)
- * o $JRE/lib/$LIBARCHNAME
- * o $JRE/../lib/$LIBARCHNAME
- *
- * followed by the user's previous effective LD_LIBRARY_PATH, if
- * any.
- */
-
-#ifdef __solaris__
- /*
- * Starting in Solaris 7, ld.so.1 supports three LD_LIBRARY_PATH
- * variables:
- *
- * 1. LD_LIBRARY_PATH -- used for 32 and 64 bit searches if
- * data-model specific variables are not set.
- *
- * 2. LD_LIBRARY_PATH_64 -- overrides and replaces LD_LIBRARY_PATH
- * for 64-bit binaries.
- *
- * 3. LD_LIBRARY_PATH_32 -- overrides and replaces LD_LIBRARY_PATH
- * for 32-bit binaries.
- *
- * The vm uses LD_LIBRARY_PATH to set the java.library.path system
- * property. To shield the vm from the complication of multiple
- * LD_LIBRARY_PATH variables, if the appropriate data model
- * specific variable is set, we will act as if LD_LIBRARY_PATH had
- * the value of the data model specific variant and the data model
- * specific variant will be unset. Note that the variable for the
- * *wanted* data model must be used (if it is set), not simply the
- * current running data model.
- */
-
- switch(wanted) {
- case 0:
- if(running == 32) {
- dmpath = getenv("LD_LIBRARY_PATH_32");
- wanted = 32;
- }
- else {
- dmpath = getenv("LD_LIBRARY_PATH_64");
- wanted = 64;
- }
- break;
-
- case 32:
- dmpath = getenv("LD_LIBRARY_PATH_32");
- break;
-
- case 64:
- dmpath = getenv("LD_LIBRARY_PATH_64");
- break;
-
- default:
- JLI_ReportErrorMessage(JRE_ERROR3, __LINE__);
- exit(1); /* unknown value in wanted */
- break;
- }
-
- /*
- * If dmpath is NULL, the relevant data model specific variable is
- * not set and normal LD_LIBRARY_PATH should be used.
- */
- if( dmpath == NULL) {
- runpath = getenv("LD_LIBRARY_PATH");
- }
- else {
- runpath = dmpath;
- }
-#else
- /*
- * If not on Solaris, assume only a single LD_LIBRARY_PATH
- * variable.
- */
- runpath = getenv("LD_LIBRARY_PATH");
-#endif /* __solaris__ */
-
-#ifdef __linux
- /*
- * On linux, if a binary is running as sgid or suid, glibc sets
- * LD_LIBRARY_PATH to the empty string for security purposes. (In
- * contrast, on Solaris the LD_LIBRARY_PATH variable for a
- * privileged binary does not lose its settings; but the dynamic
- * linker does apply more scrutiny to the path.) The launcher uses
- * the value of LD_LIBRARY_PATH to prevent an exec loop.
- * Therefore, if we are running sgid or suid, this function's
- * setting of LD_LIBRARY_PATH will be ineffective and we should
- * return from the function now. Getting the right libraries to
- * be found must be handled through other mechanisms.
- */
- if((getgid() != getegid()) || (getuid() != geteuid()) ) {
- return;
- }
-#endif
-
- /* runpath contains current effective LD_LIBRARY_PATH setting */
-
- jvmpath = JLI_StringDup(jvmpath);
- new_runpath = JLI_MemAlloc( ((runpath!=NULL)?JLI_StrLen(runpath):0) +
- 2*JLI_StrLen(jrepath) + 2*JLI_StrLen(arch) +
- JLI_StrLen(jvmpath) + 52);
- newpath = new_runpath + JLI_StrLen("LD_LIBRARY_PATH=");
-
-
- /*
- * Create desired LD_LIBRARY_PATH value for target data model.
- */
- {
- /* remove the name of the .so from the JVM path */
- lastslash = JLI_StrRChr(jvmpath, '/');
- if (lastslash)
- *lastslash = '\0';
-
-
- /* jvmpath, ((running != wanted)?((wanted==64)?"/"LIBARCH64NAME:"/.."):""), */
-
- sprintf(new_runpath, "LD_LIBRARY_PATH="
- "%s:"
- "%s/lib/%s:"
- "%s/../lib/%s",
- jvmpath,
-#ifdef DUAL_MODE
- jrepath, GetArchPath(wanted),
- jrepath, GetArchPath(wanted)
-#else
- jrepath, arch,
- jrepath, arch
-#endif
- );
-
-
- /*
- * Check to make sure that the prefix of the current path is the
- * desired environment variable setting.
- */
- if (runpath != NULL &&
- JLI_StrNCmp(newpath, runpath, JLI_StrLen(newpath))==0 &&
- (runpath[JLI_StrLen(newpath)] == 0 || runpath[JLI_StrLen(newpath)] == ':') &&
- (running == wanted) /* data model does not have to be changed */
-#ifdef __solaris__
- && (dmpath == NULL) /* data model specific variables not set */
-#endif
- ) {
-
- return;
-
- }
- }
-
- /*
- * Place the desired environment setting onto the prefix of
- * LD_LIBRARY_PATH. Note that this prevents any possible infinite
- * loop of execv() because we test for the prefix, above.
- */
- if (runpath != 0) {
- JLI_StrCat(new_runpath, ":");
- JLI_StrCat(new_runpath, runpath);
- }
-
- if( putenv(new_runpath) != 0) {
- exit(1); /* problem allocating memory; LD_LIBRARY_PATH not set
- properly */
- }
-
- /*
- * Unix systems document that they look at LD_LIBRARY_PATH only
- * once at startup, so we have to re-exec the current executable
- * to get the changed environment variable to have an effect.
- */
-
-#ifdef __solaris__
- /*
- * If dmpath is not NULL, remove the data model specific string
- * in the environment for the exec'ed child.
- */
-
- if( dmpath != NULL)
- (void)UnsetEnv((wanted==32)?"LD_LIBRARY_PATH_32":"LD_LIBRARY_PATH_64");
-#endif
-
- newenvp = environ;
-
{
char *newexec = execname;
#ifdef DUAL_MODE
@@ -549,17 +363,16 @@
argv[0] = newexec;
}
#endif
-
+ JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n");
(void)fflush(stdout);
(void)fflush(stderr);
- execve(newexec, argv, newenvp);
+ execv(newexec, argv);
JLI_ReportErrorMessageSys(JRE_ERROR4, newexec);
#ifdef DUAL_MODE
if (running != wanted) {
JLI_ReportErrorMessage(JRE_ERROR5, wanted, running);
# ifdef __solaris__
-
# ifdef __sparc
JLI_ReportErrorMessage(JRE_ERROR6);
# else
@@ -570,13 +383,11 @@
#endif
}
-
exit(1);
}
}
-
/*
* On Solaris VM choosing is done by the launcher (java.c).
*/
@@ -1123,6 +934,7 @@
printf(" %s", argv[i]);
printf("\n");
}
+ JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n");
(void)fflush(stdout);
(void)fflush(stderr);
execv(wanted, argv);
--- a/jdk/src/solaris/classes/sun/awt/X11/InfoWindow.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/InfoWindow.java Wed Dec 16 16:25:08 2009 -0800
@@ -45,6 +45,7 @@
protected InfoWindow(Frame parent, Color borderColor) {
super(parent);
+ setType(Window.Type.POPUP);
container = new Container() {
@Override
public Insets getInsets() {
--- a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -212,27 +212,6 @@
return true;
}
- static XComponentPeer getNativeContainer(Component comp) {
- if (comp == null) {
- return null;
- }
-
- synchronized(comp.getTreeLock()) {
- while (comp != null && (ComponentAccessor.getPeer(comp) instanceof LightweightPeer)) {
- comp = ComponentAccessor.getParent_NoClientCode(comp);
- }
-
- if (comp != null) {
- ComponentPeer peer = ComponentAccessor.getPeer(comp);
- if (peer != null && peer instanceof XComponentPeer) {
- return (XComponentPeer)peer;
- }
- }
- }
-
- return null;
- }
-
/*************************************************
* FOCUS STUFF
*************************************************/
@@ -508,13 +487,14 @@
}
XWindowPeer getParentTopLevel() {
- Container parent = (target instanceof Container) ? ((Container)target) : (ComponentAccessor.getParent_NoClientCode(target));
+ AWTAccessor.ComponentAccessor compAccessor = AWTAccessor.getComponentAccessor();
+ Container parent = (target instanceof Container) ? ((Container)target) : (compAccessor.getParent(target));
// Search for parent window
while (parent != null && !(parent instanceof Window)) {
- parent = ComponentAccessor.getParent_NoClientCode(parent);
+ parent = compAccessor.getParent(parent);
}
if (parent != null) {
- return (XWindowPeer)ComponentAccessor.getPeer(parent);
+ return (XWindowPeer)compAccessor.getPeer(parent);
} else {
return null;
}
@@ -828,7 +808,7 @@
public void endLayout() {
if (!paintPending && !paintArea.isEmpty()
- && !ComponentAccessor.getIgnoreRepaint(target))
+ && !AWTAccessor.getComponentAccessor().getIgnoreRepaint(target))
{
// if not waiting for native painting repaint damaged area
postEvent(new PaintEvent(target, PaintEvent.PAINT,
@@ -1239,11 +1219,11 @@
// End of multi-buffering
public void notifyTextComponentChange(boolean add){
- Container parent = ComponentAccessor.getParent_NoClientCode(target);
+ Container parent = AWTAccessor.getComponentAccessor().getParent(target);
while(!(parent == null ||
parent instanceof java.awt.Frame ||
parent instanceof java.awt.Dialog)) {
- parent = ComponentAccessor.getParent_NoClientCode(parent);
+ parent = AWTAccessor.getComponentAccessor().getParent(parent);
}
/* FIX ME - FIX ME need to implement InputMethods
--- a/jdk/src/solaris/classes/sun/awt/X11/XContentWindow.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XContentWindow.java Wed Dec 16 16:25:08 2009 -0800
@@ -32,7 +32,7 @@
import sun.util.logging.PlatformLogger;
-import sun.awt.ComponentAccessor;
+import sun.awt.AWTAccessor;
/**
* This class implements window which serves as content window for decorated frames.
@@ -135,8 +135,7 @@
// NOTE: This method may be called by privileged threads.
// DO NOT INVOKE CLIENT CODE ON THIS THREAD!
public void handleResize(Rectangle bounds) {
- ComponentAccessor.setWidth((Component)target, bounds.width);
- ComponentAccessor.setHeight((Component)target, bounds.height);
+ AWTAccessor.getComponentAccessor().setSize((Component)target, bounds.width, bounds.height);
postEvent(new ComponentEvent(target, ComponentEvent.COMPONENT_RESIZED));
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XDataTransferer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XDataTransferer.java Wed Dec 16 16:25:08 2009 -0800
@@ -28,14 +28,21 @@
import java.awt.Image;
import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
+import java.io.BufferedReader;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -48,6 +55,8 @@
import sun.awt.datatransfer.DataTransferer;
import sun.awt.datatransfer.ToolkitThreadBlockedHandler;
+import java.io.ByteArrayOutputStream;
+
/**
* Platform-specific support for the data transfer subsystem.
*/
@@ -108,6 +117,22 @@
return super.getCharsetForTextFormat(lFormat);
}
+ protected boolean isURIListFormat(long format) {
+ String nat = getNativeForFormat(format);
+ if (nat == null) {
+ return false;
+ }
+ try {
+ DataFlavor df = new DataFlavor(nat);
+ if (df.getPrimaryType().equals("text") && df.getSubType().equals("uri-list")) {
+ return true;
+ }
+ } catch (Exception e) {
+ // Not a MIME format.
+ }
+ return false;
+ }
+
public boolean isFileFormat(long format) {
return format == FILE_NAME_ATOM.getAtom() ||
format == DT_NET_FILE_ATOM.getAtom();
@@ -170,6 +195,19 @@
}
}
+ protected ByteArrayOutputStream convertFileListToBytes(ArrayList<String> fileList)
+ throws IOException
+ {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ for (int i = 0; i < fileList.size(); i++)
+ {
+ byte[] bytes = fileList.get(i).getBytes();
+ if (i != 0) bos.write(0);
+ bos.write(bytes, 0, bytes.length);
+ }
+ return bos;
+ }
+
/**
* Translates either a byte array or an input stream which contain
* platform-specific image data in the given format into an Image.
@@ -215,6 +253,52 @@
}
}
+ protected URI[] dragQueryURIs(InputStream stream,
+ byte[] bytes,
+ long format,
+ Transferable localeTransferable)
+ throws IOException {
+
+ String charset = null;
+ if (localeTransferable != null &&
+ isLocaleDependentTextFormat(format) &&
+ localeTransferable.isDataFlavorSupported(javaTextEncodingFlavor)) {
+ try {
+ charset = new String(
+ (byte[])localeTransferable.getTransferData(javaTextEncodingFlavor),
+ "UTF-8"
+ );
+ } catch (UnsupportedFlavorException cannotHappen) {
+ }
+ } else {
+ charset = getCharsetForTextFormat(format);
+ }
+ if (charset == null) {
+ // Only happens when we have a custom text type.
+ charset = getDefaultTextCharset();
+ }
+
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new InputStreamReader(stream, charset));
+ String line;
+ ArrayList<URI> uriList = new ArrayList<URI>();
+ URI uri;
+ while ((line = reader.readLine()) != null) {
+ try {
+ uri = new URI(line);
+ } catch (URISyntaxException uriSyntaxException) {
+ throw new IOException(uriSyntaxException);
+ }
+ uriList.add(uri);
+ }
+ return uriList.toArray(new URI[uriList.size()]);
+ } finally {
+ if (reader != null)
+ reader.close();
+ }
+ }
+
/**
* Returns true if and only if the name of the specified format Atom
* constitutes a valid MIME type with the specified primary type.
--- a/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -32,7 +32,7 @@
import sun.util.logging.PlatformLogger;
-import sun.awt.ComponentAccessor;
+import sun.awt.AWTAccessor;
import sun.awt.SunToolkit;
abstract class XDecoratedPeer extends XWindowPeer {
@@ -167,10 +167,11 @@
}
public Graphics getGraphics() {
+ AWTAccessor.ComponentAccessor compAccessor = AWTAccessor.getComponentAccessor();
return getGraphics(content.surfaceData,
- ComponentAccessor.getForeground(target),
- ComponentAccessor.getBackground(target),
- ComponentAccessor.getFont_NoClientCode(target));
+ compAccessor.getForeground(target),
+ compAccessor.getBackground(target),
+ compAccessor.getFont(target));
}
public void setTitle(String title) {
@@ -404,8 +405,7 @@
public void handleMoved(WindowDimensions dims) {
Point loc = dims.getLocation();
- ComponentAccessor.setX((Component)target, loc.x);
- ComponentAccessor.setY((Component)target, loc.y);
+ AWTAccessor.getComponentAccessor().setLocation((Component)target, loc.x, loc.y);
postEvent(new ComponentEvent(target, ComponentEvent.COMPONENT_MOVED));
}
@@ -511,8 +511,8 @@
// its location changes.
Point oldLocation = getLocation();
- Point newLocation = new Point(ComponentAccessor.getX((Component)target),
- ComponentAccessor.getY((Component)target));
+ Point newLocation = new Point(AWTAccessor.getComponentAccessor().getX((Component)target),
+ AWTAccessor.getComponentAccessor().getY((Component)target));
if (!newLocation.equals(oldLocation)) {
handleMoved(newDimensions);
@@ -710,10 +710,7 @@
updateChildrenSizes();
// Bounds of the window
- Rectangle targetBounds = new Rectangle(ComponentAccessor.getX((Component)target),
- ComponentAccessor.getY((Component)target),
- ComponentAccessor.getWidth((Component)target),
- ComponentAccessor.getHeight((Component)target));
+ Rectangle targetBounds = AWTAccessor.getComponentAccessor().getBounds((Component)target);
Point newLocation = targetBounds.getLocation();
if (xe.get_send_event() || runningWM == XWM.NO_WM || XWM.isNonReparentingWM()) {
@@ -1042,10 +1039,11 @@
}
final void dumpTarget() {
- int getWidth = ComponentAccessor.getWidth((Component)target);
- int getHeight = ComponentAccessor.getHeight((Component)target);
- int getTargetX = ComponentAccessor.getX((Component)target);
- int getTargetY = ComponentAccessor.getY((Component)target);
+ AWTAccessor.ComponentAccessor compAccessor = AWTAccessor.getComponentAccessor();
+ int getWidth = compAccessor.getWidth((Component)target);
+ int getHeight = compAccessor.getHeight((Component)target);
+ int getTargetX = compAccessor.getX((Component)target);
+ int getTargetY = compAccessor.getY((Component)target);
System.err.println(">>> Target: " + getTargetX + ", " + getTargetY + ", " + getWidth + ", " + getHeight);
}
@@ -1099,9 +1097,9 @@
return false;
}
+ @Override
boolean isOverrideRedirect() {
-// return false;
- return ((XToolkit)Toolkit.getDefaultToolkit()).isOverrideRedirect((Window)target);
+ return Window.Type.POPUP.equals(getWindowType());
}
public boolean requestWindowFocus(long time, boolean timeProvided) {
@@ -1208,7 +1206,7 @@
Window owner = XWindowPeer.getDecoratedOwner(actualFocusedWindow);
if (owner != null && owner == target) {
- setActualFocusedWindow((XWindowPeer) ComponentAccessor.getPeer(actualFocusedWindow));
+ setActualFocusedWindow((XWindowPeer) AWTAccessor.getComponentAccessor().getPeer(actualFocusedWindow));
}
}
super.handleWindowFocusOut(oppositeWindow, serial);
--- a/jdk/src/solaris/classes/sun/awt/X11/XDialogPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XDialogPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -28,7 +28,7 @@
import java.awt.*;
import java.awt.peer.*;
import java.awt.event.*;
-import sun.awt.ComponentAccessor;
+import sun.awt.AWTAccessor;
import sun.awt.*;
@@ -117,7 +117,7 @@
try {
javaToplevels = XWindowPeer.collectJavaToplevels();
for (Window w : toBlock) {
- XWindowPeer wp = (XWindowPeer)ComponentAccessor.getPeer(w);
+ XWindowPeer wp = (XWindowPeer)AWTAccessor.getComponentAccessor().getPeer(w);
if (wp != null) {
wp.setModalBlocked((Dialog)target, true, javaToplevels);
}
@@ -139,7 +139,7 @@
XWindowPeer focusedWindowPeer = null;
if (focusedWindow != null) {
- focusedWindowPeer = (XWindowPeer)ComponentAccessor.getPeer(focusedWindow);
+ focusedWindowPeer = (XWindowPeer)AWTAccessor.getComponentAccessor().getPeer(focusedWindow);
} else {
/*
* For the case when a potential blocked window is not yet focused
--- a/jdk/src/solaris/classes/sun/awt/X11/XDragSourceContextPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XDragSourceContextPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -39,11 +39,10 @@
import sun.util.logging.PlatformLogger;
-import sun.awt.ComponentAccessor;
-
import sun.awt.dnd.SunDragSourceContextPeer;
import sun.awt.dnd.SunDropTargetContextPeer;
import sun.awt.SunToolkit;
+import sun.awt.AWTAccessor;
/**
* The XDragSourceContextPeer class is the class responsible for handling
@@ -117,7 +116,7 @@
XWindowPeer wpeer = null;
for (c = component; c != null && !(c instanceof Window);
- c = ComponentAccessor.getParent_NoClientCode(c));
+ c = AWTAccessor.getComponentAccessor().getParent(c));
if (c instanceof Window) {
wpeer = (XWindowPeer)c.getPeer();
--- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxy.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxy.java Wed Dec 16 16:25:08 2009 -0800
@@ -27,7 +27,7 @@
import java.awt.Component;
import java.awt.Toolkit;
-import sun.awt.ComponentAccessor;
+import sun.awt.AWTAccessor;
public class XEmbedChildProxy extends Component {
long handle;
@@ -39,8 +39,9 @@
public void addNotify() {
synchronized(getTreeLock()) {
- if (ComponentAccessor.getPeer(this) == null) {
- ComponentAccessor.setPeer(this, ((XToolkit)Toolkit.getDefaultToolkit()).createEmbedProxy(this));
+ if (AWTAccessor.getComponentAccessor().getPeer(this) == null) {
+ AWTAccessor.getComponentAccessor().
+ setPeer(this,((XToolkit)Toolkit.getDefaultToolkit()).createEmbedProxy(this));
}
super.addNotify();
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedClientHelper.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedClientHelper.java Wed Dec 16 16:25:08 2009 -0800
@@ -133,7 +133,7 @@
}
void handleFocusIn(int detail) {
if (embedded.focusAllowedFor()) {
- embedded.handleWindowFocusInSync(0);
+ embedded.handleWindowFocusIn(0);
}
switch(detail) {
case XEMBED_FOCUS_CURRENT:
@@ -205,7 +205,7 @@
// embedded is an active window before sending WINDOW_LOST_FOCUS
// to shared code
if (XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow() == embedded.target) {
- embedded.handleWindowFocusOutSync(null, 0);
+ embedded.handleWindowFocusOut(null, 0);
}
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedHelper.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedHelper.java Wed Dec 16 16:25:08 2009 -0800
@@ -216,7 +216,12 @@
XToolkit.awtLock();
try {
- keycode = XWindow.getAWTKeyCodeForKeySym((int)keysym);
+ XKeysym.Keysym2JavaKeycode kc = XKeysym.getJavaKeycode( keysym );
+ if(kc == null) {
+ keycode = java.awt.event.KeyEvent.VK_UNDEFINED;
+ }else{
+ keycode = kc.getJavaKeycode();
+ }
} finally {
XToolkit.awtUnlock();
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XGlobalCursorManager.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XGlobalCursorManager.java Wed Dec 16 16:25:08 2009 -0800
@@ -31,7 +31,7 @@
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
-import sun.awt.ComponentAccessor;
+import sun.awt.AWTAccessor;
import sun.awt.GlobalCursorManager;
import sun.awt.SunToolkit;
@@ -94,11 +94,11 @@
nc = nativeContainer.get();
}
} else {
- nc = getNativeContainer(comp);
+ nc = SunToolkit.getHeavyweightComponent(comp);
}
if (nc != null) {
- ComponentPeer nc_peer = ComponentAccessor.getPeer(nc);
+ ComponentPeer nc_peer = AWTAccessor.getComponentAccessor().getPeer(nc);
if (nc_peer instanceof XComponentPeer) {
synchronized (this) {
nativeContainer = new WeakReference<Component>(nc);
@@ -133,13 +133,6 @@
updateGrabbedCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
- private Component getNativeContainer(Component comp) {
- while (comp != null && ComponentAccessor.getPeer(comp) instanceof LightweightPeer) {
- comp = ComponentAccessor.getParent_NoClientCode(comp);
- }
- return comp;
- }
-
protected void getCursorPos(Point p) {
if (!((XToolkit)Toolkit.getDefaultToolkit()).getLastCursorPos(p)) {
@@ -186,27 +179,29 @@
}
private Cursor getCapableCursor(Component comp) {
+ AWTAccessor.ComponentAccessor compAccessor = AWTAccessor.getComponentAccessor();
+
Component c = comp;
while ((c != null) && !(c instanceof Window)
- && ComponentAccessor.isEnabledImpl(c)
- && ComponentAccessor.getVisible(c)
- && ComponentAccessor.getPeer(c) != null)
+ && compAccessor.isEnabled(c)
+ && compAccessor.isVisible(c)
+ && compAccessor.isDisplayable(c))
{
- c = ComponentAccessor.getParent_NoClientCode(c);
+ c = compAccessor.getParent(c);
}
if (c instanceof Window) {
- return (ComponentAccessor.isEnabledImpl(c)
- && ComponentAccessor.getVisible(c)
- && (ComponentAccessor.getPeer(c) != null)
- && ComponentAccessor.isEnabledImpl(comp))
+ return (compAccessor.isEnabled(c)
+ && compAccessor.isVisible(c)
+ && compAccessor.isDisplayable(c)
+ && compAccessor.isEnabled(comp))
?
- ComponentAccessor.getCursor_NoClientCode(comp)
+ compAccessor.getCursor(comp)
:
Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
} else if (c == null) {
return null;
}
- return getCapableCursor(ComponentAccessor.getParent_NoClientCode(c));
+ return getCapableCursor(compAccessor.getParent(c));
}
/* This methods needs to be called from within XToolkit.awtLock / XToolkit.awtUnlock section. */
--- a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Wed Dec 16 16:25:08 2009 -0800
@@ -69,6 +69,8 @@
static Hashtable<Integer, Long> javaKeycode2KeysymHash = new Hashtable<Integer, Long>();
static long keysym_lowercase = unsafe.allocateMemory(Native.getLongSize());
static long keysym_uppercase = unsafe.allocateMemory(Native.getLongSize());
+ static Keysym2JavaKeycode kanaLock = new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KANA_LOCK,
+ java.awt.event.KeyEvent.KEY_LOCATION_STANDARD);
private static PlatformLogger keyEventLog = PlatformLogger.getLogger("sun.awt.X11.kye.XKeysym");
public static char convertKeysym( long ks, int state ) {
@@ -214,12 +216,35 @@
}
return keysym;
}
+
+ /**
+ Return java.awt.KeyEvent constant meaning (Java) keycode, derived from X keysym.
+ Some keysyms maps to more than one keycode, these would require extra processing.
+ */
+ static Keysym2JavaKeycode getJavaKeycode( long keysym ) {
+ if(keysym == XKeySymConstants.XK_Mode_switch){
+ /* XK_Mode_switch on solaris maps either to VK_ALT_GRAPH (default) or VK_KANA_LOCK */
+ if( XToolkit.isKanaKeyboard() ) {
+ return kanaLock;
+ }
+ }else if(keysym == XKeySymConstants.XK_L1){
+ /* if it is Sun keyboard, trick hash to return VK_STOP else VK_F11 (default) */
+ if( XToolkit.isSunKeyboard() ) {
+ keysym = XKeySymConstants.SunXK_Stop;
+ }
+ }else if(keysym == XKeySymConstants.XK_L2) {
+ /* if it is Sun keyboard, trick hash to return VK_AGAIN else VK_F12 (default) */
+ if( XToolkit.isSunKeyboard() ) {
+ keysym = XKeySymConstants.SunXK_Again;
+ }
+ }
+
+ return keysym2JavaKeycodeHash.get( keysym );
+ }
/**
Return java.awt.KeyEvent constant meaning (Java) keycode, derived from X Window KeyEvent.
Algorithm is, extract via XKeycodeToKeysym a proper keysym according to Xlib spec rules and
err exceptions, then search a java keycode in a table.
- Some keysyms maps to more than one keycode, these would require extra processing. If someone
- points me to such a keysym.
*/
static Keysym2JavaKeycode getJavaKeycode( XKeyEvent ev ) {
// get from keysym2JavaKeycodeHash.
@@ -234,7 +259,7 @@
keysym = xkeycode2keysym(ev, ndx);
}
- Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym );
+ Keysym2JavaKeycode jkc = getJavaKeycode( keysym );
return jkc;
}
static int getJavaKeycodeOnly( XKeyEvent ev ) {
@@ -259,7 +284,7 @@
ndx = 0;
keysym = xkeycode2keysym_noxkb(ev, ndx);
}
- Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym );
+ Keysym2JavaKeycode jkc = getJavaKeycode( keysym );
return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode();
}
static long javaKeycode2Keysym( int jkey ) {
--- a/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java Wed Dec 16 16:25:08 2009 -0800
@@ -252,8 +252,11 @@
XAtom XA_NET_WM_STATE_SKIP_TASKBAR = XAtom.get("_NET_WM_STATE_SKIP_TASKBAR");
XAtom XA_NET_WM_STATE_SKIP_PAGER = XAtom.get("_NET_WM_STATE_SKIP_PAGER");
- XAtom XA_NET_WM_WINDOW_TYPE = XAtom.get("_NET_WM_WINDOW_TYPE");
- XAtom XA_NET_WM_WINDOW_TYPE_DIALOG = XAtom.get("_NET_WM_WINDOW_TYPE_DIALOG");
+ public final XAtom XA_NET_WM_WINDOW_TYPE = XAtom.get("_NET_WM_WINDOW_TYPE");
+ public final XAtom XA_NET_WM_WINDOW_TYPE_NORMAL = XAtom.get("_NET_WM_WINDOW_TYPE_NORMAL");
+ public final XAtom XA_NET_WM_WINDOW_TYPE_DIALOG = XAtom.get("_NET_WM_WINDOW_TYPE_DIALOG");
+ public final XAtom XA_NET_WM_WINDOW_TYPE_UTILITY = XAtom.get("_NET_WM_WINDOW_TYPE_UTILITY");
+ public final XAtom XA_NET_WM_WINDOW_TYPE_POPUP_MENU = XAtom.get("_NET_WM_WINDOW_TYPE_POPUP_MENU");
XAtom XA_NET_WM_WINDOW_OPACITY = XAtom.get("_NET_WM_WINDOW_OPACITY");
--- a/jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -60,7 +60,7 @@
import javax.swing.plaf.BorderUIResource;
import java.awt.im.InputMethodRequests;
import sun.awt.CausedFocusEvent;
-import sun.awt.ComponentAccessor;
+import sun.awt.AWTAccessor;
class XTextAreaPeer extends XComponentPeer implements TextAreaPeer {
@@ -119,13 +119,14 @@
textPane.setVisible(true);
textPane.validate();
- foreground = ComponentAccessor.getForeground(target);
+ AWTAccessor.ComponentAccessor compAccessor = AWTAccessor.getComponentAccessor();
+ foreground = compAccessor.getForeground(target);
if (foreground == null) {
foreground = SystemColor.textText;
}
setForeground(foreground);
- background = ComponentAccessor.getBackground(target);
+ background = compAccessor.getBackground(target);
if (background == null) {
if (target.isEditable()) background = SystemColor.text;
else background = SystemColor.control;
@@ -134,8 +135,8 @@
if (!target.isBackgroundSet()) {
// This is a way to set the background color of the TextArea
- // without calling setBackground - go through reflection
- ComponentAccessor.setBackground(target, background);
+ // without calling setBackground - go through accessor
+ compAccessor.setBackground(target, background);
}
if (!target.isForegroundSet()) {
target.setForeground(SystemColor.textText);
@@ -311,13 +312,13 @@
}
void handleJavaKeyEvent(KeyEvent e) {
- ComponentAccessor.processEvent(jtext,e);
+ AWTAccessor.getComponentAccessor().processEvent(jtext,e);
}
public boolean handlesWheelScrolling() { return true; }
void handleJavaMouseWheelEvent(MouseWheelEvent e) {
- ComponentAccessor.processEvent(textPane,e);
+ AWTAccessor.getComponentAccessor().processEvent(textPane,e);
}
public void handleJavaMouseEvent( MouseEvent e ) {
@@ -1111,7 +1112,7 @@
this.xwin = xwin;
setDoubleBuffered(true);
jt.addFocusListener(this);
- ComponentAccessor.setParent(this,parent);
+ AWTAccessor.getComponentAccessor().setParent(this,parent);
setViewportBorder(new BevelBorder(false,SystemColor.controlDkShadow,SystemColor.controlLtHighlight) );
this.jtext = jt;
setFocusable(false);
@@ -1308,7 +1309,7 @@
c = current.getButton();
p = toLocalSpace( c, p );
}
- ComponentAccessor.processEvent( c, newMouseEvent( c, p, event ) );
+ AWTAccessor.getComponentAccessor().processEvent( c, newMouseEvent( c, p, event ) );
break;
}
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XTextFieldPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XTextFieldPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -55,7 +55,7 @@
import sun.util.logging.PlatformLogger;
import sun.awt.CausedFocusEvent;
-import sun.awt.ComponentAccessor;
+import sun.awt.AWTAccessor;
public class XTextFieldPeer extends XComponentPeer implements TextFieldPeer {
private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.X11.XTextField");
@@ -115,13 +115,14 @@
setBounds(x, y, width, height, SET_BOUNDS);
- foreground = ComponentAccessor.getForeground(target);
+ AWTAccessor.ComponentAccessor compAccessor = AWTAccessor.getComponentAccessor();
+ foreground = compAccessor.getForeground(target);
if (foreground == null)
foreground = SystemColor.textText;
setForeground(foreground);
- background = ComponentAccessor.getBackground(target);
+ background = compAccessor.getBackground(target);
if (background == null) {
if (((TextField)target).isEditable()) background = SystemColor.text;
else background = SystemColor.control;
@@ -130,8 +131,8 @@
if (!target.isBackgroundSet()) {
// This is a way to set the background color of the TextArea
- // without calling setBackground - go through reflection
- ComponentAccessor.setBackground(target, background);
+ // without calling setBackground - go through accessor
+ compAccessor.setBackground(target, background);
}
if (!target.isForegroundSet()) {
target.setForeground(SystemColor.textText);
@@ -392,7 +393,7 @@
}
void handleJavaKeyEvent(KeyEvent e) {
- ComponentAccessor.processEvent(xtext,e);
+ AWTAccessor.getComponentAccessor().processEvent(xtext,e);
}
@@ -620,7 +621,7 @@
this.peer = peer;
setDoubleBuffered(true);
setFocusable(false);
- ComponentAccessor.setParent(this,parent);
+ AWTAccessor.getComponentAccessor().setParent(this,parent);
setBackground(peer.getPeerBackground());
setForeground(peer.getPeerForeground());
setFont(peer.getPeerFont());
--- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Wed Dec 16 16:25:08 2009 -0800
@@ -109,11 +109,6 @@
static int awt_multiclick_time;
static boolean securityWarningEnabled;
- // WeakSet should be used here, but there is no such class
- // in JDK (at least in JDK6 and earlier versions)
- private WeakHashMap<Window, Boolean> overrideRedirectWindows =
- new WeakHashMap<Window, Boolean>();
-
private static int screenWidth = -1, screenHeight = -1; // Dimensions of default screen
static long awt_defaultFg; // Pixel
private static XMouseInfoPeer xPeer;
@@ -538,6 +533,16 @@
processGlobalMotionEvent(ev);
}
+ if( ev.get_type() == XConstants.MappingNotify ) {
+ // The 'window' field in this event is unused.
+ // This application itself does nothing to initiate such an event
+ // (no calls of XChangeKeyboardMapping etc.).
+ // SunRay server sends this event to the application once on every
+ // keyboard (not just layout) change which means, quite seldom.
+ XlibWrapper.XRefreshKeyboardMapping(ev.pData);
+ resetKeyboardSniffer();
+ setupModifierMap();
+ }
XBaseWindow.dispatchToWindow(ev);
Collection dispatchers = null;
@@ -631,7 +636,7 @@
Component owner =
XKeyboardFocusManagerPeer.getCurrentNativeFocusOwner();
if (owner != null) {
- XWindow ownerWindow = (XWindow) ComponentAccessor.getPeer(owner);
+ XWindow ownerWindow = (XWindow) AWTAccessor.getComponentAccessor().getPeer(owner);
if (ownerWindow != null) {
w = ownerWindow.getContentWindow();
}
@@ -1316,19 +1321,6 @@
}
}
- @Override
- public void setOverrideRedirect(Window target) {
- synchronized (overrideRedirectWindows) {
- overrideRedirectWindows.put(target, true);
- }
- }
-
- public boolean isOverrideRedirect(Window target) {
- synchronized (overrideRedirectWindows) {
- return overrideRedirectWindows.containsKey(target);
- }
- }
-
static void dumpPeers() {
if (log.isLoggable(PlatformLogger.FINE)) {
log.fine("Mapped windows:");
@@ -1457,7 +1449,7 @@
* (which is assigned to the virtual pointer) reports the maximum
* capabilities of the mouse pointer (i.e. 32 physical buttons).
*/
- private native synchronized int getNumberOfButtonsImpl();
+ private native int getNumberOfButtonsImpl();
@Override
public int getNumberOfButtons(){
@@ -2130,6 +2122,11 @@
static final int XSUN_KP_BEHAVIOR = 1;
static final int XORG_KP_BEHAVIOR = 2;
+ static final int IS_SUN_KEYBOARD = 1;
+ static final int IS_NONSUN_KEYBOARD = 2;
+ static final int IS_KANA_KEYBOARD = 1;
+ static final int IS_NONKANA_KEYBOARD = 2;
+
static int awt_IsXsunKPBehavior = 0;
static boolean awt_UseXKB = false;
@@ -2159,6 +2156,33 @@
awtUnlock();
}
}
+
+ static int sunOrNotKeyboard = 0;
+ static int kanaOrNotKeyboard = 0;
+ static void resetKeyboardSniffer() {
+ sunOrNotKeyboard = 0;
+ kanaOrNotKeyboard = 0;
+ }
+ static boolean isSunKeyboard() {
+ if( sunOrNotKeyboard == 0 ) {
+ if( XlibWrapper.IsSunKeyboard( getDisplay() )) {
+ sunOrNotKeyboard = IS_SUN_KEYBOARD;
+ }else{
+ sunOrNotKeyboard = IS_NONSUN_KEYBOARD;
+ }
+ }
+ return (sunOrNotKeyboard == IS_SUN_KEYBOARD);
+ }
+ static boolean isKanaKeyboard() {
+ if( kanaOrNotKeyboard == 0 ) {
+ if( XlibWrapper.IsKanaKeyboard( getDisplay() )) {
+ kanaOrNotKeyboard = IS_KANA_KEYBOARD;
+ }else{
+ kanaOrNotKeyboard = IS_NONKANA_KEYBOARD;
+ }
+ }
+ return (kanaOrNotKeyboard == IS_KANA_KEYBOARD);
+ }
static boolean isXKBenabled() {
awtLock();
try {
--- a/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -295,7 +295,7 @@
}
public static void suppressWarningString(Window w) {
- WindowAccessor.setTrayIconWindow(w, true);
+ AWTAccessor.getWindowAccessor().setTrayIconWindow(w, true);
}
public void setToolTip(String tooltip) {
@@ -483,12 +483,6 @@
}
}
- static boolean isTrayIconStuffWindow(Window w) {
- return (w instanceof InfoWindow.Tooltip) ||
- (w instanceof InfoWindow.Balloon) ||
- (w instanceof XTrayIconEmbeddedFrame);
- }
-
// ***************************************
// Special embedded frame for tray icon
// ***************************************
--- a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java Wed Dec 16 16:25:08 2009 -0800
@@ -325,9 +325,9 @@
if (!(target instanceof Container) || win == null || win.getTarget() == null) {
return false;
}
- Container parent = ComponentAccessor.getParent_NoClientCode(win.target);
+ Container parent = AWTAccessor.getComponentAccessor().getParent(win.target);
while (parent != null && parent != target) {
- parent = ComponentAccessor.getParent_NoClientCode(parent);
+ parent = AWTAccessor.getComponentAccessor().getParent(parent);
}
return (parent == target);
}
@@ -560,10 +560,11 @@
int h = xe.get_height();
Component target = (Component)getEventSource();
+ AWTAccessor.ComponentAccessor compAccessor = AWTAccessor.getComponentAccessor();
- if (!ComponentAccessor.getIgnoreRepaint(target)
- && ComponentAccessor.getWidth(target) != 0
- && ComponentAccessor.getHeight(target) != 0)
+ if (!compAccessor.getIgnoreRepaint(target)
+ && compAccessor.getWidth(target) != 0
+ && compAccessor.getHeight(target) != 0)
{
handleExposeEvent(target, x, y, w, h);
}
@@ -950,7 +951,7 @@
XAwtState.setComponentMouseEntered(null);
}
} else {
- ((XComponentPeer) ComponentAccessor.getPeer(target))
+ ((XComponentPeer) AWTAccessor.getComponentAccessor().getPeer(target))
.pSetCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
@@ -1387,7 +1388,7 @@
Component comp = target;
while (comp != null && !(comp instanceof Window)) {
- comp = ComponentAccessor.getParent_NoClientCode(comp);
+ comp = AWTAccessor.getComponentAccessor().getParent(comp);
}
// applets, embedded, etc - translate directly
--- a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -35,18 +35,22 @@
import java.awt.peer.ComponentPeer;
import java.awt.peer.WindowPeer;
+import java.io.UnsupportedEncodingException;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;
+import java.util.concurrent.atomic.AtomicBoolean;
+
import sun.util.logging.PlatformLogger;
import sun.awt.AWTAccessor;
-import sun.awt.ComponentAccessor;
-import sun.awt.WindowAccessor;
-import sun.awt.AWTAccessor;
import sun.awt.DisplayChangedListener;
import sun.awt.SunToolkit;
import sun.awt.X11GraphicsDevice;
@@ -90,6 +94,8 @@
private boolean mustControlStackPosition = false; // Am override-redirect not on top
private XEventDispatcher rootPropertyEventDispatcher = null;
+ private static final AtomicBoolean isStartupNotificationRemoved = new AtomicBoolean();
+
/*
* Focus related flags
*/
@@ -97,6 +103,18 @@
private boolean isBeforeFirstMapNotify = false; // Is the window (being shown) between
// setVisible(true) & handleMapNotify().
+ /**
+ * The type of the window.
+ *
+ * The type is supposed to be immutable while the peer object exists.
+ * The value gets initialized in the preInit() method.
+ */
+ private Window.Type windowType = Window.Type.NORMAL;
+
+ public final Window.Type getWindowType() {
+ return windowType;
+ }
+
// It need to be accessed from XFramePeer.
protected Vector <ToplevelStateListener> toplevelStateListeners = new Vector<ToplevelStateListener>();
XWindowPeer(XCreateWindowParams params) {
@@ -128,6 +146,7 @@
void preInit(XCreateWindowParams params) {
target = (Component)params.get(TARGET);
+ windowType = ((Window)target).getType();
params.put(REPARENTED,
Boolean.valueOf(isOverrideRedirect() || isSimpleWindow()));
super.preInit(params);
@@ -233,7 +252,7 @@
if (((Window)target).getWarningString() != null) {
// accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip
// and TrayIcon balloon windows without a warning window.
- if (!WindowAccessor.isTrayIconWindow((Window)target)) {
+ if (!AWTAccessor.getWindowAccessor().isTrayIconWindow((Window)target)) {
warningWindow = new XWarningWindow((Window)target, getWindow(), this);
}
}
@@ -525,7 +544,7 @@
boolean isAutoRequestFocus() {
if (XToolkit.isToolkitThread()) {
- return WindowAccessor.isAutoRequestFocus((Window)target);
+ return AWTAccessor.getWindowAccessor().isAutoRequestFocus((Window)target);
} else {
return ((Window)target).isAutoRequestFocus();
}
@@ -1065,10 +1084,11 @@
if (warningWindow != null) {
// We can't use the coordinates stored in the XBaseWindow since
// they are zeros for decorated frames.
- int x = ComponentAccessor.getX(target);
- int y = ComponentAccessor.getY(target);
- int width = ComponentAccessor.getWidth(target);
- int height = ComponentAccessor.getHeight(target);
+ AWTAccessor.ComponentAccessor compAccessor = AWTAccessor.getComponentAccessor();
+ int x = compAccessor.getX(target);
+ int y = compAccessor.getY(target);
+ int width = compAccessor.getWidth(target);
+ int height = compAccessor.getHeight(target);
warningWindow.reposition(x, y, width, height);
}
}
@@ -1119,9 +1139,8 @@
}
boolean isOverrideRedirect() {
- return (XWM.getWMID() == XWM.OPENLOOK_WM ? true : false) ||
- ((XToolkit)Toolkit.getDefaultToolkit()).isOverrideRedirect((Window)target) ||
- XTrayIconPeer.isTrayIconStuffWindow((Window)target);
+ return XWM.getWMID() == XWM.OPENLOOK_WM ||
+ Window.Type.POPUP.equals(getWindowType());
}
final boolean isOLWMDecorBug() {
@@ -1152,7 +1171,7 @@
if (isSimpleWindow()) {
if (target == XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow()) {
Window owner = getDecoratedOwner((Window)target);
- ((XWindowPeer)ComponentAccessor.getPeer(owner)).requestWindowFocus();
+ ((XWindowPeer)AWTAccessor.getComponentAccessor().getPeer(owner)).requestWindowFocus();
}
}
}
@@ -1183,7 +1202,77 @@
}
}
+ private void removeStartupNotification() {
+ if (isStartupNotificationRemoved.getAndSet(true)) {
+ return;
+ }
+
+ final String desktopStartupId = AccessController.doPrivileged(new PrivilegedAction<String>() {
+ public String run() {
+ return XToolkit.getEnv("DESKTOP_STARTUP_ID");
+ }
+ });
+ if (desktopStartupId == null) {
+ return;
+ }
+
+ final StringBuilder messageBuilder = new StringBuilder("remove: ID=");
+ messageBuilder.append('"');
+ for (int i = 0; i < desktopStartupId.length(); i++) {
+ if (desktopStartupId.charAt(i) == '"' || desktopStartupId.charAt(i) == '\\') {
+ messageBuilder.append('\\');
+ }
+ messageBuilder.append(desktopStartupId.charAt(i));
+ }
+ messageBuilder.append('"');
+ messageBuilder.append('\0');
+ final byte[] message;
+ try {
+ message = messageBuilder.toString().getBytes("UTF-8");
+ } catch (UnsupportedEncodingException cannotHappen) {
+ return;
+ }
+
+ XClientMessageEvent req = null;
+
+ XToolkit.awtLock();
+ try {
+ final XAtom netStartupInfoBeginAtom = XAtom.get("_NET_STARTUP_INFO_BEGIN");
+ final XAtom netStartupInfoAtom = XAtom.get("_NET_STARTUP_INFO");
+
+ req = new XClientMessageEvent();
+ req.set_type(XConstants.ClientMessage);
+ req.set_window(getWindow());
+ req.set_message_type(netStartupInfoBeginAtom.getAtom());
+ req.set_format(8);
+
+ for (int pos = 0; pos < message.length; pos += 20) {
+ final int msglen = Math.min(message.length - pos, 20);
+ int i = 0;
+ for (; i < msglen; i++) {
+ XlibWrapper.unsafe.putByte(req.get_data() + i, message[pos + i]);
+ }
+ for (; i < 20; i++) {
+ XlibWrapper.unsafe.putByte(req.get_data() + i, (byte)0);
+ }
+ XlibWrapper.XSendEvent(XToolkit.getDisplay(),
+ XlibWrapper.RootWindow(XToolkit.getDisplay(), getScreenNumber()),
+ false,
+ XConstants.PropertyChangeMask,
+ req.pData);
+ req.set_message_type(netStartupInfoAtom.getAtom());
+ }
+ } finally {
+ XToolkit.awtUnlock();
+ if (req != null) {
+ req.dispose();
+ }
+ }
+ }
+
public void handleMapNotifyEvent(XEvent xev) {
+ removeStartupNotification();
+
// See 6480534.
isUnhiding |= isWMStateNetHidden();
@@ -1309,7 +1398,7 @@
XToolkit.awtLock();
try {
if (isReparented() && delayedModalBlocking) {
- addToTransientFors((XDialogPeer) ComponentAccessor.getPeer(modalBlocker));
+ addToTransientFors((XDialogPeer) AWTAccessor.getComponentAccessor().getPeer(modalBlocker));
delayedModalBlocking = false;
}
} finally {
@@ -1393,7 +1482,7 @@
try {
// State lock should always be after awtLock
synchronized(getStateLock()) {
- XDialogPeer blockerPeer = (XDialogPeer) ComponentAccessor.getPeer(d);
+ XDialogPeer blockerPeer = (XDialogPeer) AWTAccessor.getComponentAccessor().getPeer(d);
if (blocked) {
log.fine("{0} is blocked by {1}", this, blockerPeer);
modalBlocker = d;
@@ -1673,7 +1762,7 @@
// current chain iterator in the order from next to prev
XWindowPeer chainToSplit = prevTransientFor;
while (chainToSplit != null) {
- XWindowPeer blocker = (XWindowPeer) ComponentAccessor.getPeer(chainToSplit.modalBlocker);
+ XWindowPeer blocker = (XWindowPeer) AWTAccessor.getComponentAccessor().getPeer(chainToSplit.modalBlocker);
if (thisChainBlockers.contains(blocker)) {
// add to this dialog's chain
setToplevelTransientFor(thisChain, chainToSplit, true, false);
@@ -1701,7 +1790,7 @@
static Window getDecoratedOwner(Window window) {
while ((null != window) && !(window instanceof Frame || window instanceof Dialog)) {
- window = (Window) ComponentAccessor.getParent_NoClientCode(window);
+ window = (Window) AWTAccessor.getComponentAccessor().getParent(window);
}
return window;
}
@@ -1734,7 +1823,7 @@
}
focusLog.fine("Parent window is not active");
- XDecoratedPeer wpeer = (XDecoratedPeer)ComponentAccessor.getPeer(ownerWindow);
+ XDecoratedPeer wpeer = (XDecoratedPeer)AWTAccessor.getComponentAccessor().getPeer(ownerWindow);
if (wpeer != null && wpeer.requestWindowFocus(this, time, timeProvided)) {
focusLog.fine("Parent window accepted focus request - generating focus for this window");
return true;
@@ -1747,12 +1836,49 @@
void setActualFocusedWindow(XWindowPeer actualFocusedWindow) {
}
+ /**
+ * Applies the current window type.
+ */
+ private void applyWindowType() {
+ XNETProtocol protocol = XWM.getWM().getNETProtocol();
+ if (protocol == null) {
+ return;
+ }
+
+ XAtom typeAtom = null;
+
+ switch (getWindowType())
+ {
+ case NORMAL:
+ typeAtom = protocol.XA_NET_WM_WINDOW_TYPE_NORMAL;
+ break;
+ case UTILITY:
+ typeAtom = protocol.XA_NET_WM_WINDOW_TYPE_UTILITY;
+ break;
+ case POPUP:
+ typeAtom = protocol.XA_NET_WM_WINDOW_TYPE_POPUP_MENU;
+ break;
+ }
+
+ if (typeAtom != null) {
+ XAtomList wtype = new XAtomList();
+ wtype.add(typeAtom);
+ protocol.XA_NET_WM_WINDOW_TYPE.
+ setAtomListProperty(getWindow(), wtype);
+ } else {
+ protocol.XA_NET_WM_WINDOW_TYPE.
+ DeleteProperty(getWindow());
+ }
+ }
+
+ @Override
public void xSetVisible(boolean visible) {
if (log.isLoggable(PlatformLogger.FINE)) log.fine("Setting visible on " + this + " to " + visible);
XToolkit.awtLock();
try {
this.visible = visible;
if (visible) {
+ applyWindowType();
XlibWrapper.XMapRaised(XToolkit.getDisplay(), getWindow());
} else {
XlibWrapper.XUnmapWindow(XToolkit.getDisplay(), getWindow());
@@ -2027,9 +2153,9 @@
if (toplevel != null) {
Window w = (Window)toplevel.target;
while (w != null && toplevel != this && !(toplevel instanceof XDialogPeer)) {
- w = (Window) ComponentAccessor.getParent_NoClientCode(w);
+ w = (Window) AWTAccessor.getComponentAccessor().getParent(w);
if (w != null) {
- toplevel = (XWindowPeer) ComponentAccessor.getPeer(w);
+ toplevel = (XWindowPeer) AWTAccessor.getComponentAccessor().getPeer(w);
}
}
if (w == null || (w != this.target && w instanceof Dialog)) {
--- a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Wed Dec 16 16:25:08 2009 -0800
@@ -353,6 +353,8 @@
static native String ServerVendor(long display);
static native int VendorRelease(long display);
static native boolean IsXsunKPBehavior(long display);
+ static native boolean IsSunKeyboard(long display);
+ static native boolean IsKanaKeyboard(long display);
static native void XBell(long display, int percent);
@@ -513,8 +515,9 @@
long keysym_uppercase);
static native long XGetModifierMapping(long display);
+ static native void XFreeModifiermap(long keymap);
+ static native void XRefreshKeyboardMapping(long event);
- static native void XFreeModifiermap(long keymap);
static native void XChangeActivePointerGrab(long display, int mask,
long cursor, long time);
--- a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Wed Dec 16 16:25:08 2009 -0800
@@ -107,6 +107,8 @@
tojava static Hashtable<Integer, Long> javaKeycode2KeysymHash = new Hashtable<Integer, Long>();
tojava static long keysym_lowercase = unsafe.allocateMemory(Native.getLongSize());
tojava static long keysym_uppercase = unsafe.allocateMemory(Native.getLongSize());
+tojava static Keysym2JavaKeycode kanaLock = new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KANA_LOCK,
+tojava java.awt.event.KeyEvent.KEY_LOCATION_STANDARD);
tojava private static PlatformLogger keyEventLog = PlatformLogger.getLogger("sun.awt.X11.kye.XKeysym");
tojava public static char convertKeysym( long ks, int state ) {
tojava
@@ -252,12 +254,35 @@
tojava }
tojava return keysym;
tojava }
+tojava
+tojava /**
+tojava Return java.awt.KeyEvent constant meaning (Java) keycode, derived from X keysym.
+tojava Some keysyms maps to more than one keycode, these would require extra processing.
+tojava */
+tojava static Keysym2JavaKeycode getJavaKeycode( long keysym ) {
+tojava if(keysym == XKeySymConstants.XK_Mode_switch){
+tojava /* XK_Mode_switch on solaris maps either to VK_ALT_GRAPH (default) or VK_KANA_LOCK */
+tojava if( XToolkit.isKanaKeyboard() ) {
+tojava return kanaLock;
+tojava }
+tojava }else if(keysym == XKeySymConstants.XK_L1){
+tojava /* if it is Sun keyboard, trick hash to return VK_STOP else VK_F11 (default) */
+tojava if( XToolkit.isSunKeyboard() ) {
+tojava keysym = XKeySymConstants.SunXK_Stop;
+tojava }
+tojava }else if(keysym == XKeySymConstants.XK_L2) {
+tojava /* if it is Sun keyboard, trick hash to return VK_AGAIN else VK_F12 (default) */
+tojava if( XToolkit.isSunKeyboard() ) {
+tojava keysym = XKeySymConstants.SunXK_Again;
+tojava }
+tojava }
+tojava
+tojava return keysym2JavaKeycodeHash.get( keysym );
+tojava }
tojava /**
tojava Return java.awt.KeyEvent constant meaning (Java) keycode, derived from X Window KeyEvent.
tojava Algorithm is, extract via XKeycodeToKeysym a proper keysym according to Xlib spec rules and
tojava err exceptions, then search a java keycode in a table.
-tojava Some keysyms maps to more than one keycode, these would require extra processing. If someone
-tojava points me to such a keysym.
tojava */
tojava static Keysym2JavaKeycode getJavaKeycode( XKeyEvent ev ) {
tojava // get from keysym2JavaKeycodeHash.
@@ -272,7 +297,7 @@
tojava keysym = xkeycode2keysym(ev, ndx);
tojava }
tojava
-tojava Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym );
+tojava Keysym2JavaKeycode jkc = getJavaKeycode( keysym );
tojava return jkc;
tojava }
tojava static int getJavaKeycodeOnly( XKeyEvent ev ) {
@@ -297,7 +322,7 @@
tojava ndx = 0;
tojava keysym = xkeycode2keysym_noxkb(ev, ndx);
tojava }
-tojava Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym );
+tojava Keysym2JavaKeycode jkc = getJavaKeycode( keysym );
tojava return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode();
tojava }
tojava static long javaKeycode2Keysym( int jkey ) {
--- a/jdk/src/solaris/lib/flavormap.properties Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/lib/flavormap.properties Wed Dec 16 16:25:08 2009 -0800
@@ -73,5 +73,6 @@
TEXT=text/plain;eoln="\n";terminators=0
STRING=text/plain;charset=iso8859-1;eoln="\n";terminators=0
FILE_NAME=application/x-java-file-list;class=java.util.List
+text/uri-list=application/x-java-file-list;class=java.util.List
PNG=image/x-java-image;class=java.awt.Image
JFIF=image/x-java-image;class=java.awt.Image
--- a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c Wed Dec 16 16:25:08 2009 -0800
@@ -33,6 +33,7 @@
#include <X11/extensions/shape.h>
#include <string.h>
#include <stdlib.h>
+#include <X11/Sunkeysym.h>
#include <jni.h>
#include <jni_util.h>
@@ -1214,6 +1215,48 @@
}
}
+
+JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsSunKeyboard
+(JNIEnv *env, jclass clazz, jlong display)
+{
+ int xx;
+ AWT_CHECK_HAVE_LOCK();
+ xx = XKeysymToKeycode((Display*)jlong_to_ptr(display), SunXK_F37);
+ return (!xx) ? JNI_FALSE : JNI_TRUE;
+}
+
+JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsKanaKeyboard
+(JNIEnv *env, jclass clazz, jlong display)
+{
+ int xx;
+ AWT_CHECK_HAVE_LOCK();
+ static jboolean result = JNI_FALSE;
+
+ int32_t minKeyCode, maxKeyCode, keySymsPerKeyCode;
+ KeySym *keySyms, *keySymsStart, keySym;
+ int32_t i;
+ int32_t kanaCount = 0;
+
+ // There's no direct way to determine whether the keyboard has
+ // a kana lock key. From available keyboard mapping tables, it looks
+ // like only keyboards with the kana lock key can produce keysyms
+ // for kana characters. So, as an indirect test, we check for those.
+ XDisplayKeycodes((Display*)jlong_to_ptr(display), &minKeyCode, &maxKeyCode);
+ keySyms = XGetKeyboardMapping((Display*)jlong_to_ptr(display), minKeyCode, maxKeyCode - minKeyCode + 1, &keySymsPerKeyCode);
+ keySymsStart = keySyms;
+ for (i = 0; i < (maxKeyCode - minKeyCode + 1) * keySymsPerKeyCode; i++) {
+ keySym = *keySyms++;
+ if ((keySym & 0xff00) == 0x0400) {
+ kanaCount++;
+ }
+ }
+ XFree(keySymsStart);
+
+ // use a (somewhat arbitrary) minimum so we don't get confused by a stray function key
+ result = kanaCount > 10;
+ return result ? JNI_TRUE : JNI_FALSE;
+}
+
JavaVM* jvm = NULL;
static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {
if (jvm != NULL) {
@@ -1261,6 +1304,7 @@
return (*(XErrorHandler)jlong_to_ptr(handler))((Display*) jlong_to_ptr(display), (XErrorEvent*) jlong_to_ptr(event_ptr));
}
+
/*
* Class: sun_awt_X11_XlibWrapper
* Method: PrintXErrorEvent
@@ -1853,6 +1897,17 @@
AWT_CHECK_HAVE_LOCK();
XFreeModifiermap((XModifierKeymap*) jlong_to_ptr(keymap));
}
+/*
+ * Class: sun_awt_X11_XlibWrapper
+ * Method: XRefreshKeyboardMapping
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRefreshKeyboardMapping
+(JNIEnv *env, jclass clazz, jlong event_ptr)
+{
+ AWT_CHECK_HAVE_LOCK();
+ XRefreshKeyboardMapping((XMappingEvent*) jlong_to_ptr(event_ptr));
+}
JNIEXPORT void JNICALL
Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab(JNIEnv *env, jclass clazz,
--- a/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -28,8 +28,6 @@
import java.awt.peer.*;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
-import sun.awt.AWTAccessor;
-import sun.awt.ComponentAccessor;
import sun.awt.SunToolkit;
import sun.awt.Win32GraphicsDevice;
import sun.awt.PaintEventDispatcher;
--- a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -57,7 +57,7 @@
import java.awt.dnd.DropTarget;
import java.awt.dnd.peer.DropTargetPeer;
-import sun.awt.ComponentAccessor;
+import sun.awt.AWTAccessor;
import sun.util.logging.PlatformLogger;
@@ -817,7 +817,7 @@
}
private void postPaintIfNecessary(int x, int y, int w, int h) {
- if ( !ComponentAccessor.getIgnoreRepaint( (Component) target) ) {
+ if ( !AWTAccessor.getComponentAccessor().getIgnoreRepaint( (Component) target) ) {
PaintEvent event = PaintEventDispatcher.getPaintEventDispatcher().
createPaintEvent((Component)target, x, y, w, h);
if (event != null) {
--- a/jdk/src/windows/classes/sun/awt/windows/WDataTransferer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/classes/sun/awt/windows/WDataTransferer.java Wed Dec 16 16:25:08 2009 -0800
@@ -72,6 +72,10 @@
import sun.awt.image.ImageRepresentation;
import sun.awt.image.ToolkitImage;
+import java.util.ArrayList;
+
+import java.io.ByteArrayOutputStream;
+
/**
* Platform-specific support for the data transfer subsystem.
*
@@ -342,6 +346,33 @@
return imageDataToPlatformImageBytes(imageData, width, height, format);
}
+ private static final byte [] UNICODE_NULL_TERMINATOR = new byte [] {0,0};
+
+ protected ByteArrayOutputStream convertFileListToBytes(ArrayList<String> fileList)
+ throws IOException
+ {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+
+ if(fileList.isEmpty()) {
+ //store empty unicode string (null terminator)
+ bos.write(UNICODE_NULL_TERMINATOR);
+ } else {
+ for (int i = 0; i < fileList.size(); i++) {
+ byte[] bytes = fileList.get(i).getBytes(getDefaultUnicodeEncoding());
+ //store unicode string with null terminator
+ bos.write(bytes, 0, bytes.length);
+ bos.write(UNICODE_NULL_TERMINATOR);
+ }
+ }
+
+ // According to MSDN the byte array have to be double NULL-terminated.
+ // The array contains Unicode characters, so each NULL-terminator is
+ // a pair of bytes
+
+ bos.write(UNICODE_NULL_TERMINATOR);
+ return bos;
+ }
+
/**
* Returns a byte array which contains data special for the given format
* and for the given image data.
--- a/jdk/src/windows/classes/sun/awt/windows/WDialogPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/classes/sun/awt/windows/WDialogPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -53,7 +53,12 @@
}
}
- native void create(WComponentPeer parent);
+ native void createAwtDialog(WComponentPeer parent);
+ void create(WComponentPeer parent) {
+ preCreate(parent);
+ createAwtDialog(parent);
+ }
+
native void showModal();
native void endModal();
@@ -93,7 +98,7 @@
public void blockWindows(java.util.List<Window> toBlock) {
for (Window w : toBlock) {
- WWindowPeer wp = (WWindowPeer)ComponentAccessor.getPeer(w);
+ WWindowPeer wp = (WWindowPeer)AWTAccessor.getComponentAccessor().getPeer(w);
if (wp != null) {
wp.setModalBlocked((Dialog)target, true);
}
--- a/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -35,7 +35,7 @@
import java.util.MissingResourceException;
import java.util.Vector;
import sun.awt.AppContext;
-import sun.awt.ComponentAccessor;
+import sun.awt.AWTAccessor;
public class WFileDialogPeer extends WWindowPeer implements FileDialogPeer {
@@ -187,7 +187,7 @@
public void blockWindows(java.util.List<Window> toBlock) {
for (Window w : toBlock) {
- WWindowPeer wp = (WWindowPeer)ComponentAccessor.getPeer(w);
+ WWindowPeer wp = (WWindowPeer)AWTAccessor.getComponentAccessor().getPeer(w);
if (wp != null) {
blockWindow(wp);
}
--- a/jdk/src/windows/classes/sun/awt/windows/WFramePeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/classes/sun/awt/windows/WFramePeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -136,6 +136,7 @@
native void createAwtFrame(WComponentPeer parent);
void create(WComponentPeer parent) {
+ preCreate(parent);
createAwtFrame(parent);
}
--- a/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -31,7 +31,7 @@
import java.awt.dnd.DropTarget;
import java.util.Vector;
import sun.awt.AppContext;
-import sun.awt.ComponentAccessor;
+import sun.awt.AWTAccessor;
public class WPrintDialogPeer extends WWindowPeer implements DialogPeer {
@@ -103,7 +103,7 @@
public void blockWindows(java.util.List<Window> toBlock) {
for (Window w : toBlock) {
- WWindowPeer wp = (WWindowPeer)ComponentAccessor.getPeer(w);
+ WWindowPeer wp = (WWindowPeer)AWTAccessor.getComponentAccessor().getPeer(w);
if (wp != null) {
blockWindow(wp);
}
--- a/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Wed Dec 16 16:25:08 2009 -0800
@@ -199,7 +199,17 @@
}
native void createAwtWindow(WComponentPeer parent);
+
+ private volatile Window.Type windowType = Window.Type.NORMAL;
+
+ // This method must be called for Window, Dialog, and Frame before creating
+ // the hwnd
+ void preCreate(WComponentPeer parent) {
+ windowType = ((Window)target).getType();
+ }
+
void create(WComponentPeer parent) {
+ preCreate(parent);
createAwtWindow(parent);
}
--- a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Wed Dec 16 16:25:08 2009 -0800
@@ -760,7 +760,7 @@
* Signature: (Lsun/awt/windows/WComponentPeer;)V
*/
JNIEXPORT void JNICALL
-Java_sun_awt_windows_WDialogPeer_create(JNIEnv *env, jobject self,
+Java_sun_awt_windows_WDialogPeer_createAwtDialog(JNIEnv *env, jobject self,
jobject parent)
{
TRY;
--- a/jdk/src/windows/native/sun/windows/awt_DnDDS.cpp Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/native/sun/windows/awt_DnDDS.cpp Wed Dec 16 16:25:08 2009 -0800
@@ -648,7 +648,7 @@
dropfiles->pt.x = m_dropPoint.x;
dropfiles->pt.y = m_dropPoint.y;
dropfiles->fNC = m_fNC;
- dropfiles->fWide = FALSE; // good guess!
+ dropfiles->fWide = TRUE; // good guess!
dataout += sizeof(DROPFILES);
}
@@ -815,7 +815,7 @@
dropfiles->pt.x = m_dropPoint.x;
dropfiles->pt.y = m_dropPoint.y;
dropfiles->fNC = m_fNC;
- dropfiles->fWide = FALSE; // good guess!
+ dropfiles->fWide = TRUE; // good guess!
dataout += sizeof(DROPFILES);
}
--- a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Wed Dec 16 16:25:08 2009 -0800
@@ -1518,6 +1518,7 @@
return defaultIconSm;
}
+// The icon at index 0 must be gray. See AwtWindow::GetSecurityWarningIcon()
HICON AwtToolkit::GetSecurityWarningIcon(UINT index, UINT w, UINT h)
{
//Note: should not exceed 10 because of the current implementation.
--- a/jdk/src/windows/native/sun/windows/awt_Window.cpp Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp Wed Dec 16 16:25:08 2009 -0800
@@ -163,9 +163,11 @@
jfieldID AwtWindow::sysYID;
jfieldID AwtWindow::sysWID;
jfieldID AwtWindow::sysHID;
+jfieldID AwtWindow::windowTypeID;
jmethodID AwtWindow::getWarningStringMID;
jmethodID AwtWindow::calculateSecurityWarningPositionMID;
+jmethodID AwtWindow::windowTypeNameMID;
int AwtWindow::ms_instanceCounter = 0;
HHOOK AwtWindow::ms_hCBTFilter;
@@ -216,6 +218,9 @@
hContentBitmap = NULL;
::InitializeCriticalSection(&contentBitmapCS);
+
+ m_windowType = Type::NORMAL;
+ m_alwaysOnTop = false;
}
AwtWindow::~AwtWindow()
@@ -348,10 +353,10 @@
RECT rect;
CalculateWarningWindowBounds(env, &rect);
- ::SetWindowPos(warningWindow, HWND_NOTOPMOST,
+ ::SetWindowPos(warningWindow, IsAlwaysOnTop() ? HWND_TOPMOST : GetHWnd(),
rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
- SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOZORDER |
+ SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE |
SWP_NOOWNERZORDER
);
}
@@ -475,6 +480,9 @@
}
env->DeleteLocalRef(target);
+ InitType(env, peer);
+ TweakStyle(windowStyle, windowExStyle);
+
AwtCanvas::CreateHWnd(env, title,
windowStyle,
windowExStyle,
@@ -645,7 +653,10 @@
HICON AwtWindow::GetSecurityWarningIcon()
{
- HICON ico = AwtToolkit::GetInstance().GetSecurityWarningIcon(securityWarningAnimationStage,
+ // It is assumed that the icon at index 0 is gray
+ const UINT index = securityAnimationKind == akShow ?
+ securityWarningAnimationStage : 0;
+ HICON ico = AwtToolkit::GetInstance().GetSecurityWarningIcon(index,
warningWindowWidth, warningWindowHeight);
return ico;
}
@@ -821,7 +832,9 @@
securityAnimationTimerElapse, NULL);
if (securityAnimationKind == akShow) {
- ::SetWindowPos(warningWindow, HWND_NOTOPMOST, 0, 0, 0, 0,
+ ::SetWindowPos(warningWindow,
+ IsAlwaysOnTop() ? HWND_TOPMOST : GetHWnd(),
+ 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE |
SWP_SHOWWINDOW | SWP_NOOWNERZORDER);
@@ -982,6 +995,50 @@
delete rsws;
}
+void AwtWindow::InitType(JNIEnv *env, jobject peer)
+{
+ jobject type = env->GetObjectField(peer, windowTypeID);
+ if (type == NULL) {
+ return;
+ }
+
+ jstring value = (jstring)env->CallObjectMethod(type, windowTypeNameMID);
+ if (value == NULL) {
+ env->DeleteLocalRef(type);
+ return;
+ }
+
+ const char* valueNative = env->GetStringUTFChars(value, 0);
+ if (valueNative == NULL) {
+ env->DeleteLocalRef(value);
+ env->DeleteLocalRef(type);
+ return;
+ }
+
+ if (strcmp(valueNative, "UTILITY") == 0) {
+ m_windowType = Type::UTILITY;
+ } else if (strcmp(valueNative, "POPUP") == 0) {
+ m_windowType = Type::POPUP;
+ }
+
+ env->ReleaseStringUTFChars(value, valueNative);
+ env->DeleteLocalRef(value);
+ env->DeleteLocalRef(type);
+}
+
+void AwtWindow::TweakStyle(DWORD & style, DWORD & exStyle)
+{
+ switch (GetType()) {
+ case Type::UTILITY:
+ exStyle |= WS_EX_TOOLWINDOW;
+ break;
+ case Type::POPUP:
+ style &= ~WS_OVERLAPPED;
+ style |= WS_POPUP;
+ break;
+ }
+}
+
/* Create a new AwtWindow object and window. */
AwtWindow* AwtWindow::Create(jobject self, jobject parent)
{
@@ -2216,6 +2273,7 @@
if (::IsWindow(w->GetHWnd()))
{
w->SendMessage(WM_AWT_SETALWAYSONTOP, (WPARAM)value, (LPARAM)w);
+ w->m_alwaysOnTop = (bool)value;
}
ret:
env->DeleteGlobalRef(self);
@@ -3008,6 +3066,11 @@
AwtWindow::calculateSecurityWarningPositionMID =
env->GetMethodID(cls, "calculateSecurityWarningPosition", "(DDDD)Ljava/awt/geom/Point2D;");
+ jclass windowTypeClass = env->FindClass("java/awt/Window$Type");
+ AwtWindow::windowTypeNameMID =
+ env->GetMethodID(windowTypeClass, "name", "()Ljava/lang/String;");
+ env->DeleteLocalRef(windowTypeClass);
+
CATCH_BAD_ALLOC;
}
@@ -3035,6 +3098,9 @@
AwtWindow::sysWID = env->GetFieldID(cls, "sysW", "I");
AwtWindow::sysHID = env->GetFieldID(cls, "sysH", "I");
+ AwtWindow::windowTypeID = env->GetFieldID(cls, "windowType",
+ "Ljava/awt/Window$Type;");
+
CATCH_BAD_ALLOC;
}
--- a/jdk/src/windows/native/sun/windows/awt_Window.h Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/src/windows/native/sun/windows/awt_Window.h Wed Dec 16 16:25:08 2009 -0800
@@ -63,8 +63,11 @@
static jfieldID sysWID;
static jfieldID sysHID;
+ static jfieldID windowTypeID;
+
static jmethodID getWarningStringMID;
static jmethodID calculateSecurityWarningPositionMID;
+ static jmethodID windowTypeNameMID;
AwtWindow();
virtual ~AwtWindow();
@@ -362,10 +365,28 @@
void EnableTranslucency(BOOL enable);
+ // Native representation of the java.awt.Window.Type enum
+ enum Type {
+ NORMAL, UTILITY, POPUP
+ };
+
+ inline Type GetType() { return m_windowType; }
+
private:
int m_screenNum;
void InitOwner(AwtWindow *owner);
+
+ Type m_windowType;
+ void InitType(JNIEnv *env, jobject peer);
+
+ // Tweak the style according to the type of the window
+ void TweakStyle(DWORD & style, DWORD & exStyle);
+
+ // Set in _SetAlwaysOnTop()
+ bool m_alwaysOnTop;
+public:
+ inline bool IsAlwaysOnTop() { return m_alwaysOnTop; }
};
#endif /* AWT_WINDOW_H */
--- a/jdk/test/Makefile Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/Makefile Wed Dec 16 16:25:08 2009 -0800
@@ -282,11 +282,23 @@
RUNLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/runlist.txt
PASSLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/passlist.txt
FAILLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/faillist.txt
+EXITCODE = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/exitcode.txt
+
+TESTEXIT = \
+ if [ ! -s $(EXITCODE) ] ; then \
+ $(ECHO) "ERROR: EXITCODE file not filled in."; \
+ $(ECHO) "1" > $(EXITCODE); \
+ fi ; \
+ testExitCode=`$(CAT) $(EXITCODE)`; \
+ $(ECHO) "EXIT CODE: $${testExitCode}"; \
+ exit ${testExitCode}
+
BUNDLE_UP_AND_EXIT = \
( \
- exitCode=$$? && \
+ jtregExitCode=$$? && \
_summary="$(SUMMARY_TXT)"; \
- $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST); \
+ $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \
+ $(ECHO) "$${jtregExitCode}" > $(EXITCODE); \
if [ -r "$${_summary}" ] ; then \
$(ECHO) "Summary: $${_summary}" > $(STATS_TXT); \
$(EXPAND) $${_summary} | $(EGREP) -v ' Not run\.' > $(RUNLIST); \
@@ -297,10 +309,13 @@
$(EGREP) ' Error\.' $(RUNLIST); \
$(EGREP) -v ' Passed\.' $(RUNLIST) ) \
| $(SORT) | $(UNIQ) > $(FAILLIST); \
- if [ $${exitCode} != 0 -o -s $(FAILLIST) ] ; then \
+ if [ $${jtregExitCode} != 0 -o -s $(FAILLIST) ] ; then \
$(EXPAND) $(FAILLIST) \
| $(CUT) -d' ' -f1 \
| $(SED) -e 's@^@FAILED: @' >> $(STATS_TXT); \
+ if [ $${jtregExitCode} = 0 ] ; then \
+ jtregExitCode=1; \
+ fi; \
fi; \
runc="`$(CAT) $(RUNLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \
passc="`$(CAT) $(PASSLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \
@@ -312,8 +327,8 @@
$(ECHO) "Missing file: $${_summary}" >> $(STATS_TXT); \
fi; \
$(CAT) $(STATS_TXT); \
- $(ZIP_UP_RESULTS) && $(KILL_DISPLAY) && \
- exit $${exitCode} \
+ $(ZIP_UP_RESULTS) && $(KILL_DISPLAY) ; \
+ $(TESTEXIT) \
)
################################################################
@@ -337,9 +352,11 @@
# jtreg tests
# Expect JT_HOME to be set for jtreg tests. (home for jtreg)
-JT_HOME = $(SLASH_JAVA)/re/jtreg/4.0/promoted/latest/binaries/jtreg
-ifdef JPRT_JTREG_HOME
- JT_HOME = $(JPRT_JTREG_HOME)
+ifndef JT_HOME
+ JT_HOME = $(SLASH_JAVA)/re/jtreg/4.0/promoted/latest/binaries/jtreg
+ ifdef JPRT_JTREG_HOME
+ JT_HOME = $(JPRT_JTREG_HOME)
+ endif
endif
# Expect JPRT to set TESTDIRS to the jtreg test dirs
@@ -361,21 +378,22 @@
# Some tests annoy me and fail frequently
PROBLEM_LIST=ProblemList.txt
+PROBLEM_LISTS=$(PROBLEM_LIST) $(wildcard closed/$(PROBLEM_LIST))
EXCLUDELIST=$(ABS_TEST_OUTPUT_DIR)/excludelist.txt
# Create exclude list for this platform and arch
ifdef NO_EXCLUDES
-$(EXCLUDELIST): $(PROBLEM_LIST) $(TESTDIRS)
+$(EXCLUDELIST): $(PROBLEM_LISTS) $(TESTDIRS)
@$(ECHO) "NOTHING_EXCLUDED" > $@
else
-$(EXCLUDELIST): $(PROBLEM_LIST) $(TESTDIRS)
+$(EXCLUDELIST): $(PROBLEM_LISTS) $(TESTDIRS)
@$(RM) $@ $@.temp1 $@.temp2
- @( ( $(EGREP) -- '$(OS_NAME)-all' $< ) ;\
- ( $(EGREP) -- '$(OS_NAME)-$(OS_ARCH)' $< ) ;\
- ( $(EGREP) -- '$(OS_NAME)-$(OS_VERSION)' $< ) ;\
- ( $(EGREP) -- 'generic-$(OS_ARCH)' $< ) ;\
- ( $(EGREP) -- 'generic-all' $< ) ;\
- ( $(ECHO) "#") ;\
+ @(($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- '$(OS_NAME)-all' ) ;\
+ ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- '$(OS_NAME)-$(OS_ARCH)' ) ;\
+ ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- '$(OS_NAME)-$(OS_VERSION)') ;\
+ ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- 'generic-$(OS_ARCH)' ) ;\
+ ($(CAT) $(PROBLEM_LISTS) | $(EGREP) -- 'generic-all' ) ;\
+ ($(ECHO) "#") ;\
) | $(SED) -e 's@^[\ ]*@@' \
| $(EGREP) -v '^#' > $@.temp1
@for tdir in $(TESTDIRS) ; do \
@@ -386,14 +404,18 @@
@$(ECHO) "Excluding list contains `$(EXPAND) $@ | $(WC) -l` items"
endif
+# Select list of directories that exist
+define TestDirs
+$(foreach i,$1,$(wildcard ${i})) $(foreach i,$1,$(wildcard closed/${i}))
+endef
# Running batches of tests with or without samevm
define RunSamevmBatch
-$(ECHO) "Running tests in samevm mode: $?"
-$(MAKE) TESTDIRS="$?" USE_JTREG_SAMEVM=true UNIQUE_DIR=$@ jtreg_tests
+$(ECHO) "Running tests in samevm mode: $(call TestDirs, $?)"
+$(MAKE) TESTDIRS="$(call TestDirs, $?)" USE_JTREG_SAMEVM=true UNIQUE_DIR=$@ jtreg_tests
endef
define RunOthervmBatch
-$(ECHO) "Running tests in othervm mode: $?"
-$(MAKE) TESTDIRS="$?" USE_JTREG_SAMEVM=false UNIQUE_DIR=$@ jtreg_tests
+$(ECHO) "Running tests in othervm mode: $(call TestDirs, $?)"
+$(MAKE) TESTDIRS="$(call TestDirs, $?)" USE_JTREG_SAMEVM=false UNIQUE_DIR=$@ jtreg_tests
endef
define SummaryInfo
$(ECHO) "Summary for: $?"
@@ -428,6 +450,9 @@
jdk_beans3: java/beans/XMLEncoder
$(call RunOthervmBatch)
+jdk_beans: jdk_beans1 jdk_beans2 jdk_beans3
+ @$(SummaryInfo)
+
# Stable samevm testruns (minus items from PROBLEM_LIST)
JDK_ALL_TARGETS += jdk_io
jdk_io: java/io
@@ -450,6 +475,9 @@
jdk_management2: com/sun/jmx com/sun/management sun/management
$(call RunOthervmBatch)
+jdk_management: jdk_management1 jdk_management2
+ @$(SummaryInfo)
+
# Stable samevm testruns (minus items from PROBLEM_LIST)
JDK_ALL_TARGETS += jdk_math
jdk_math: java/math
@@ -482,6 +510,9 @@
jdk_nio3: com/sun/nio sun/nio
$(call RunOthervmBatch)
+jdk_nio: jdk_nio1 jdk_nio2 jdk_nio3
+ @$(SummaryInfo)
+
# Stable othervm testruns (minus items from PROBLEM_LIST)
# Using samevm has serious problems with these tests
JDK_ALL_TARGETS += jdk_rmi
@@ -502,6 +533,9 @@
jdk_security3: com/sun/security lib/security javax/security sun/security
$(call RunOthervmBatch)
+jdk_security: jdk_security1 jdk_security2 jdk_security3
+ @$(SummaryInfo)
+
# Stable othervm testruns (minus items from PROBLEM_LIST)
# Using samevm has problems, and doesn't help performance as much as others.
JDK_ALL_TARGETS += jdk_swing
@@ -517,11 +551,14 @@
# Using samevm has serious problems with these tests
JDK_ALL_TARGETS += jdk_tools1
jdk_tools1: com/sun/jdi
- $(call RunOthervmBatch)
+ $(call RunSamevmBatch)
JDK_ALL_TARGETS += jdk_tools2
jdk_tools2: com/sun/tools sun/jvmstat sun/tools tools vm com/sun/servicetag com/sun/tracing
$(call RunOthervmBatch)
+jdk_tools: jdk_tools1 jdk_tools2
+ @$(SummaryInfo)
+
# Stable samevm testruns (minus items from PROBLEM_LIST)
JDK_ALL_TARGETS += jdk_util
jdk_util: java/util sun/util
@@ -576,7 +613,7 @@
$(JTREG_TEST_OPTIONS) \
$(TESTDIRS) \
) ; $(BUNDLE_UP_AND_EXIT) \
- ) 2>&1 | $(TEE) $(ABS_TEST_OUTPUT_DIR)/output.txt
+ ) 2>&1 | $(TEE) $(ABS_TEST_OUTPUT_DIR)/output.txt ; $(TESTEXIT)
PHONY_LIST += jtreg_tests
--- a/jdk/test/ProblemList.txt Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/ProblemList.txt Wed Dec 16 16:25:08 2009 -0800
@@ -344,6 +344,9 @@
# Some of these tests (like java/lang/management) may just need to be marked
# othervm, but that is partially speculation.
+# Samevm failure on OpenSolaris, security manager?
+java/lang/ClassLoader/UninitializedParent.java generic-all
+
# Times out on solaris 10 sparc
java/lang/ClassLoader/Assert.java generic-all
@@ -538,6 +541,18 @@
# Missing close on file wbmp*, windows samevm
javax/imageio/plugins/wbmp/CanDecodeTest.java generic-all
+# Failures on OpenSolaris, cannot read input files? samevm issues?
+javax/imageio/metadata/BooleanAttributes.java generic-all
+javax/imageio/plugins/bmp/BMPSubsamplingTest.java generic-all
+javax/imageio/plugins/bmp/TopDownTest.java generic-all
+javax/imageio/plugins/gif/EncodeSubImageTest.java generic-all
+javax/imageio/plugins/gif/GifTransparencyTest.java generic-all
+javax/imageio/plugins/png/GrayPngTest.java generic-all
+javax/imageio/plugins/png/ItxtUtf8Test.java generic-all
+javax/imageio/plugins/png/MergeStdCommentTest.java generic-all
+javax/imageio/plugins/png/ShortHistogramTest.java generic-all
+javax/imageio/plugins/shared/BitDepth.java generic-all
+
# Exclude all javax/print tests, even if they passed, they may need samevm work
# Times out on solaris-sparc, sparcv9, x64 -server, some on i586 -client
@@ -1073,9 +1088,6 @@
# So most if not all tools tests are now being run with "othervm" mode.
# Some of these tools tests have a tendency to use fixed ports, bad idea.
-# Solaris 10 client x86, java.lang.IndexOutOfBoundsException resumer Interrupted
-com/sun/jdi/SimulResumerTest.java generic-all
-
# Output of jps differs from expected output.
# Invalid argument count on solaris-sparc and x64
sun/tools/jstatd/jstatdPort.sh generic-all
@@ -1087,12 +1099,17 @@
sun/tools/jps/jps-Vvml_2.sh generic-all
sun/tools/jps/jps-m_2.sh generic-all
+# Fails on OpenSolaris "Could not synchronize with target"
+sun/tools/jps/jps-Defaults.sh generic-all
+sun/tools/jps/jps-V_2.sh generic-all
+sun/tools/jps/jps-Vm_2.sh generic-all
+sun/tools/jps/jps-Vvm.sh generic-all
+sun/tools/jps/jps-Vvml.sh generic-all
+sun/tools/jps/jps-m.sh generic-all
+
# Server name error, port 2098 problem?
sun/tools/jstatd/jstatdServerName.sh generic-all
-# Solaris, handshake failed, othervm mode
-com/sun/jdi/RedefineException.sh generic-all
-
# These tests fail on solaris sparc, all the time
com/sun/servicetag/DeleteServiceTag.java generic-all
com/sun/servicetag/DuplicateNotFound.java generic-all
@@ -1117,9 +1134,6 @@
# Unexpected Monitor Exception, solaris sparc -client
sun/jvmstat/monitor/MonitoredVm/MonitorVmStartTerminate.sh generic-all
-# Probably should be samevm, but seem to cause errors even in othervm at times
-sun/tools/jhat/HatHeapDump1Test.java generic-all
-
# Problems on windows, jmap.exe hangs? (these run jmap)
sun/tools/jmap/Basic.sh windows-all
@@ -1129,9 +1143,6 @@
# Solaris sparcv9, jps output does not match, x64 different
sun/tools/jstatd/jstatdExternalRegistry.sh solaris-all
-# Probably should be samevm, but seem to cause errors even in othervm at times
-sun/tools/native2ascii/NativeErrors.java generic-all
-
# Solaris 10 sparc 32bit -client, java.lang.AssertionError: Some tests failed
tools/jar/JarEntryTime.java generic-all
--- a/jdk/test/com/sun/jdi/BadHandshakeTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/BadHandshakeTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -110,8 +110,11 @@
String exe = System.getProperty("java.home")
+ File.separator + "bin" + File.separator;
String arch = System.getProperty("os.arch");
- if (arch.equals("sparcv9")) {
+ String osname = System.getProperty("os.name");
+ if (osname.equals("SunOS") && arch.equals("sparcv9")) {
exe += "sparcv9/java";
+ } else if (osname.equals("SunOS") && arch.equals("amd64")) {
+ exe += "amd64/java";
} else {
exe += "java";
}
--- a/jdk/test/com/sun/jdi/DoubleAgentTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/DoubleAgentTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -92,8 +92,11 @@
String exe = System.getProperty("java.home")
+ File.separator + "bin" + File.separator;
String arch = System.getProperty("os.arch");
- if (arch.equals("sparcv9")) {
+ String osname = System.getProperty("os.name");
+ if (osname.equals("SunOS") && arch.equals("sparcv9")) {
exe += "sparcv9/java";
+ } else if (osname.equals("SunOS") && arch.equals("amd64")) {
+ exe += "amd64/java";
} else {
exe += "java";
}
--- a/jdk/test/com/sun/jdi/ExclusiveBind.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/ExclusiveBind.java Wed Dec 16 16:25:08 2009 -0800
@@ -99,8 +99,11 @@
String exe = System.getProperty("java.home") + File.separator + "bin" +
File.separator;
String arch = System.getProperty("os.arch");
- if (arch.equals("sparcv9")) {
+ String osname = System.getProperty("os.name");
+ if (osname.equals("SunOS") && arch.equals("sparcv9")) {
exe += "sparcv9/java";
+ } else if (osname.equals("SunOS") && arch.equals("amd64")) {
+ exe += "amd64/java";
} else {
exe += "java";
}
--- a/jdk/test/com/sun/jdi/JITDebug.sh Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/JITDebug.sh Wed Dec 16 16:25:08 2009 -0800
@@ -103,10 +103,10 @@
#if running standalone (no test harness of any kind), compile the
#support files and the test case
${TESTJAVA}/bin/javac -d ${TESTCLASSES} \
- -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}." \
+ -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}${TESTSRC}" \
TestScaffold.java VMConnection.java TargetListener.java TargetAdapter.java
${TESTJAVA}/bin/javac -d ${TESTCLASSES} \
- -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}." -g \
+ -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}${TESTSRC}" -g \
JITDebug.java
fi
echo "JDK under test is: $TESTJAVA"
--- a/jdk/test/com/sun/jdi/RepStep.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/RepStep.java Wed Dec 16 16:25:08 2009 -0800
@@ -29,7 +29,7 @@
* @run compile -g RepStepTarg.java
* @run build VMConnection RepStep
*
- * @run main RepStep
+ * @run main/othervm RepStep
*
* @summary RepStep detects missed step events due to lack of
* frame pop events (in back-end).
--- a/jdk/test/com/sun/jdi/RunToExit.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/RunToExit.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @summary Test that with server=y, when VM runs to System.exit() no error happens
*
* @build VMConnection RunToExit Exit0
- * @run main RunToExit
+ * @run main/othervm RunToExit
*/
import java.io.InputStream;
import java.io.IOException;
@@ -115,8 +115,11 @@
String exe = System.getProperty("java.home")
+ File.separator + "bin" + File.separator;
String arch = System.getProperty("os.arch");
- if (arch.equals("sparcv9")) {
+ String osname = System.getProperty("os.name");
+ if (osname.equals("SunOS") && arch.equals("sparcv9")) {
exe += "sparcv9/java";
+ } else if (osname.equals("SunOS") && arch.equals("amd64")) {
+ exe += "amd64/java";
} else {
exe += "java";
}
--- a/jdk/test/com/sun/jdi/ShellScaffold.sh Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/ShellScaffold.sh Wed Dec 16 16:25:08 2009 -0800
@@ -1,7 +1,7 @@
#!/bin/sh
#
-# Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved.
+# Copyright 2002-2009 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -194,7 +194,7 @@
# Return 0 if $1 is the pid of a running process.
if [ -z "$isWin98" ] ; then
if [ "$osname" = SunOS ] ; then
- #Solaris and OpenSolaris use pgrep and not ps in psCmd
+ # Solaris and OpenSolaris use pgrep and not ps in psCmd
findPidCmd="$psCmd"
else
# Never use plain 'ps', which requires a "controlling terminal"
@@ -298,15 +298,15 @@
# On linux, core files take a long time, and can leave
# zombie processes
if [ "$osname" = SunOS ] ; then
- #Experiments show Solaris '/usr/ucb/ps -axwww' and
- #'/usr/bin/pgrep -f -l' provide the same small amount of the
- #argv string (PRARGSZ=80 in /usr/include/sys/procfs.h)
- # 1) This seems to have been working OK in ShellScaffold.
- # 2) OpenSolaris does not provide /usr/ucb/ps, so use pgrep
- # instead
- #The alternative would be to use /usr/bin/pargs [pid] to get
- #all the args for a process, splice them back into one
- #long string, then grep.
+ # Experiments show Solaris '/usr/ucb/ps -axwww' and
+ # '/usr/bin/pgrep -f -l' provide the same small amount of the
+ # argv string (PRARGSZ=80 in /usr/include/sys/procfs.h)
+ # 1) This seems to have been working OK in ShellScaffold.
+ # 2) OpenSolaris does not provide /usr/ucb/ps, so use pgrep
+ # instead
+ # The alternative would be to use /usr/bin/pargs [pid] to get
+ # all the args for a process, splice them back into one
+ # long string, then grep.
UU=`/usr/xpg4/bin/id -u -n`
psCmd="pgrep -f -l -U $UU"
else
@@ -519,7 +519,7 @@
# if jdb got a cont cmd that caused the debuggee
# to run to completion, jdb can be gone before
# we get here.
- echo quit >& 2
+ echo "--Sending cmd: quit" >& 2
echo quit
# See 6562090. Maybe there is a way that the exit
# can cause jdb to not get the quit.
@@ -531,7 +531,7 @@
# because after starting jdb, we waited
# for the prompt.
fileSize=`wc -c $jdbOutFile | awk '{ print $1 }'`
- echo $* >&2
+ echo "--Sending cmd: " $* >&2
# jjh: We have a few intermittent failures here.
# It is as if every so often, jdb doesn't
@@ -558,12 +558,85 @@
# seen the ].
echo $*
- # wait for jdb output to appear
+ # Now we have to wait for the next jdb prompt. We wait for a pattern
+ # to appear in the last line of jdb output. Normally, the prompt is
+ #
+ # 1) ^main[89] @
+ #
+ # where ^ means start of line, and @ means end of file with no end of line
+ # and 89 is the current command counter. But we have complications e.g.,
+ # the following jdb output can appear:
+ #
+ # 2) a[89] = 10
+ #
+ # The above form is an array assignment and not a prompt.
+ #
+ # 3) ^main[89] main[89] ...
+ #
+ # This occurs if the next cmd is one that causes no jdb output, e.g.,
+ # 'trace methods'.
+ #
+ # 4) ^main[89] [main[89]] .... > @
+ #
+ # jdb prints a > as a prompt after something like a cont.
+ # Thus, even though the above is the last 'line' in the file, it
+ # isn't the next prompt we are waiting for after the cont completes.
+ # HOWEVER, sometimes we see this for a cont command:
+ #
+ # ^main[89] $
+ # <lines output for hitting a bkpt>
+ #
+ # 5) ^main[89] > @
+ #
+ # i.e., the > prompt comes out AFTER the prompt we we need to wait for.
+ #
+ # So, how do we know when the next prompt has appeared??
+ # 1. Search for
+ # main[89] $
+ # This will handle cases 1, 2, 3
+ # 2. This leaves cases 4 and 5.
+ #
+ # What if we wait for 4 more chars to appear and then search for
+ #
+ # main[89] [>]$
+ #
+ # on the last line?
+ #
+ # a. if we are currently at
+ #
+ # ^main[89] main[89] @
+ #
+ # and a 'trace methods comes in, we will wait until at least
+ #
+ # ^main[89] main[89] main@
+ #
+ # and then the search will find the new prompt when it completes.
+ #
+ # b. if we are currently at
+ #
+ # ^main[89] main[89] @
+ #
+ # and the first form of cont comes in, then we will see
+ #
+ # ^main[89] main[89] > $
+ # ^x@
+ #
+ # where x is the first char of the msg output when the bkpt is hit
+ # and we will start our search, which will find the prompt
+ # when it comes out after the bkpt output, with or without the
+ # trailing >
+ #
+
+ # wait for 4 new chars to appear in the jdb output
count=0
+ desiredFileSize=`expr $fileSize + 4`
msg1=`echo At start: cmd/size/waiting : $* / $fileSize / \`date\``
while [ 1 = 1 ] ; do
newFileSize=`wc -c $jdbOutFile | awk '{ print $1 } '`
- if [ "$fileSize" != "$newFileSize" ] ; then
+ #echo jj: desired = $desiredFileSize, new = $newFileSize >& 2
+
+ done=`expr $newFileSize \>= $desiredFileSize`
+ if [ $done = 1 ] ; then
break
fi
sleep ${sleep_seconds}
@@ -573,14 +646,19 @@
echo "--DEBUG: jdb $$ didn't responded to command in $count secs: $*" >& 2
echo "--DEBUG:" $msg1 >& 2
echo "--DEBUG: "done size/waiting : / $newFileSize / `date` >& 2
- $psCmd | sed -e '/com.sun.javatest/d' -e '/nsk/d' >& 2
+ echo "-- $jdbOutFile follows-------------------------------" >& 2
+ cat $jdbOutFile >& 2
+ echo "------------------------------------------" >& 2
+ dojstack
+ #$psCmd | sed -e '/com.sun.javatest/d' -e '/nsk/d' >& 2
if [ $count = 60 ] ; then
dofail "jdb never responded to command: $*"
fi
fi
done
-
- waitForJdbMsg '^.*\[[0-9]*\] $' 1 allowExit
+ # Note that this assumes just these chars in thread names.
+ waitForJdbMsg '[a-zA-Z0-9_-][a-zA-Z0-9_-]*\[[1-9][0-9]*\] [ >]*$' \
+ 1 allowExit
}
setBkpts()
@@ -596,15 +674,19 @@
runToBkpt()
{
cmd run
+ # Don't need to do this - the above waits for the next prompt which comes out
+ # AFTER the Breakpoint hit message.
# Wait for jdb to hit the bkpt
- waitForJdbMsg "Breakpoint hit" 5
+ #waitForJdbMsg "Breakpoint hit" 5
}
contToBkpt()
{
cmd cont
+ # Don't need to do this - the above waits for the next prompt which comes out
+ # AFTER the Breakpoint hit message.
# Wait for jdb to hit the bkpt
- waitForJdbMsg "Breakpoint hit" 5
+ #waitForJdbMsg "Breakpoint hit" 5
}
@@ -618,7 +700,7 @@
nlines=$2
allowExit="$3"
myCount=0
- timeLimit=40 # wait a max of 40 secs for a response from a jdb command
+ timeLimit=40 # wait a max of this many secs for a response from a jdb command
while [ 1 = 1 ] ; do
if [ -r $jdbOutFile ] ; then
# Something here causes jdb to complain about Unrecognized cmd on x86.
@@ -654,8 +736,11 @@
myCount=`expr $myCount + ${sleep_seconds}`
if [ $myCount -gt $timeLimit ] ; then
+ echo "--Fail: waitForJdbMsg timed out after $timeLimit seconds, looking for /$1/, in $nlines lines; exitting" >> $failFile
+ echo "vv jdbOutFile vvvvvvvvvvvvvvvvvvvvvvvvvvvv" >& 2
+ cat $jdbOutFile >& 2
+ echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" >& 2
dojstack
- echo "--Fail: waitForJdbMsg timed out after $timeLimit seconds; exitting" >> $failFile
exit 1
fi
done
@@ -865,35 +950,29 @@
# get inserted into the string we are searching for
# so ignore those chars.
if [ -z "$3" ] ; then
- case "$2" in
- *\>*)
- # Target string contains a > so we better
- # not ignore it
- $grep -s "$2" $1 > $devnull 2>&1
- stat=$?
- ;;
- *)
- # Target string does not contain a >.
- # Ignore > and '> ' in the file.
- cat $1 | sed -e 's@> @@g' -e 's@>@@g' | $grep -s "$2" > $devnull 2>&1
- stat=$?
- esac
+ theCmd=cat
else
- case "$2" in
- *\>*)
- # Target string contains a > so we better
- # not ignore it
- tail -$3 $1 | $grep -s "$2" > $devnull 2>&1
- stat=$?
- ;;
- *)
- # Target string does not contain a >.
- # Ignore > and '> ' in the file.
- tail -$3 $1 | sed -e 's@> @@g' -e 's@>@@g' | $grep -s "$2" > $devnull 2>&1
- stat=$?
- ;;
- esac
+ theCmd="tail -$3"
fi
+ case "$2" in
+ *\>*)
+ # Target string contains a > so we better
+ # not ignore it
+ $theCmd $1 | $grep -s "$2" > $devnull 2>&1
+ return $?
+ ;;
+ esac
+ # Target string does not contain a >.
+ # Ignore > and '> ' in the file.
+ # NOTE: if $1 does not end with a new line, piping it to sed doesn't include the
+ # chars on the last line. Detect this case, and add a new line.
+ cp $1 $1.tmp
+ if [ `tail -1 $1.tmp | wc -l | sed -e 's@ @@g'` = 0 ] ; then
+ echo >> $1.tmp
+ fi
+ $theCmd $1.tmp | sed -e 's@> @@g' -e 's@>@@g' | $grep -s "$2" > $devnull 2>&1
+ stat=$?
+ rm -f $1.tmp
return $stat
}
--- a/jdk/test/com/sun/jdi/SimulResumerTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/SimulResumerTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -30,7 +30,7 @@
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g SimulResumerTest.java
- * @run main SimulResumerTest
+ * @run main/othervm SimulResumerTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- a/jdk/test/com/sun/jdi/Solaris32AndSolaris64Test.sh Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/Solaris32AndSolaris64Test.sh Wed Dec 16 16:25:08 2009 -0800
@@ -164,10 +164,10 @@
if [ -n "${STANDALONE}" ] ; then
#if running standalone, compile the support files
${TESTJAVA}/bin/javac -d ${TESTCLASSES} \
- -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}." \
+ -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}${TESTSRC}" \
TestScaffold.java VMConnection.java TargetListener.java TargetAdapter.java
${TESTJAVA}/bin/javac -d ${TESTCLASSES} \
- -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}." -g \
+ -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}${TESTSRC}" -g \
FetchLocals.java DataModelTest.java
fi
--- a/jdk/test/com/sun/jdi/VMConnection.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/VMConnection.java Wed Dec 16 16:25:08 2009 -0800
@@ -57,6 +57,7 @@
if (testClasses == null) {
return retVal;
}
+ retVal += "-classpath " + testClasses + " ";
File myFile = new File(testClasses, "@debuggeeVMOptions");
if (!myFile.canRead()) {
@@ -97,7 +98,7 @@
if (line.length() != 0 && !line.startsWith("#")) {
System.out.println("-- Added debuggeeVM options from file " +
wholePath + ": " + line);
- retVal = line;
+ retVal += line;
break;
}
// Else, read he next line.
--- a/jdk/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java Wed Dec 16 16:25:08 2009 -0800
@@ -28,7 +28,7 @@
* This tests launches a debuggee using a custom LaunchingConnector.
*
* @build DebugUsingCustomConnector SimpleLaunchingConnector Foo NullTransportService
- * @run main DebugUsingCustomConnector
+ * @run main/othervm DebugUsingCustomConnector
*/
import com.sun.jdi.*;
import com.sun.jdi.connect.*;
--- a/jdk/test/com/sun/jdi/connect/spi/GeneratedConnectors.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/connect/spi/GeneratedConnectors.java Wed Dec 16 16:25:08 2009 -0800
@@ -31,7 +31,7 @@
* created and that they have an "address" argument.
*
* @build GeneratedConnectors NullTransportService
- * @run main GeneratedConnectors
+ * @run main/othervm GeneratedConnectors
*/
import com.sun.jdi.*;
--- a/jdk/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java Wed Dec 16 16:25:08 2009 -0800
@@ -145,13 +145,18 @@
String exe = System.getProperty("java.home") + File.separator + "bin" +
File.separator;
String arch = System.getProperty("os.arch");
- if (arch.equals("sparcv9")) {
+ String osname = System.getProperty("os.name");
+ if (osname.equals("SunOS") && arch.equals("sparcv9")) {
exe += "sparcv9/java";
+ } else if (osname.equals("SunOS") && arch.equals("amd64")) {
+ exe += "amd64/java";
} else {
exe += "java";
}
String cmd = exe + " -Xdebug -Xrunjdwp:transport=dt_socket,timeout=15000,address=" +
- key.address() + "" + className;
+ key.address() +
+ " -classpath " + System.getProperty("test.classes") +
+ " " + className;
Process process = Runtime.getRuntime().exec(cmd);
Connection conn = ts.accept(key, 30*1000, 9*1000);
ts.stopListening(key);
--- a/jdk/test/com/sun/jdi/redefine/RedefineTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/com/sun/jdi/redefine/RedefineTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g RedefineTest.java
* @run shell RedefineSetUp.sh
- * @run main RedefineTest
+ * @run main/othervm RedefineTest
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/tracing/BasicWithSecurityMgr.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 6899605
+ * @summary Basic unit test for tracing framework with security manager
+ * enabled
+ */
+
+import com.sun.tracing.*;
+import java.lang.reflect.Method;
+
+@ProviderName("NamedProvider")
+interface BasicProvider extends Provider {
+ void plainProbe();
+ void probeWithArgs(int a, float f, String s, Long l);
+ @ProbeName("namedProbe") void probeWithName();
+ void overloadedProbe();
+ void overloadedProbe(int i);
+}
+
+interface InvalidProvider extends Provider {
+ int nonVoidProbe();
+}
+
+public class BasicWithSecurityMgr {
+
+ public static ProviderFactory factory;
+ public static BasicProvider bp;
+
+ public static void main(String[] args) throws Exception {
+ // enable security manager
+ System.setSecurityManager(new SecurityManager());
+
+ factory = ProviderFactory.getDefaultFactory();
+ if (factory != null) {
+ bp = factory.createProvider(BasicProvider.class);
+ }
+
+ testProviderFactory();
+ testProbe();
+ testProvider();
+ }
+
+ static void fail(String s) throws Exception {
+ throw new Exception(s);
+ }
+
+ static void testProviderFactory() throws Exception {
+ if (factory == null) {
+ fail("ProviderFactory.getDefaultFactory: Did not create factory");
+ }
+ if (bp == null) {
+ fail("ProviderFactory.createProvider: Did not create provider");
+ }
+ try {
+ factory.createProvider(null);
+ fail("ProviderFactory.createProvider: Did not throw NPE for null");
+ } catch (NullPointerException e) {}
+
+ try {
+ factory.createProvider(InvalidProvider.class);
+ fail("Factory.createProvider: Should error with non-void probes");
+ } catch (IllegalArgumentException e) {}
+ }
+
+ public static void testProvider() throws Exception {
+
+ // These just shouldn't throw any exeptions:
+ bp.plainProbe();
+ bp.probeWithArgs(42, (float)3.14, "spam", new Long(2L));
+ bp.probeWithArgs(42, (float)3.14, null, null);
+ bp.probeWithName();
+ bp.overloadedProbe();
+ bp.overloadedProbe(42);
+
+ Method m = BasicProvider.class.getMethod("plainProbe");
+ Probe p = bp.getProbe(m);
+ if (p == null) {
+ fail("Provider.getProbe: Did not return probe");
+ }
+
+ Method m2 = BasicWithSecurityMgr.class.getMethod("testProvider");
+ p = bp.getProbe(m2);
+ if (p != null) {
+ fail("Provider.getProbe: Got probe with invalid spec");
+ }
+
+ bp.dispose();
+ // These just shouldn't throw any exeptions:
+ bp.plainProbe();
+ bp.probeWithArgs(42, (float)3.14, "spam", new Long(2L));
+ bp.probeWithArgs(42, (float)3.14, null, null);
+ bp.probeWithName();
+ bp.overloadedProbe();
+ bp.overloadedProbe(42);
+
+ if (bp.getProbe(m) != null) {
+ fail("Provider.getProbe: Should return null after dispose()");
+ }
+
+ bp.dispose(); // just to make sure nothing bad happens
+ }
+
+ static void testProbe() throws Exception {
+ Method m = BasicProvider.class.getMethod("plainProbe");
+ Probe p = bp.getProbe(m);
+ p.isEnabled(); // just make sure it doesn't do anything bad
+ p.trigger();
+
+ try {
+ p.trigger(0);
+ fail("Probe.trigger: too many arguments not caught");
+ } catch (IllegalArgumentException e) {}
+
+ p = bp.getProbe(BasicProvider.class.getMethod(
+ "probeWithArgs", int.class, float.class, String.class, Long.class));
+ try {
+ p.trigger();
+ fail("Probe.trigger: too few arguments not caught");
+ } catch (IllegalArgumentException e) {}
+
+ try {
+ p.trigger((float)3.14, (float)3.14, "", new Long(0L));
+ fail("Probe.trigger: wrong type primitive arguments not caught");
+ } catch (IllegalArgumentException e) {}
+ }
+}
--- a/jdk/test/demo/jvmti/hprof/CpuOldTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/demo/jvmti/hprof/CpuOldTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 5012882 6299047
* @summary Test jvmti hprof
*
- * @compile -source 1.5 -g HelloWorld.java ../DemoRun.java
+ * @compile -g HelloWorld.java ../DemoRun.java
* @build CpuOldTest
* @run main CpuOldTest HelloWorld
*/
--- a/jdk/test/demo/jvmti/hprof/CpuSamplesTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/demo/jvmti/hprof/CpuSamplesTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 5012882
* @summary Test jvmti hprof
*
- * @compile -source 1.5 -g:lines HelloWorld.java ../DemoRun.java
+ * @compile -g:lines HelloWorld.java ../DemoRun.java
* @build CpuSamplesTest
* @run main CpuSamplesTest HelloWorld
*/
--- a/jdk/test/demo/jvmti/hprof/CpuTimesDefineClassTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/demo/jvmti/hprof/CpuTimesDefineClassTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 5097131 6299047
* @summary Test jvmti hprof
*
- * @compile -source 1.5 -g HelloWorld.java DefineClass.java ../DemoRun.java
+ * @compile -g HelloWorld.java DefineClass.java ../DemoRun.java
* @build CpuTimesDefineClassTest
* @run main CpuTimesDefineClassTest DefineClass
*
--- a/jdk/test/demo/jvmti/hprof/CpuTimesTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/demo/jvmti/hprof/CpuTimesTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 5012882 6299047
* @summary Test jvmti hprof
*
- * @compile -source 1.5 -g HelloWorld.java ../DemoRun.java
+ * @compile -g HelloWorld.java ../DemoRun.java
* @build CpuTimesTest
* @run main CpuTimesTest HelloWorld
*/
--- a/jdk/test/demo/jvmti/hprof/HeapAllTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/demo/jvmti/hprof/HeapAllTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 5012882 6299047
* @summary Test jvmti hprof
*
- * @compile -source 1.5 -g HelloWorld.java ../DemoRun.java
+ * @compile -g HelloWorld.java ../DemoRun.java
* @build HeapAllTest
* @run main HeapAllTest HelloWorld
*/
--- a/jdk/test/demo/jvmti/hprof/HeapBinaryFormatTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/demo/jvmti/hprof/HeapBinaryFormatTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 4965057 6313381
* @summary Test jvmti hprof format=b
*
- * @compile -source 1.5 -g:source HelloWorld.java ../DemoRun.java
+ * @compile -g:source HelloWorld.java ../DemoRun.java
* @build HeapBinaryFormatTest
* @run main HeapBinaryFormatTest HelloWorld
*/
--- a/jdk/test/demo/jvmti/hprof/HeapDumpTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/demo/jvmti/hprof/HeapDumpTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 5012882 6299047
* @summary Test jvmti hprof
*
- * @compile -source 1.5 -g:source HelloWorld.java ../DemoRun.java
+ * @compile -g:source HelloWorld.java ../DemoRun.java
* @build HeapDumpTest
* @run main HeapDumpTest HelloWorld
*/
--- a/jdk/test/demo/jvmti/hprof/HeapSitesTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/demo/jvmti/hprof/HeapSitesTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 5012882 6299047
* @summary Test jvmti hprof
*
- * @compile -source 1.5 -g:vars HelloWorld.java ../DemoRun.java
+ * @compile -g:vars HelloWorld.java ../DemoRun.java
* @build HeapSitesTest
* @run main HeapSitesTest HelloWorld
*/
--- a/jdk/test/demo/jvmti/hprof/OptionsTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/demo/jvmti/hprof/OptionsTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 5083441 6299047
* @summary Test jvmti hprof
*
- * @compile -source 1.5 -g:lines HelloWorld.java ../DemoRun.java
+ * @compile -g:lines HelloWorld.java ../DemoRun.java
* @build OptionsTest
* @run main OptionsTest HelloWorld
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/EventQueue/PushPopDeadlock2/PushPopTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ @test
+ @bug 4913324
+ @author Oleg Sukhodolsky: area=eventqueue
+ @run main/timeout=30 PushPopTest
+*/
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.EmptyStackException;
+import sun.awt.SunToolkit;
+
+public class PushPopTest {
+
+ public static Frame frame;
+ public static void main(String[] args) {
+ frame = new Frame("");
+ frame.pack();
+
+ Runnable dummy = new Runnable() {
+ public void run() {
+ System.err.println("Dummy is here.");
+ }
+ };
+ EventQueue seq = Toolkit.getDefaultToolkit().getSystemEventQueue();
+ MyEventQueue1 eq1 = new MyEventQueue1();
+ MyEventQueue2 eq2 = new MyEventQueue2();
+ EventQueue.invokeLater(dummy);
+
+ seq.push(eq1);
+ EventQueue.invokeLater(dummy);
+
+ eq1.push(eq2);
+ EventQueue.invokeLater(dummy);
+ Runnable runnable = new Runnable() {
+ public void run() {
+ System.err.println("Dummy from SunToolkit");
+ }
+ };
+ InvocationEvent ie = new InvocationEvent(eq2, runnable, null, false);
+ System.err.println(ie);
+ SunToolkit.postEvent(SunToolkit.targetToAppContext(frame), ie);
+ eq1.pop();
+ frame.dispose();
+ }
+}
+
+class MyEventQueue1 extends EventQueue {
+
+ public void pop() throws EmptyStackException {
+ super.pop();
+ }
+}
+
+class MyEventQueue2 extends EventQueue {
+
+ protected void pop() throws EmptyStackException {
+ System.err.println("pop2()");
+ Thread.dumpStack();
+ try {
+ EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ Runnable runnable = new Runnable() {
+ public void run() {
+ System.err.println("Dummy from here");
+ }
+ };
+ InvocationEvent ie = new InvocationEvent(MyEventQueue2.this, runnable, null, false);
+ SunToolkit.postEvent(SunToolkit.targetToAppContext(PushPopTest.frame), ie);
+ postEvent(ie);
+ }
+ });
+ } catch (InterruptedException ie) {
+ ie.printStackTrace();
+ } catch (java.lang.reflect.InvocationTargetException ie) {
+ ie.printStackTrace();
+ }
+ super.pop();
+ }
+}
--- a/jdk/test/java/awt/KeyboardFocusmanager/TypeAhead/TestDialogTypeAhead.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/awt/KeyboardFocusmanager/TypeAhead/TestDialogTypeAhead.java Wed Dec 16 16:25:08 2009 -0800
@@ -50,13 +50,7 @@
import java.applet.Applet;
import java.awt.*;
-import java.lang.reflect.InvocationTargetException;
import java.awt.event.*;
-import java.awt.peer.DialogPeer;
-import java.awt.peer.ComponentPeer;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import test.java.awt.regtesthelpers.Util;
@@ -94,11 +88,13 @@
}
}, AWTEvent.KEY_EVENT_MASK);
+ KeyboardFocusManager.setCurrentKeyboardFocusManager(new TestKFM());
+
this.setLayout (new BorderLayout ());
f = new Frame("frame");
b = new Button("press");
- d = new TestDialog(f, "dialog", true, robotSema);
+ d = new Dialog(f, "dialog", true);
ok = new Button("ok");
d.add(ok);
d.pack();
@@ -170,6 +166,11 @@
} catch (InterruptedException ie) {
throw new RuntimeException("Interrupted!");
}
+ if (!robotSema.getState()) {
+ throw new RuntimeException("robotSema hasn't been triggered");
+ }
+
+ System.err.println("typing ahead");
robot.keyPress(KeyEvent.VK_SPACE);
robot.keyRelease(KeyEvent.VK_SPACE);
waitForIdle();
@@ -278,65 +279,14 @@
}
}
- // Fix for 6446952.
- // In the process of showing the dialog we have to catch peer.show() call
- // so that to trigger key events just before it gets invoked.
- // We base on the fact that a modal dialog sets type-ahead markers
- // before it calls 'show' on the peer.
- // Posting the key events before dialog.setVisible(true) would be actually not
- // good because it would be Ok to dispatch them to the current focus owner,
- // not to the dialog.
- class TestDialog extends Dialog {
- ComponentPeer origDialogPeer;
- ComponentPeer proxyInstPeer;
- Semaphore trigger;
-
- TestDialog(Frame owner, String title, boolean modal, Semaphore trigger) {
- super(owner, title, modal);
- this.trigger = trigger;
- }
- public ComponentPeer getPeer() {
- ComponentPeer ret = super.getPeer();
- if (ret == proxyInstPeer) {
- return origDialogPeer;
- } else {
- return ret;
- }
- }
+ class TestKFM extends DefaultKeyboardFocusManager {
+ protected synchronized void enqueueKeyEvents(long after,
+ Component untilFocused)
+ {
+ super.enqueueKeyEvents(after, untilFocused);
- public void addNotify() {
- super.addNotify();
- replacePeer();
- }
-
- void replacePeer() {
- origDialogPeer = getPeer();
-
- InvocationHandler handler = new InvocationHandler() {
- public Object invoke(Object proxy, Method method, Object[] args) {
- if (method.getName() == "show") {
- trigger.raise();
- }
-
- Object ret = null;
- try {
- ret = method.invoke(origDialogPeer, args);
- } catch (IllegalAccessException iae) {
- throw new Error("Test error.", iae);
- } catch (InvocationTargetException ita) {
- throw new Error("Test error.", ita);
- }
- return ret;
- }
- };
-
- proxyInstPeer = (DialogPeer)Proxy.newProxyInstance(
- DialogPeer.class.getClassLoader(), new Class[] {DialogPeer.class}, handler);
-
- try {
- Util.getField(Component.class, "peer").set(d, proxyInstPeer);
- } catch (IllegalAccessException iae) {
- throw new Error("Test error.", iae);
+ if (untilFocused == TestDialogTypeAhead.this.ok) {
+ TestDialogTypeAhead.this.robotSema.raise();
}
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Window/WindowType/WindowType.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ @test
+ @bug 6402325
+ @summary Test showing windows of different types
+ @author anthony.petrov@sun.com: area=awt.toplevel
+ @library ../../regtesthelpers
+ @build Util
+ @run main WindowType
+*/
+
+import java.awt.*;
+import test.java.awt.regtesthelpers.Util;
+
+/**
+ * WindowType.java
+ * Summary: Test showing windows of different types.
+ */
+public class WindowType {
+ private static void test(Window window, Window.Type type) {
+ window.setType(type);
+
+ window.setVisible(true);
+ Util.waitForIdle(null);
+ window.setVisible(false);
+ }
+
+ private static void test(Window.Type type) {
+ test(new Window((Frame)null), type);
+ test(new Frame(), type);
+ test(new Dialog((Frame)null), type);
+ }
+
+ public static void main(String[] args) {
+ test(Window.Type.NORMAL);
+ test(Window.Type.UTILITY);
+ test(Window.Type.POPUP);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/AbsoluteComponentCenterCalculator.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.awt.*;
+
+class AbsoluteComponentCenterCalculator {
+ private AbsoluteComponentCenterCalculator () {}
+ public static int calculateXCenterCoordinate(Component component) {
+ return (int)component.getLocationOnScreen().getX()+(component.getWidth()/2);
+ }
+ public static int calculateYCenterCoordinate(Component component) {
+ return (int)component.getLocationOnScreen().getY()+(component.getHeight()/2);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/DragUnicodeBetweenJVMTest.html Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,25 @@
+<html>
+<!--
+ @test
+ @bug 5098433
+ @summary REG: DnD of File-List between JVM is broken for non ASCII file names - Win32
+ @author Denis Fokin: area=dnd
+ @library ../../regtesthelpers
+ @library ../../regtesthelpers/process
+ @build Util
+ @build ProcessResults ProcessCommunicator
+ @run applet/othervm DragUnicodeBetweenJVMTest.html
+
+-->
+<head>
+<title> REG: DnD of File-List between JVM is broken for non ASCII file names - Win32</title>
+</head>
+<body>
+
+<h1> DragUnicodeBetweenJVMTest <br>Bug ID: 5098433 </h1>
+
+<p> This is an AUTOMATIC test, simply wait for completion </p>
+
+<APPLET CODE="DragUnicodeBetweenJVMTest.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/DragUnicodeBetweenJVMTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ test
+ @bug 5098433
+ @summary REG: DnD of File-List between JVM is broken for non ASCII file names - Win32
+ @author Denis Fokin: area=dnd
+ @library ../../regtesthelpers
+ @library ../../regtesthelpers/process
+ @build Util
+ @build ProcessResults ProcessCommunicator
+
+
+ @run applet/othervm DragUnicodeBetweenJVMTest.html
+*/
+
+/**
+ * DragUnicodeBetweenJVMTest.java
+ *
+ * summary: The test drags a list of files (DataFlavor.javaFileListFlavor) from one jvm to another.
+ * The files have Unicode names. The list on target side must be equal to
+ * the list on the source side.
+ */
+
+
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.Applet;
+
+import test.java.awt.regtesthelpers.process.ProcessCommunicator;
+import test.java.awt.regtesthelpers.process.ProcessResults;
+import test.java.awt.regtesthelpers.Util;
+import static java.lang.Thread.sleep;
+
+public class DragUnicodeBetweenJVMTest extends Applet
+{
+
+ public void init() {
+ setLayout(new BorderLayout());
+ }//End init()
+
+ public void start() {
+
+ String toolkit = Toolkit.getDefaultToolkit().getClass().getName();
+ if (!toolkit.equals("sun.awt.windows.WToolkit")){
+ System.out.println("This test is for Windows only. Passed.");
+ return;
+ }
+ else{
+ System.out.println("Toolkit = " + toolkit);
+ }
+
+ final Frame sourceFrame = new Frame("Source frame");
+ final SourcePanel sourcePanel = new SourcePanel();
+ sourceFrame.add(sourcePanel);
+ sourceFrame.pack();
+ sourceFrame.addWindowListener( new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent e) {
+ sourceFrame.dispose();
+ }
+ });
+ sourceFrame.setVisible(true);
+
+ Util.waitForIdle(null);
+
+ NextFramePositionCalculator positionCalculator = new NextFramePositionCalculator(sourceFrame);
+
+ String [] args = new String [] {
+ String.valueOf(positionCalculator.getNextLocationX()),
+ String.valueOf(positionCalculator.getNextLocationY()),
+ String.valueOf(AbsoluteComponentCenterCalculator.calculateXCenterCoordinate(sourcePanel)),
+ String.valueOf(AbsoluteComponentCenterCalculator.calculateYCenterCoordinate(sourcePanel)),
+ };
+
+
+ ProcessResults processResults =
+ // ProcessCommunicator.executeChildProcess(this.getClass()," -cp \"C:\\Documents and Settings\\df153228\\IdeaProjects\\UnicodeTestDebug\\out\\production\\UnicodeTestDebug\" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 ", args);
+ ProcessCommunicator.executeChildProcess(this.getClass(), args);
+
+ verifyTestResults(processResults);
+
+ }// start()
+
+
+
+ private static void verifyTestResults(ProcessResults processResults) {
+ if ( InterprocessMessages.FILES_ON_TARGET_ARE_CORRUPTED ==
+ processResults.getExitValue())
+ {
+ processResults.printProcessErrorOutput(System.err);
+ throw new RuntimeException("TEST IS FAILED: Target has recieved" +
+ " broken file list.");
+ }
+ processResults.verifyStdErr(System.err);
+ processResults.verifyProcessExitValue(System.err);
+ processResults.printProcessStandartOutput(System.out);
+ }
+
+ //We cannot make an instance of the applet without the default constructor
+ public DragUnicodeBetweenJVMTest () {
+ super();
+ }
+
+ //We need in this constructor to pass frame position between JVMs
+ public DragUnicodeBetweenJVMTest (Point targetFrameLocation, Point dragSourcePoint)
+ throws InterruptedException
+ {
+ final Frame targetFrame = new Frame("Target frame");
+ final TargetPanel targetPanel = new TargetPanel(targetFrame);
+ targetFrame.add(targetPanel);
+ targetFrame.addWindowListener( new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent e) {
+ targetFrame.dispose();
+ }
+ });
+ targetFrame.setLocation(targetFrameLocation);
+ targetFrame.pack();
+ targetFrame.setVisible(true);
+
+ doTest(dragSourcePoint, targetPanel);
+ }
+
+ private void doTest(Point dragSourcePoint, TargetPanel targetPanel) {
+ Util.waitForIdle(null);
+
+ final Robot robot = Util.createRobot();
+
+ robot.mouseMove((int)dragSourcePoint.getX(),(int)dragSourcePoint.getY());
+ try {
+ sleep(100);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ sleep(100);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+ sleep(100);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ Util.drag(robot, dragSourcePoint, new Point (AbsoluteComponentCenterCalculator.calculateXCenterCoordinate(targetPanel),
+ AbsoluteComponentCenterCalculator.calculateYCenterCoordinate(targetPanel)),
+ InputEvent.BUTTON1_MASK);
+ }
+
+
+ enum InterprocessArguments {
+ TARGET_FRAME_X_POSITION_ARGUMENT,
+ TARGET_FRAME_Y_POSITION_ARGUMENT,
+ DRAG_SOURCE_POINT_X_ARGUMENT,
+ DRAG_SOURCE_POINT_Y_ARGUMENT;
+
+ int extract (String [] args) {
+ return Integer.parseInt(args[this.ordinal()]);
+ }
+ }
+
+ public static void main (String [] args) {
+ Point dragSourcePoint = new Point(InterprocessArguments.DRAG_SOURCE_POINT_X_ARGUMENT.extract(args),
+ InterprocessArguments.DRAG_SOURCE_POINT_Y_ARGUMENT.extract(args));
+ Point targetFrameLocation = new Point(InterprocessArguments.TARGET_FRAME_X_POSITION_ARGUMENT.extract(args),
+ InterprocessArguments.TARGET_FRAME_Y_POSITION_ARGUMENT.extract(args));
+
+ try {
+ new DragUnicodeBetweenJVMTest(targetFrameLocation, dragSourcePoint);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/FileListTransferable.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.IOException;
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
+class FileListTransferable implements Transferable {
+
+ public static File [] files = new File [] {
+ new File ("\u042f\u0020\u0441\u0440\u0430\u0437\u0443\u0020\u0441\u043c\u0430\u0437\u0430\u043b" +
+ "\u0020\u043a\u0430\u0440\u0442\u0443\u0020\u0431\u0443\u0434\u043d\u044f"),
+ new File ("\u043f\u043b\u0435\u0441\u043d\u0443\u0432\u0448\u0438\u0020\u043a\u0440\u0430\u0441" +
+ "\u043a\u0443\u0020\u0438\u0437\u0020\u0441\u0442\u0430\u043a\u0430\u043d\u0430"),
+ new File ("\u044f\u0020\u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0020\u043d\u0430\u0020\u0431" +
+ "\u043b\u044e\u0434\u0435\u0020\u0441\u0442\u0443\u0434\u043d\u044f"),
+ new File ("\u043a\u043e\u0441\u044b\u0435\u0020\u0441\u043a\u0443\u043b\u044b\u0020\u043e\u043a" +
+ "\u0435\u0430\u043d\u0430"),
+ new File ("\u041d\u0430\u0020\u0447\u0435\u0448\u0443\u0435\u0020\u0436\u0435\u0441\u0442\u044f" +
+ "\u043d\u043e\u0439\u0020\u0440\u044b\u0431\u044b"),
+ new File ("\u043f\u0440\u043e\u0447\u0435\u043b\u0020\u044f\u0020\u0437\u043e\u0432\u044b\u0020" +
+ "\u043d\u043e\u0432\u044b\u0445\u0020\u0433\u0443\u0431"),
+ new File ("\u0410\u0020\u0432\u044b"),
+ new File ("\u043d\u043e\u043a\u0442\u044e\u0440\u043d\u0020\u0441\u044b\u0433\u0440\u0430\u0442" +
+ "\u044c"),
+ new File ("\u043c\u043e\u0433\u043b\u0438\u0020\u0431\u044b"),
+ new File ("\u043d\u0430\u0020\u0444\u043b\u0435\u0439\u0442\u0435\u0020\u0432\u043e\u0434\u043e" +
+ "\u0441\u0442\u043e\u0447\u043d\u044b\u0445\u0020\u0442\u0440\u0443\u0431"),
+ };
+
+ public DataFlavor[] getTransferDataFlavors() {
+ return new DataFlavor [] {DataFlavor.javaFileListFlavor};
+ }
+
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ return flavor.equals(DataFlavor.javaFileListFlavor) ;
+ }
+
+ public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+ List<File> list = Arrays.asList(files);
+ return list;
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/InterprocessMessages.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+interface InterprocessMessages {
+ final static int EXECUTION_IS_SUCCESSFULL = 0;
+ final static int FILES_ON_TARGET_ARE_CORRUPTED = 212;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/NextFramePositionCalculator.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.awt.*;
+
+
+class NextFramePositionCalculator {
+
+ private final Frame currentFrame;
+
+ public NextFramePositionCalculator (Frame currentFrame) {
+ this.currentFrame = currentFrame;
+ }
+
+ public int getNextLocationX() {
+ return currentFrame.getX()+currentFrame.getWidth();
+ }
+
+ public int getNextLocationY() {
+ return currentFrame.getY();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/SourcePanel.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.awt.dnd.DragSource;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DragGestureEvent;
+import java.awt.dnd.DragGestureListener;
+import java.awt.*;
+
+public class SourcePanel extends Panel
+{
+
+ private final MyDragGestureListener dragGestureListener =
+ new MyDragGestureListener();
+
+ public SourcePanel () {
+ setPreferredSize(new Dimension(200, 200));
+ DragSource defaultDragSource =
+ DragSource.getDefaultDragSource();
+ defaultDragSource.createDefaultDragGestureRecognizer(this,
+ DnDConstants.ACTION_COPY_OR_MOVE, dragGestureListener);
+ setBackground(Color.RED);
+ }
+
+ private class MyDragGestureListener implements DragGestureListener {
+ public void dragGestureRecognized(DragGestureEvent dge) {
+ dge.startDrag(null, new FileListTransferable());
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/TargetPanel.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.awt.dnd.*;
+import java.awt.*;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Arrays;
+
+public class TargetPanel extends Panel implements DropTargetListener{
+
+ private java.util.List <File> content = new ArrayList<File>();
+
+ //private final CustomDropTargetListener dropTargetListener = new CustomDropTargetListener();
+
+ private Frame frame;
+
+ public TargetPanel (Frame frame)
+ {
+ this.frame = frame;
+ setBackground(Color.DARK_GRAY);
+ setPreferredSize(new Dimension(200, 200));
+ setDropTarget(new DropTarget(this, this));
+ }
+
+ public void dragEnter(DropTargetDragEvent dtde) {
+ if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
+ dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
+ }
+ }
+
+ public void dragOver(DropTargetDragEvent dtde) {
+ if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
+ dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
+ }
+ }
+
+ public void dropActionChanged(DropTargetDragEvent dtde) {
+ if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
+ dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
+ }
+ }
+
+ public void dragExit(DropTargetEvent dte) {
+
+ }
+
+ public void drop(DropTargetDropEvent dtde) {
+ dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
+ if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
+ try {
+ content = (java.util.List)dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
+ repaint();
+ } catch (UnsupportedFlavorException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ dtde.dropComplete(true);
+
+
+
+ boolean listsAreEqual = true;
+
+ for (int i = 0; i < content.size(); i++) {
+ if(!FileListTransferable.files[i].getName().equals(content.get(i).getName())) {
+ listsAreEqual = false;
+ }
+ }
+
+ if (listsAreEqual) {
+ System.err.println(InterprocessMessages.EXECUTION_IS_SUCCESSFULL);
+ System.exit(0);
+ }
+ }
+ dtde.rejectDrop();
+ System.err.println(InterprocessMessages.FILES_ON_TARGET_ARE_CORRUPTED);
+ System.exit(1);
+ }
+
+ public void paint(Graphics g) {
+ g.setColor(Color.YELLOW);
+ int i = 0;
+ for (Iterator <File> iterator = content.iterator(); iterator.hasNext();i++) {
+ g.drawString(iterator.next().getName(), 5, g.getFontMetrics().getAscent()*i+20);
+ }
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/dnd/URIListBetweenJVMsTest/FileListTransferable.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.File;
+import java.io.IOException;
+
+class FileListTransferable implements Transferable {
+
+ final private DataFlavor[] supportedFlavors =
+ {DataFlavor.javaFileListFlavor};
+
+ private java.util.List<File> list;
+
+ public FileListTransferable(java.util.List<File> list) {
+ this.list = list;
+ }
+
+ public DataFlavor[] getTransferDataFlavors() {
+ return supportedFlavors;
+ }
+
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ for (DataFlavor df:supportedFlavors) {
+ if (df.equals(flavor)) return true;
+ }
+ return false;
+ }
+
+ public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+ if (flavor.equals(DataFlavor.javaFileListFlavor)) {
+ return list;
+ }
+ throw new UnsupportedFlavorException(flavor);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/dnd/URIListBetweenJVMsTest/InterprocessMessages.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+public interface InterprocessMessages {
+ final static int EXECUTION_IS_SUCCESSFULL = 0;
+ final static int WRONG_FILES_NUMBER_ON_TARGET = 212;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/dnd/URIListBetweenJVMsTest/SourceFileListFrame.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import test.java.awt.regtesthelpers.Util;
+
+import java.awt.*;
+import java.awt.dnd.DragGestureListener;
+import java.awt.dnd.DragSource;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DragGestureEvent;
+import java.io.File;
+import java.util.Arrays;
+
+
+class SourceFileListFrame extends Frame implements DragGestureListener {
+
+ private final static int SOURCE_POINT_SHIFT = 3;
+
+ private List list = new List(URIListBetweenJVMsTest.VISIBLE_RAWS_IN_LIST);
+ private File[] files;
+
+ SourceFileListFrame() {
+ super("Source File List Frame");
+ extractFilesFromTheWorkingDirectory();
+ initList();
+ initGUI();
+ new DragSource().createDefaultDragGestureRecognizer(list,
+ DnDConstants.ACTION_COPY,this);
+ }
+
+ private void extractFilesFromTheWorkingDirectory() {
+ files = new File(System.getProperty("java.home", "")).listFiles();
+ }
+
+ private void initList() {
+ for (File currFile:files) {
+ list.add(currFile.getName());
+ }
+ }
+
+ private void initGUI() {
+ this.addWindowListener(Util.getClosingWindowAdapter());
+ this.setLocation(300,250);
+ this.add(new Panel().add(list));
+ this.pack();
+ this.setVisible(true);
+ }
+
+ int getNextLocationX() {
+ return getX()+getWidth();
+ }
+
+ int getNextLocationY() {
+ return getY();
+ }
+
+ int getDragSourcePointX() {
+ return (int)list.getLocationOnScreen().getX()+(list.getWidth()/2);
+ }
+
+ int getDragSourcePointY() {
+ return (int)list.getLocationOnScreen().getY()+ SOURCE_POINT_SHIFT;
+ }
+
+ int getSourceFilesNumber() {
+ return files.length;
+ }
+
+ public void dragGestureRecognized(DragGestureEvent dge) {
+ String [] filesAsStringArray = list.getItems();
+ File [] files = new File[filesAsStringArray.length];
+ for (int fileNumber=0; fileNumber<filesAsStringArray.length ; fileNumber++ ) {
+ files[fileNumber]=new File(filesAsStringArray[fileNumber]);
+ }
+ dge.startDrag(null, new FileListTransferable(Arrays.asList(files)));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/dnd/URIListBetweenJVMsTest/TargetFileListFrame.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import test.java.awt.regtesthelpers.Util;
+
+import java.awt.*;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.dnd.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.Reader;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+
+class TargetFileListFrame extends Frame implements DropTargetListener {
+
+ private List list = new List(URIListBetweenJVMsTest.VISIBLE_RAWS_IN_LIST);
+ private int expectationTransferredFilesNumber;
+ private DataFlavor dropFlavor;
+
+ TargetFileListFrame(Point location, int expectationTransferredFilesNumber) {
+ try {
+ dropFlavor = new DataFlavor("text/uri-list;class=java.io.Reader");
+ } catch (Exception ex) {
+ }
+ this.expectationTransferredFilesNumber = expectationTransferredFilesNumber;
+ initGUI(location);
+ setDropTarget(new DropTarget(list, DnDConstants.ACTION_COPY,
+ this));
+ }
+
+ private void initGUI(Point location) {
+ this.setLocation(location);
+ this.addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent e) {
+ TargetFileListFrame.this.dispose();
+ }
+ });
+ this.add(new Panel().add(list));
+ this.pack();
+ this.setVisible(true);
+ }
+
+ public void dragEnter(DropTargetDragEvent dtde) {
+ if (dtde.getCurrentDataFlavorsAsList().contains(dropFlavor)) {
+ dtde.acceptDrag(DnDConstants.ACTION_COPY);
+ }
+ }
+
+ public void dragOver(DropTargetDragEvent dtde) {
+ if (dtde.getCurrentDataFlavorsAsList().contains(dropFlavor)) {
+ dtde.acceptDrag(DnDConstants.ACTION_COPY);
+ }
+ }
+
+ public void dropActionChanged(DropTargetDragEvent dtde) {
+ if (dtde.getCurrentDataFlavorsAsList().contains(dropFlavor)) {
+ dtde.acceptDrag(DnDConstants.ACTION_COPY);
+ }
+ }
+
+ public void dragExit(DropTargetEvent dte) {}
+
+ public void drop(DropTargetDropEvent dtde) {
+ list.removeAll();
+ dtde.acceptDrop(DnDConstants.ACTION_COPY);
+ java.util.List<File> fileList = extractListOfFiles(dtde);
+ for (File file:fileList) {
+ list.add(file.getName());
+ }
+
+ if (fileList.size() != expectationTransferredFilesNumber)
+ {
+ System.err.println("ERROR: Expected file number:"
+ + expectationTransferredFilesNumber
+ + "; Received file number: "
+ + fileList.size());
+ TargetFileListFrame.this.dispose();
+ System.exit(InterprocessMessages.WRONG_FILES_NUMBER_ON_TARGET);
+ }
+
+ TargetFileListFrame.this.dispose();
+
+ }
+
+ private java.util.List<File> extractListOfFiles(DropTargetDropEvent dtde) {
+ BufferedReader reader = null;
+ ArrayList<File> files = new ArrayList<File>();
+ try {
+ reader = new BufferedReader((Reader)dtde.getTransferable().
+ getTransferData(dropFlavor));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ files.add(new File(new URI(line)));
+ }
+ } catch (UnsupportedFlavorException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ } finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (IOException ignored) {
+ }
+ }
+ }
+ return files;
+ }
+
+ Point getDropTargetPoint() {
+ return new Point((int)list.getLocationOnScreen().getX()+(list.getWidth()/2),
+ (int)list.getLocationOnScreen().getY()+(list.getHeight()/2));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/dnd/URIListBetweenJVMsTest/URIListBetweenJVMsTest.html Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,25 @@
+<html>
+<!--
+ @test
+ @bug 4899516
+ @summary Transferable has no DataFlavors when dragging from Gnome window to Swing
+ @author : area=dnd
+ @library ../../regtesthelpers
+ @library ../../regtesthelpers/process
+ @build Util
+ @build ProcessResults ProcessCommunicator
+ @run applet/othervm URIListBetweenJVMsTest.html
+
+-->
+<head>
+<title> DnD of URI-List across JVM </title>
+</head>
+<body>
+
+<h1>URIListBetweenJVMsTest<br>Bug ID: 4899516</h1>
+
+<p> This is an AUTOMATIC test, simply wait for completion </p>
+
+<APPLET CODE="URIListBetweenJVMsTest.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/dnd/URIListBetweenJVMsTest/URIListBetweenJVMsTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ test
+ @bug 4899516
+ @summary Transferable has no DataFlavors when dragging from Gnome window to Swing
+ @author : area=dnd
+ @run applet URIListBetweenJVMsTest.html
+*/
+
+/**
+ * URIListBetweenJVMsTest.java
+ *
+ * summary: Transferable has no DataFlavors when dragging from Gnome window to Swing
+ */
+
+import static java.lang.Thread.sleep;
+
+import test.java.awt.regtesthelpers.process.ProcessCommunicator;
+import test.java.awt.regtesthelpers.process.ProcessResults;
+import test.java.awt.regtesthelpers.Util;
+import java.applet.Applet;
+import java.awt.*;
+import java.awt.event.InputEvent;
+import java.io.*;
+
+public class URIListBetweenJVMsTest extends Applet {
+
+ // information related to the test in common
+ static int VISIBLE_RAWS_IN_LIST=15;
+
+ public void init() {
+ setLayout(new BorderLayout());
+
+ }//End init()
+
+ public void start() {
+
+ String toolkit = Toolkit.getDefaultToolkit().getClass().getName();
+ if (toolkit.equals("sun.awt.windows.WToolkit")){
+ System.out.println("This test is not for the Windows platform. Passed.");
+ return;
+ } else {
+ System.out.println("Toolkit = " + toolkit);
+ }
+
+ SourceFileListFrame sourceFrame = new SourceFileListFrame();
+
+ Util.waitForIdle(null);
+
+ String [] args = new String [] {
+ String.valueOf(sourceFrame.getNextLocationX()),
+ String.valueOf(sourceFrame.getNextLocationY()),
+ String.valueOf(sourceFrame.getDragSourcePointX()),
+ String.valueOf(sourceFrame.getDragSourcePointY()),
+ String.valueOf(sourceFrame.getSourceFilesNumber())
+ };
+
+ String classpath = System.getProperty("java.class.path");
+ ProcessResults processResults =
+ ProcessCommunicator.executeChildProcess(this.getClass(), classpath, args);
+
+ verifyTestResults(processResults);
+
+ }// start()
+
+ private static void verifyTestResults(ProcessResults processResults) {
+ if ( InterprocessMessages.WRONG_FILES_NUMBER_ON_TARGET ==
+ processResults.getExitValue())
+ {
+ processResults.printProcessErrorOutput(System.err);
+ throw new RuntimeException("TEST IS FAILED: Target has recieved" +
+ " wrong number of files.");
+ }
+ processResults.verifyStdErr(System.err);
+ processResults.verifyProcessExitValue(System.err);
+ processResults.printProcessStandartOutput(System.out);
+ }
+
+ //We cannot make an instance of the applet without the default constructor
+ public URIListBetweenJVMsTest () {
+ super();
+ }
+
+ //We need in this constructor to pass frame position between JVMs
+ public URIListBetweenJVMsTest (Point targetFrameLocation, Point dragSourcePoint,
+ int transferredFilesNumber)
+ throws InterruptedException
+ {
+ TargetFileListFrame targetFrame = new TargetFileListFrame(targetFrameLocation,
+ transferredFilesNumber);
+
+ Util.waitForIdle(null);
+
+ final Robot robot = Util.createRobot();
+
+ robot.mouseMove((int)dragSourcePoint.getX(),(int)dragSourcePoint.getY());
+ sleep(100);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ sleep(100);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+ sleep(100);
+
+ Util.drag(robot, dragSourcePoint, targetFrame.getDropTargetPoint(),
+ InputEvent.BUTTON1_MASK);
+
+ }
+
+ enum InterprocessArguments {
+ TARGET_FRAME_X_POSITION_ARGUMENT,
+ TARGET_FRAME_Y_POSITION_ARGUMENT,
+ DRAG_SOURCE_POINT_X_ARGUMENT,
+ DRAG_SOURCE_POINT_Y_ARGUMENT,
+ FILES_IN_THE_LIST_NUMBER_ARGUMENT;
+
+ int extract (String [] args) {
+ return Integer.parseInt(args[this.ordinal()]);
+ }
+ }
+
+ public static void main (String [] args) {
+ Point dragSourcePoint = new Point(InterprocessArguments.DRAG_SOURCE_POINT_X_ARGUMENT.extract(args),
+ InterprocessArguments.DRAG_SOURCE_POINT_Y_ARGUMENT.extract(args));
+ Point targetFrameLocation = new Point(InterprocessArguments.TARGET_FRAME_X_POSITION_ARGUMENT.extract(args),
+ InterprocessArguments.TARGET_FRAME_Y_POSITION_ARGUMENT.extract(args));
+ int transferredFilesNumber = InterprocessArguments.FILES_IN_THE_LIST_NUMBER_ARGUMENT.extract(args);
+
+ try {
+ new URIListBetweenJVMsTest(targetFrameLocation, dragSourcePoint, transferredFilesNumber);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+}// class URIListBetweenJVMsTest
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/font/GlyphVector/VisualBounds.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @summary leading and trailing spaces must not affect visual bounds
+ * @bug 6904962
+ */
+
+
+import java.awt.*;
+import java.awt.font.*;
+import java.awt.geom.*;
+
+public class VisualBounds {
+
+ public static void main(String args[]) {
+
+ String s1 = "a";
+ String s2 = s1+" ";
+ String s3 = " "+s1;
+ Font f = new Font("Dialog", Font.PLAIN, 12);
+ FontRenderContext frc = new FontRenderContext(null, false, false);
+ GlyphVector gv1 = f.createGlyphVector(frc, s1);
+ GlyphVector gv2 = f.createGlyphVector(frc, s2);
+ GlyphVector gv3 = f.createGlyphVector(frc, s3);
+ Rectangle2D bds1 = gv1.getVisualBounds();
+ Rectangle2D bds2 = gv2.getVisualBounds();
+ Rectangle2D bds3 = gv3.getVisualBounds();
+ GlyphVector gv4 = f.createGlyphVector(frc, " ");
+ Rectangle2D bds4 = gv4.getVisualBounds();
+ System.out.println(bds1);
+ System.out.println(bds2);
+ System.out.println(bds3);
+ System.out.println(bds4);
+
+ if (!bds1.equals(bds2)) {
+ throw new RuntimeException("Trailing space: Visual bounds differ");
+ }
+ if (bds2.getWidth() != bds3.getWidth()) {
+ throw new RuntimeException("Leading space: Visual widths differ");
+ }
+ if (!bds4.isEmpty()) {
+ throw new RuntimeException("Non empty bounds for space");
+ }
+ }
+}
--- a/jdk/test/java/awt/regtesthelpers/process/ProcessCommunicator.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/awt/regtesthelpers/process/ProcessCommunicator.java Wed Dec 16 16:25:08 2009 -0800
@@ -146,7 +146,15 @@
final String classPathArguments, final String [] args)
{
StringBuilder commandBuilder = new StringBuilder();
- commandBuilder.append(javaPath).append(classPathArguments).append(classToExecute.getName());
+ commandBuilder.append(javaPath).append(" ");
+ commandBuilder.append("-cp ").append(System.getProperty("test.classes", ".")).append(File.pathSeparatorChar);
+
+ if (classPathArguments.trim().length() > 0) {
+ commandBuilder.append(classPathArguments).append(" ");
+ }
+
+ commandBuilder.append(" ");
+ commandBuilder.append(classToExecute.getName());
for (String argument:args) {
commandBuilder.append(" ").append(argument);
}
--- a/jdk/test/java/io/Serializable/enum/array/Test.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/io/Serializable/enum/array/Test.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,9 +25,6 @@
* @bug 4838379
* @summary Verify that serialization of enum constant arrays functions
* properly.
- *
- * @compile -source 1.5 Test.java
- * @run main Test
*/
import java.io.*;
--- a/jdk/test/java/io/Serializable/enum/badResolve/Write.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/io/Serializable/enum/badResolve/Write.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,10 +26,10 @@
* @summary Verify that enum classes present in a serialization stream cannot
* be resolved by the receiver to non-enum classes, and vice-versa.
*
- * @compile -source 1.5 Write.java
+ * @compile Write.java
* @run main Write
* @clean Write
- * @compile -source 1.5 Read.java
+ * @compile Read.java
* @run main Read
* @clean Read
*/
--- a/jdk/test/java/io/Serializable/enum/basic/Test.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/io/Serializable/enum/basic/Test.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,9 +25,6 @@
* @bug 4838379
* @summary Verify that basic serialization of non-specialized enum constants
* functions properly.
- *
- * @compile -source 1.5 Test.java
- * @run main Test
*/
import java.io.*;
--- a/jdk/test/java/io/Serializable/enum/classObject/Test.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/io/Serializable/enum/classObject/Test.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,9 +25,6 @@
* @bug 4838379
* @summary Verify that serialization of Class objects for enum types works
* properly.
- *
- * @compile -source 1.5 Test.java
- * @run main Test
*/
import java.io.*;
--- a/jdk/test/java/io/Serializable/enum/constantSubclasses/Write.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/io/Serializable/enum/constantSubclasses/Write.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,10 +26,10 @@
* @summary Verify that serialization of enum constants that are instances of
* constant-specific subclasses functions properly.
*
- * @compile -source 1.5 Write.java
+ * @compile Write.java
* @run main Write
* @clean Write
- * @compile -source 1.5 Read.java
+ * @compile Read.java
* @run main Read
* @clean Read
*/
--- a/jdk/test/java/io/Serializable/enum/ignoreSerializationFields/Test.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/io/Serializable/enum/ignoreSerializationFields/Test.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,9 +25,6 @@
* @bug 4838379
* @summary Verify that serialVersionUID and serialPersistentFields
* declarations made by enum types and constants are ignored.
- *
- * @compile -source 1.5 Test.java
- * @run main Test
*/
import java.io.*;
--- a/jdk/test/java/io/Serializable/enum/ignoreSerializationMethods/Test.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/io/Serializable/enum/ignoreSerializationMethods/Test.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,9 +25,6 @@
* @bug 4838379
* @summary Verify that custom serialization methods defined by enum types are
* not invoked during serialization or deserialization.
- *
- * @compile -source 1.5 Test.java
- * @run main Test
*/
import java.io.*;
--- a/jdk/test/java/io/Serializable/enum/mismatchedTypecode/Test.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/io/Serializable/enum/mismatchedTypecode/Test.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @summary Verify that TC_OBJECT followed by a class descriptor for an enum
* class results in an InvalidClassException, as does TC_ENUM followed
* by a class descriptor for a non-enum class.
- *
- * @compile -source 1.5 Test.java
- * @run main Test
*/
import java.io.*;
--- a/jdk/test/java/io/Serializable/enum/missingConstant/Write.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/io/Serializable/enum/missingConstant/Write.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,10 +26,10 @@
* @summary Verify that deserialization of an enum constant that does not exist
* on the receiving side results in an InvalidObjectException.
*
- * @compile -source 1.5 Write.java
+ * @compile Write.java
* @run main Write
* @clean Write
- * @compile -source 1.5 Read.java
+ * @compile Read.java
* @run main Read
* @clean Read
*/
--- a/jdk/test/java/io/Serializable/enum/unshared/Test.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/io/Serializable/enum/unshared/Test.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,9 +25,6 @@
* @bug 4838379
* @summary Verify that unshared write and read operations work properly with
* enum constants.
- *
- * @compile -source 1.5 Test.java
- * @run main Test
*/
import java.io.*;
--- a/jdk/test/java/lang/Boolean/MakeBooleanComparable.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Boolean/MakeBooleanComparable.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4329937
* @summary Basic test for making Boolean implement Comparable
* @author Josh Bloch
- *
- * @compile -source 1.5 MakeBooleanComparable.java
- * @run main MakeBooleanComparable
*/
import java.util.*;
--- a/jdk/test/java/lang/Class/Cast.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Class/Cast.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,9 +25,6 @@
* @test
* @bug 4881275
* @summary (reflect) Class.cast() - typesafe cast desired
- *
- * @compile -source 1.5 Cast.java
- * @run main Cast
*/
public class Cast {
--- a/jdk/test/java/lang/Class/IsEnum.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Class/IsEnum.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 4891872 4989735 4990789 5020490
* @summary Check isEnum() method
* @author Joseph D. Darcy
- * @compile -source 1.5 IsEnum.java
- * @run main IsEnum
*/
import java.lang.annotation.*;
--- a/jdk/test/java/lang/Class/asSubclass/BasicUnit.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Class/asSubclass/BasicUnit.java Wed Dec 16 16:25:08 2009 -0800
@@ -27,7 +27,7 @@
* @summary please add a typesafe cast for Class<?> types
* @author gafter
*
- * @compile -Xlint:unchecked -Werror -source 1.5 BasicUnit.java
+ * @compile -Xlint:unchecked -Werror BasicUnit.java
* @run main BasicUnit
*/
--- a/jdk/test/java/lang/ClassLoader/Assert.sh Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/ClassLoader/Assert.sh Wed Dec 16 16:25:08 2009 -0800
@@ -47,7 +47,7 @@
cp -R ${TESTSRC}/package1 .
cp -R ${TESTSRC}/package2 .
-${TESTJAVA}/bin/javac -source 1.4 Assert.java
+${TESTJAVA}/bin/javac Assert.java
${TESTJAVA}/bin/java Assert
--- a/jdk/test/java/lang/Integer/BitTwiddle.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Integer/BitTwiddle.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4495754
* @summary Basic test for int bit twiddling
* @author Josh Bloch
- *
- * @compile -source 1.5 BitTwiddle.java
- * @run main BitTwiddle
*/
import java.util.Random;
--- a/jdk/test/java/lang/Long/BitTwiddle.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Long/BitTwiddle.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4495754
* @summary Basic test for long bit twiddling
* @author Josh Bloch
- *
- * @compile -source 1.5 BitTwiddle.java
- * @run main BitTwiddle
*/
import java.util.Random;
--- a/jdk/test/java/lang/Math/Atan2Tests.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Math/Atan2Tests.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,8 +25,6 @@
* @test
* @bug 4984407
* @summary Tests for {Math, StrictMath}.atan2
- * @compile -source 1.5 Atan2Tests.java
- * @run main Atan2Tests
* @author Joseph D. Darcy
*/
--- a/jdk/test/java/lang/Math/IeeeRecommendedTests.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Math/IeeeRecommendedTests.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 4860891 4826732 4780454 4939441 4826652
* @summary Tests for IEEE 754[R] recommended functions and similar methods
* @author Joseph D. Darcy
- * @compile -source 1.5 IeeeRecommendedTests.java
- * @run main IeeeRecommendedTests
*/
import sun.misc.FpUtils;
--- a/jdk/test/java/lang/Math/PowTests.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Math/PowTests.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,8 +25,6 @@
* @test
* @bug 4984407 5033578
* @summary Tests for {Math, StrictMath}.pow
- * @compile -source 1.5 PowTests.java
- * @run main PowTests
* @author Joseph D. Darcy
*/
--- a/jdk/test/java/lang/Math/TanTests.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Math/TanTests.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,8 +25,6 @@
* @test
* @bug 5033578
* @summary Tests for {Math, StrictMath}.tan
- * @compile -source 1.5 TanTests.java
- * @run main TanTests
* @author Joseph D. Darcy
*/
--- a/jdk/test/java/lang/Runtime/exec/WinCommand.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Runtime/exec/WinCommand.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,9 +25,6 @@
* @bug 5006520
* @summary Check many different ways to run Windows programs
* @author Martin Buchholz
- *
- * @compile -source 1.5 WinCommand.java
- * @run main WinCommand
*/
import java.io.*;
--- a/jdk/test/java/lang/Thread/GenerifyStackTraces.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Thread/GenerifyStackTraces.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4919105
* @summary Generified basic unit test of Thread.getAllStackTraces()
* @author Mandy Chung
- *
- * @compile -source 1.5 GenerifyStackTraces.java
- * @run main GenerifyStackTraces
*/
import java.util.*;
--- a/jdk/test/java/lang/Thread/UncaughtExceptions.sh Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/Thread/UncaughtExceptions.sh Wed Dec 16 16:25:08 2009 -0800
@@ -121,7 +121,7 @@
}
EOJAVA
- Sys "$javac" "-source" "1.5" "Seppuku.java"
+ Sys "$javac" "Seppuku.java"
CheckCommandResults "$expectedRC" "$expectedOut" "$expectedErr" \
"$java" "Seppuku"
Cleanup
--- a/jdk/test/java/lang/annotation/UnitTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/annotation/UnitTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 4906359 4963461 4965058 4965039 4986770
* @summary Unit test for annotation reading
* @author Josh Bloch
- * @compile -source 1.5 UnitTest.java
- * @run main UnitTest
*/
import static java.lang.annotation.RetentionPolicy.RUNTIME;
--- a/jdk/test/java/lang/annotation/package-info.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/annotation/package-info.java Wed Dec 16 16:25:08 2009 -0800
@@ -27,7 +27,7 @@
* @summary Package annotations
* @author gafter
*
- * @compile -source 1.5 package-info.java PackageMain.java
+ * @compile package-info.java PackageMain.java
* @run main PackageMain
*/
--- a/jdk/test/java/lang/management/CompositeData/MemoryNotifInfoCompositeData.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/management/CompositeData/MemoryNotifInfoCompositeData.java Wed Dec 16 16:25:08 2009 -0800
@@ -29,7 +29,7 @@
* the input CompositeData is invalid.
* @author Mandy Chung
*
- * @compile -source 1.5 OpenTypeConverter.java
+ * @compile OpenTypeConverter.java
* @build MemoryNotifInfoCompositeData
* @run main MemoryNotifInfoCompositeData
*/
--- a/jdk/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java Wed Dec 16 16:25:08 2009 -0800
@@ -29,7 +29,7 @@
* the input CompositeData is invalid.
* @author Mandy Chung
*
- * @compile -source 1.5 OpenTypeConverter.java
+ * @compile OpenTypeConverter.java
* @build ThreadInfoCompositeData
* @run main ThreadInfoCompositeData
*/
--- a/jdk/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 5024531
* @summary Basic Test for ManagementFactory.newPlatformMXBean().
* @author Mandy Chung
- *
- * @compile -source 1.5 MXBeanProxyTest.java
- * @run main MXBeanProxyTest
*/
import javax.management.*;
import java.lang.management.ClassLoadingMXBean;
--- a/jdk/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4947536
* @summary Basic unit test of ManagementFactory.getPlatformMBeanServer()
* @author Mandy Chung
- *
- * @compile -source 1.5 PlatformMBeanServerTest.java
- * @run main PlatformMBeanServerTest
*/
import java.lang.management.*;
--- a/jdk/test/java/lang/management/ManagementFactory/ProxyExceptions.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/management/ManagementFactory/ProxyExceptions.java Wed Dec 16 16:25:08 2009 -0800
@@ -27,9 +27,6 @@
* @summary Test type mapping of the platform MXBean proxy
* returned from Management.newPlatformMXBeanProxy().
* @author Mandy Chung
- *
- * @compile -source 1.5 ProxyExceptions.java
- * @run main ProxyExceptions
*/
import java.lang.management.*;
import javax.management.*;
--- a/jdk/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java Wed Dec 16 16:25:08 2009 -0800
@@ -28,7 +28,7 @@
* returned from Management.newPlatformMXBeanProxy().
* @author Mandy Chung
*
- * @compile -source 1.5 ProxyTypeMapping.java
+ * @compile ProxyTypeMapping.java
* @run main/othervm -verbose:gc ProxyTypeMapping
*/
import java.lang.management.*;
--- a/jdk/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java Wed Dec 16 16:25:08 2009 -0800
@@ -28,7 +28,7 @@
* MBeanServer.
* @author Mandy Chung
*
- * @compile -source 1.5 ValidateOpenTypes.java
+ * @compile ValidateOpenTypes.java
* @run main/othervm -verbose:gc ValidateOpenTypes
*/
import java.lang.management.*;
--- a/jdk/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4990512
* @summary Basic Test for RuntimeMXBean.getSystemProperties().
* @author Mandy Chung
- *
- * @compile -source 1.5 GetSystemProperties.java
- * @run main GetSystemProperties
*/
import java.lang.management.ManagementFactory;
--- a/jdk/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh Wed Dec 16 16:25:08 2009 -0800
@@ -27,7 +27,7 @@
# @summary
# @author Mandy Chung
#
-# @run compile -source 1.5 InputArgument.java
+# @run compile InputArgument.java
# @run shell TestInputArgument.sh
#
--- a/jdk/test/java/lang/reflect/Constructor/GenericStringTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/reflect/Constructor/GenericStringTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 5033583 6316717 6470106
* @summary Check toGenericString() and toString() methods
* @author Joseph D. Darcy
- * @compile -source 1.5 GenericStringTest.java
- * @run main GenericStringTest
*/
import java.lang.reflect.*;
--- a/jdk/test/java/lang/reflect/Field/GenericStringTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/reflect/Field/GenericStringTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 5033583
* @summary Check toGenericString() method
* @author Joseph D. Darcy
- * @compile -source 1.5 GenericStringTest.java
- * @run main GenericStringTest
*/
import java.lang.reflect.*;
--- a/jdk/test/java/lang/reflect/Generics/StringsAndBounds.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/reflect/Generics/StringsAndBounds.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 5015676 4987888 4997464
* @summary Testing upper bounds and availability of toString methods
* @author Joseph D. Darcy
- * @compile -source 1.5 StringsAndBounds.java
- * @run main StringsAndBounds
*/
import java.lang.reflect.*;
--- a/jdk/test/java/lang/reflect/Generics/TestC1.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/reflect/Generics/TestC1.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 4891872
* @summary Some tests for the generic core reflection api.
* @author Gilad Bracha
-* @compile -source 1.5 TestC1.java
+* @compile TestC1.java
* @run main/othervm -ea TestC1
*/
--- a/jdk/test/java/lang/reflect/Generics/TestC2.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/reflect/Generics/TestC2.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 4891872
* @summary Some tests for the generic core reflection api.
* @author Gilad Bracha
-* @compile -source 1.5 TestC2.java
+* @compile TestC2.java
* @run main/othervm -ea TestC2
*/
--- a/jdk/test/java/lang/reflect/Generics/TestN1.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/reflect/Generics/TestN1.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @bug 4891872
* @summary Some tests for the generic core reflection api.
* @author Gilad Bracha
-* @compile -source 1.5 TestN1.java
+* @compile TestN1.java
* @run main/othervm -ea TestN1
*/
--- a/jdk/test/java/lang/reflect/Generics/exceptionCauseTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/reflect/Generics/exceptionCauseTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 4981727
* @summary
* @author Joseph D. Darcy
- * @compile -source 1.5 exceptionCauseTest.java
- * @run main exceptionCauseTest
*/
import java.io.PrintStream;
--- a/jdk/test/java/lang/reflect/Generics/getAnnotationTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/reflect/Generics/getAnnotationTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 4979440
* @summary Test for signature parsing corner case
* @author Joseph D. Darcy
- * @compile -source 1.5 getAnnotationTest.java
- * @run main getAnnotationTest
*/
import java.lang.reflect.*;
--- a/jdk/test/java/lang/reflect/Method/Equals.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/reflect/Method/Equals.java Wed Dec 16 16:25:08 2009 -0800
@@ -27,7 +27,7 @@
* @summary Generic framework to test Method.equals.
*
* @clean A
- * @compile -source 1.5 Equals.java
+ * @compile Equals.java
* @run main Equals
*/
--- a/jdk/test/java/lang/reflect/Method/GenericStringTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/lang/reflect/Method/GenericStringTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 5033583 6316717 6470106
* @summary Check toGenericString() and toString() methods
* @author Joseph D. Darcy
- * @compile -source 1.5 GenericStringTest.java
- * @run main GenericStringTest
*/
import java.lang.reflect.*;
--- a/jdk/test/java/math/BigDecimal/DivideTests.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/math/BigDecimal/DivideTests.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 4851776 4907265 6177836 6876282
* @summary Some tests for the divide methods.
* @author Joseph D. Darcy
- * @compile -source 1.5 DivideTests.java
- * @run main DivideTests
*/
import java.math.*;
--- a/jdk/test/java/math/BigDecimal/IntegralDivisionTests.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/math/BigDecimal/IntegralDivisionTests.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,8 +25,6 @@
* @bug 4904082 4917089 6337226
* @summary Tests that integral division and related methods return the proper result and scale.
* @author Joseph D. Darcy
- * @compile -source 1.5 IntegralDivisionTests.java
- * @run main IntegralDivisionTests
*/
import java.math.*;
public class IntegralDivisionTests {
--- a/jdk/test/java/math/BigDecimal/PowTests.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/math/BigDecimal/PowTests.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 4916097
* @summary Some exponent over/undeflow tests for the pow method
* @author Joseph D. Darcy
- * @compile -source 1.5 PowTests.java
- * @run main PowTests
*/
import java.math.*;
--- a/jdk/test/java/math/BigDecimal/ToPlainStringTests.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/math/BigDecimal/ToPlainStringTests.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 4984872
* @summary Basic tests of toPlainString method
* @author Joseph D. Darcy
- * @compile -source 1.5 ToPlainStringTests.java
- * @run main ToPlainStringTests
*/
import java.math.*;
--- a/jdk/test/java/math/BigDecimal/ZeroScalingTests.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/math/BigDecimal/ZeroScalingTests.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 4902952 4905407 4916149
* @summary Tests that the scale of zero is propagated properly and has the proper effect.
* @author Joseph D. Darcy
- * @compile -source 1.5 ZeroScalingTests.java
- * @run main ZeroScalingTests
*/
import java.math.*;
--- a/jdk/test/java/math/RoundingMode/RoundingModeTests.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/math/RoundingMode/RoundingModeTests.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,8 +26,6 @@
* @bug 4851776 4891522 4905335
* @summary Basic tests for the RoundingMode class.
* @author Joseph D. Darcy
- * @compile -source 1.5 RoundingModeTests.java
- * @run main RoundingModeTests
*/
import java.math.RoundingMode;
--- a/jdk/test/java/net/CookieHandler/TestHttpCookie.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/net/CookieHandler/TestHttpCookie.java Wed Dec 16 16:25:08 2009 -0800
@@ -24,7 +24,7 @@
/**
* @test
* @summary Unit test for java.net.HttpCookie
- * @bug 6244040 6277796 6277801 6277808 6294071 6692802 6790677
+ * @bug 6244040 6277796 6277801 6277808 6294071 6692802 6790677 6901170
* @author Edward Wang
*/
@@ -335,6 +335,9 @@
// bug 6277801
test("set-cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT; path=\"/acme\"")
.n("CUSTOMER").v("WILE_E_COYOTE").p("/").ver(0);
+
+ // bug 6901170
+ test("set-cookie: CUSTOMER=WILE_E_COYOTE; version='1'").ver(1);
}
static void misc() {
--- a/jdk/test/java/net/ProxySelector/ProxyTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/net/ProxySelector/ProxyTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -27,7 +27,7 @@
* @summary HTTP client: Improve proxy server configuration and selection
* @library ../../../sun/net/www/httptest/
* @build ClosedChannelList HttpServer HttpTransaction HttpCallback
- * @compile -source 1.5 ProxyTest.java
+ * @compile ProxyTest.java
* @run main/othervm -Dhttp.proxyHost=inexistant -Dhttp.proxyPort=8080 ProxyTest
*/
--- a/jdk/test/java/net/URL/PerConnectionProxy.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/net/URL/PerConnectionProxy.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,7 +26,7 @@
* @summary Needs per connection proxy support for URLs
* @library ../../../sun/net/www/httptest/
* @build ClosedChannelList HttpServer HttpTransaction HttpCallback
- * @compile -source 1.5 PerConnectionProxy.java
+ * @compile PerConnectionProxy.java
* @run main/othervm -Dhttp.proxyHost=inexistant -Dhttp.proxyPort=8080 PerConnectionProxy
*/
--- a/jdk/test/java/security/cert/PKIXBuilderParameters/InvalidParameters.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/security/cert/PKIXBuilderParameters/InvalidParameters.java Wed Dec 16 16:25:08 2009 -0800
@@ -24,7 +24,7 @@
/**
* @test
* @test 4422738
- * @compile -source 1.4 -target 1.4 InvalidParameters.java
+ * @compile -source 1.4 InvalidParameters.java
* @run main InvalidParameters
* @summary Make sure PKIXBuilderParameters(Set) detects invalid
* parameters and throws correct exceptions
--- a/jdk/test/java/security/cert/PKIXParameters/InvalidParameters.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/security/cert/PKIXParameters/InvalidParameters.java Wed Dec 16 16:25:08 2009 -0800
@@ -24,7 +24,7 @@
/**
* @test
* @test 4422738
- * @compile -source 1.4 -target 1.4 InvalidParameters.java
+ * @compile -source 1.4 InvalidParameters.java
* @run main InvalidParameters
* @summary Make sure PKIXParameters(Set) and setTrustAnchors() detects invalid
* parameters and throws correct exceptions
--- a/jdk/test/java/util/AbstractList/CheckForComodification.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/AbstractList/CheckForComodification.java Wed Dec 16 16:25:08 2009 -0800
@@ -28,8 +28,6 @@
* @author Josh Bloch
*
* @ignore Bug fix temporarily removed as it uncovered other bugs (4992226)
- * @compile -source 1.5 CheckForComodification.java
- * @run main CheckForComodification
*/
import java.util.*;
--- a/jdk/test/java/util/Collections/AddAll.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/Collections/AddAll.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4822887
* @summary Basic test for Collections.addAll
* @author Josh Bloch
- *
- * @compile -source 1.5 AddAll.java
- * @run main AddAll
*/
import java.util.*;
--- a/jdk/test/java/util/Collections/Disjoint.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/Collections/Disjoint.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4339792
* @summary Basic test for Collections.disjoint
* @author Josh Bloch
- *
- * @compile -source 1.5 Disjoint.java
- * @run main Disjoint
*/
import java.util.*;
--- a/jdk/test/java/util/Collections/Frequency.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/Collections/Frequency.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4193200
* @summary Basic test for Collections.frequency
* @author Josh Bloch
- *
- * @compile -source 1.5 Frequency.java
- * @run main Frequency
*/
import java.util.*;
--- a/jdk/test/java/util/EnumMap/EnumMapBash.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/EnumMap/EnumMapBash.java Wed Dec 16 16:25:08 2009 -0800
@@ -27,9 +27,6 @@
* @summary Unit test for EnumMap
* @author Josh Bloch
* @author Yo Yo Ma
- *
- * @compile -source 1.5 EnumMapBash.java
- * @run main EnumMapBash
*/
import java.util.*;
--- a/jdk/test/java/util/EnumSet/AllOf.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/EnumSet/AllOf.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4946090
* @summary AllOf static factory is broken in Regular and Jumbo enum set
* @author Josh Bloch
- *
- * @compile -source 1.5 AllOf.java
- * @run main AllOf
*/
import java.util.*;
--- a/jdk/test/java/util/EnumSet/ComplementOf.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/EnumSet/ComplementOf.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4946096
* @summary ComplementOf static factory is broken in Regular and Jumbo enum set
* @author Josh Bloch
- *
- * @compile -source 1.5 ComplementOf.java
- * @run main ComplementOf
*/
import java.util.*;
--- a/jdk/test/java/util/EnumSet/EnumSetBash.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/EnumSet/EnumSetBash.java Wed Dec 16 16:25:08 2009 -0800
@@ -28,9 +28,6 @@
* @author Josh Bloch
* @author Neal Gafter
* @author Yo Ma Ma
- *
- * @compile -source 1.5 EnumSetBash.java
- * @run main EnumSetBash
*/
import java.util.*;
--- a/jdk/test/java/util/EnumSet/JumboRange.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/EnumSet/JumboRange.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4958003
* @summary Range static factory fails to compute size in Jumbo enum set
* @author Josh Bloch
- *
- * @compile -source 1.5 JumboRange.java
- * @run main JumboRange
*/
import java.util.*;
--- a/jdk/test/java/util/EnumSet/Range.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/EnumSet/Range.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4952736
* @summary Range static factory is broken in Regular and Jumbo enum set
* @author Josh Bloch
- *
- * @compile -source 1.5 Range.java
- * @run main Range
*/
import java.util.*;
--- a/jdk/test/java/util/Formattable/StockName.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/Formattable/StockName.java Wed Dec 16 16:25:08 2009 -0800
@@ -21,11 +21,9 @@
* have any questions.
*/
-/**
+/*
* @test
* @bug 4965770 4992540 5030716
- * @compile -source 1.5 StockName.java
- * @run main StockName
*/
import java.nio.CharBuffer;
--- a/jdk/test/java/util/Formatter/Basic-X.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1712 +0,0 @@
-/*
- * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-/* Type-specific source code for unit test
- *
- * Regenerate the BasicX classes via genBasic.sh whenever this file changes.
- * We check in the generated source files so that the test tree can be used
- * independently of the rest of the source tree.
- */
-
-#warn This file is preprocessed before being compiled
-
-import java.io.*;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.text.DateFormatSymbols;
-import java.util.*;
-#if[double]
-import sun.misc.FpUtils;
-import sun.misc.DoubleConsts;
-#end[double]
-
-import static java.util.Calendar.*;
-#if[datetime]
-import static java.util.SimpleTimeZone.*;
-import java.util.regex.Pattern;
-#end[datetime]
-
-public class Basic$Type$ extends Basic {
-
- private static void test(String fs, String exp, Object ... args) {
- Formatter f = new Formatter(new StringBuilder(), Locale.US);
- f.format(fs, args);
- ck(fs, exp, f.toString());
- }
-
- private static void test(Locale l, String fs, String exp, Object ... args)
- {
- Formatter f = new Formatter(new StringBuilder(), l);
- f.format(fs, args);
- ck(fs, exp, f.toString());
- }
-
- private static void test(String fs, Object ... args) {
- Formatter f = new Formatter(new StringBuilder(), Locale.US);
- f.format(fs, args);
- ck(fs, "fail", f.toString());
- }
-
- private static void test(String fs) {
- Formatter f = new Formatter(new StringBuilder(), Locale.US);
- f.format(fs, "fail");
- ck(fs, "fail", f.toString());
- }
-
- private static void testSysOut(String fs, String exp, Object ... args) {
- FileOutputStream fos = null;
- FileInputStream fis = null;
- try {
- PrintStream saveOut = System.out;
- fos = new FileOutputStream("testSysOut");
- System.setOut(new PrintStream(fos));
- System.out.format(Locale.US, fs, args);
- fos.close();
-
- fis = new FileInputStream("testSysOut");
- byte [] ba = new byte[exp.length()];
- int len = fis.read(ba);
- String got = new String(ba);
- if (len != ba.length)
- fail(fs, exp, got);
- ck(fs, exp, got);
-
- System.setOut(saveOut);
- } catch (FileNotFoundException ex) {
- fail(fs, ex.getClass());
- } catch (IOException ex) {
- fail(fs, ex.getClass());
- } finally {
- try {
- if (fos != null)
- fos.close();
- if (fis != null)
- fis.close();
- } catch (IOException ex) {
- fail(fs, ex.getClass());
- }
- }
- }
-
- private static void tryCatch(String fs, Class<?> ex) {
- boolean caught = false;
- try {
- test(fs);
- } catch (Throwable x) {
- if (ex.isAssignableFrom(x.getClass()))
- caught = true;
- }
- if (!caught)
- fail(fs, ex);
- else
- pass();
- }
-
- private static void tryCatch(String fs, Class<?> ex, Object ... args) {
- boolean caught = false;
- try {
- test(fs, args);
- } catch (Throwable x) {
- if (ex.isAssignableFrom(x.getClass()))
- caught = true;
- }
- if (!caught)
- fail(fs, ex);
- else
- pass();
- }
-
-#if[datetime]
- private static void testDateTime(String fs, String exp, Calendar c) {
- testDateTime(fs, exp, c, true);
- }
-
- private static void testDateTime(String fs, String exp, Calendar c, boolean upper) {
- //---------------------------------------------------------------------
- // Date/Time conversions applicable to Calendar, Date, and long.
- //---------------------------------------------------------------------
-
- // Calendar
- test(fs, exp, c);
- test((Locale)null, fs, exp, c);
- test(Locale.US, fs, exp, c);
-
- // Date/long do not have timezone information so they will always use
- // the default timezone.
- String nexp = (fs.equals("%tZ") || fs.equals("%TZ")
- || fs.equals("%tc") || fs.equals("%Tc")
- ? exp.replace("PST", "GMT-08:00")
- : exp);
-
- // Date (implemented via conversion to Calendar)
- Date d = c.getTime();
- test(fs, nexp, d);
- test((Locale)null, fs, nexp, d);
- test(Locale.US, fs, nexp, d);
-
- // long (implemented via conversion to Calendar)
- long l = c.getTimeInMillis();
- test(fs, nexp, l);
- test((Locale)null, fs, nexp, l);
- test(Locale.US, fs, nexp, l);
-
- if (upper)
- // repeat all tests for upper case variant (%T)
- testDateTime(Pattern.compile("t").matcher(fs).replaceFirst("T"),
- exp.toUpperCase(), c, false);
- }
-
- private static void testHours() {
- for (int i = 0; i < 24; i++) {
- // GregorianCalendar(int year, int month, int dayOfMonth,
- // int hourOfDay, int minute, int second);
- Calendar c = new GregorianCalendar(1995, MAY, 23, i, 48, 34);
-
- //-----------------------------------------------------------------
- // DateTime.HOUR_OF_DAY - 'k' (0 - 23) -- like H
- //-----------------------------------------------------------------
- String exp = Integer.toString(i);
- testDateTime("%tk", exp, c);
-
- //-----------------------------------------------------------------
- // DateTime.HOUR - 'l' (1 - 12) -- like I
- //-----------------------------------------------------------------
- int v = i % 12;
- v = (v == 0 ? 12 : v);
- String exp2 = Integer.toString(v);
- testDateTime("%tl", exp2, c);
-
- //-----------------------------------------------------------------
- // DateTime.HOUR_OF_DAY_0 - 'H' (00 - 23) [zero padded]
- //-----------------------------------------------------------------
- if (exp.length() < 2) exp = "0" + exp;
- testDateTime("%tH", exp, c);
-
- //-----------------------------------------------------------------
- // DateTime.HOUR_0 - 'I' (01 - 12)
- //-----------------------------------------------------------------
- if (exp2.length() < 2) exp2 = "0" + exp2;
- testDateTime("%tI", exp2, c);
-
- //-----------------------------------------------------------------
- // DateTime.AM_PM - (am or pm)
- //-----------------------------------------------------------------
- testDateTime("%tp", (i <12 ? "am" : "pm"), c);
- }
- }
-#end[datetime]
-
-#if[dec]
-#if[prim]
- private static $type$ negate($type$ v) {
- return ($type$) -v;
- }
-#end[prim]
-#end[dec]
-#if[Byte]
- private static $type$ negate($type$ v) {
- return new $type$((byte) -v.byteValue());
- }
-#end[Byte]
-#if[Short]
- private static $type$ negate($type$ v) {
- return new $type$((short) -v.shortValue());
- }
-#end[Short]
-#if[Integer]
- private static $type$ negate($type$ v) {
- return new $type$(-v.intValue());
- }
-#end[Integer]
-#if[Long]
- private static $type$ negate($type$ v) {
- return new $type$(-v.longValue());
- }
-#end[Long]
-
-#if[BigDecimal]
- private static $type$ create(double v) {
- return new $type$(v);
- }
-
- private static $type$ negate($type$ v) {
- return v.negate();
- }
-
- private static $type$ mult($type$ v, double mul) {
- return v.multiply(new $type$(mul));
- }
-
- private static $type$ recip($type$ v) {
- return BigDecimal.ONE.divide(v);
- }
-#end[BigDecimal]
-#if[float]
- private static $type$ create(double v) {
- return ($type$) v;
- }
-
- private static $type$ negate(double v) {
- return ($type$) -v;
- }
-
- private static $type$ mult($type$ v, double mul) {
- return v * ($type$) mul;
- }
-
- private static $type$ recip($type$ v) {
- return 1.0f / v;
- }
-#end[float]
-#if[Float]
- private static $type$ create(double v) {
- return new $type$(v);
- }
-
- private static $type$ negate($type$ v) {
- return new $type$(-v.floatValue());
- }
-
- private static $type$ mult($type$ v, double mul) {
- return new $type$(v.floatValue() * (float) mul);
- }
-
- private static $type$ recip($type$ v) {
- return new $type$(1.0f / v.floatValue());
- }
-#end[Float]
-#if[double]
- private static $type$ create(double v) {
- return ($type$) v;
- }
-
-
- private static $type$ negate(double v) {
- return -v;
- }
-
- private static $type$ mult($type$ v, double mul) {
- return v * mul;
- }
-
- private static $type$ recip($type$ v) {
- return 1.0 / v;
- }
-#end[double]
-#if[Double]
- private static $type$ create(double v) {
- return new $type$(v);
- }
-
- private static $type$ negate($type$ v) {
- return new $type$(-v.doubleValue());
- }
-
- private static $type$ mult($type$ v, double mul) {
- return new $type$(v.doubleValue() * mul);
- }
-
- private static $type$ recip($type$ v) {
- return new $type$(1.0 / v.doubleValue());
- }
-#end[Double]
-
- public static void test() {
- TimeZone.setDefault(TimeZone.getTimeZone("GMT-0800"));
-
- // Any characters not explicitly defined as conversions, date/time
- // conversion suffixes, or flags are illegal and are reserved for
- // future extensions. Use of such a character in a format string will
- // cause an UnknownFormatConversionException or
- // UnknownFormatFlagsException to be thrown.
- tryCatch("%q", UnknownFormatConversionException.class);
- tryCatch("%t&", UnknownFormatConversionException.class);
- tryCatch("%&d", UnknownFormatConversionException.class);
- tryCatch("%^b", UnknownFormatConversionException.class);
-
- //---------------------------------------------------------------------
- // Formatter.java class javadoc examples
- //---------------------------------------------------------------------
- test(Locale.FRANCE, "e = %+10.4f", "e = +2,7183", Math.E);
- test("%4$2s %3$2s %2$2s %1$2s", " d c b a", "a", "b", "c", "d");
- test("Amount gained or lost since last statement: $ %,(.2f",
- "Amount gained or lost since last statement: $ (6,217.58)",
- (new BigDecimal("-6217.58")));
- Calendar c = new GregorianCalendar(1969, JULY, 20, 16, 17, 0);
- testSysOut("Local time: %tT", "Local time: 16:17:00", c);
-
- test("Unable to open file '%1$s': %2$s",
- "Unable to open file 'food': No such file or directory",
- "food", "No such file or directory");
- Calendar duke = new GregorianCalendar(1995, MAY, 23, 19, 48, 34);
- duke.set(Calendar.MILLISECOND, 584);
- test("Duke's Birthday: %1$tB %1$te, %1$tY",
- "Duke's Birthday: May 23, 1995",
- duke);
- test("Duke's Birthday: %1$tB %1$te, %1$tY",
- "Duke's Birthday: May 23, 1995",
- duke.getTime());
- test("Duke's Birthday: %1$tB %1$te, %1$tY",
- "Duke's Birthday: May 23, 1995",
- duke.getTimeInMillis());
-
- test("%4$s %3$s %2$s %1$s %4$s %3$s %2$s %1$s",
- "d c b a d c b a", "a", "b", "c", "d");
- test("%s %s %<s %<s", "a b b b", "a", "b", "c", "d");
- test("%s %s %s %s", "a b c d", "a", "b", "c", "d");
- test("%2$s %s %<s %s", "b a a b", "a", "b", "c", "d");
-
- //---------------------------------------------------------------------
- // %b
- //
- // General conversion applicable to any argument.
- //---------------------------------------------------------------------
- test("%b", "true", true);
- test("%b", "false", false);
- test("%B", "TRUE", true);
- test("%B", "FALSE", false);
- test("%b", "true", Boolean.TRUE);
- test("%b", "false", Boolean.FALSE);
- test("%B", "TRUE", Boolean.TRUE);
- test("%B", "FALSE", Boolean.FALSE);
- test("%14b", " true", true);
- test("%-14b", "true ", true);
- test("%5.1b", " f", false);
- test("%-5.1b", "f ", false);
-
- test("%b", "true", "foo");
- test("%b", "false", (Object)null);
-
- // Boolean.java hardcodes the Strings for "true" and "false", so no
- // localization is possible.
- test(Locale.FRANCE, "%b", "true", true);
- test(Locale.FRANCE, "%b", "false", false);
-
- // If you pass in a single array to a varargs method, the compiler
- // uses it as the array of arguments rather than treating it as a
- // single array-type argument.
- test("%b", "false", (Object[])new String[2]);
- test("%b", "true", new String[2], new String[2]);
-
- int [] ia = { 1, 2, 3 };
- test("%b", "true", ia);
-
- //---------------------------------------------------------------------
- // %b - errors
- //---------------------------------------------------------------------
- tryCatch("%#b", FormatFlagsConversionMismatchException.class);
- tryCatch("%-b", MissingFormatWidthException.class);
- // correct or side-effect of implementation?
- tryCatch("%.b", UnknownFormatConversionException.class);
- tryCatch("%,b", FormatFlagsConversionMismatchException.class);
-
- //---------------------------------------------------------------------
- // %c
- //
- // General conversion applicable to any argument.
- //---------------------------------------------------------------------
- test("%c", "i", 'i');
- test("%C", "I", 'i');
- test("%4c", " i", 'i');
- test("%-4c", "i ", 'i');
- test("%4C", " I", 'i');
- test("%-4C", "I ", 'i');
- test("%c", "i", new Character('i'));
- test("%c", "H", (byte) 72);
- test("%c", "i", (short) 105);
- test("%c", "!", (int) 33);
- test("%c", "\u007F", Byte.MAX_VALUE);
- test("%c", new String(Character.toChars(Short.MAX_VALUE)),
- Short.MAX_VALUE);
- test("%c", "null", (Object) null);
-
- //---------------------------------------------------------------------
- // %c - errors
- //---------------------------------------------------------------------
- tryCatch("%c", IllegalFormatConversionException.class,
- Boolean.TRUE);
- tryCatch("%c", IllegalFormatConversionException.class,
- (float) 0.1);
- tryCatch("%c", IllegalFormatConversionException.class,
- new Object());
- tryCatch("%c", IllegalFormatCodePointException.class,
- Byte.MIN_VALUE);
- tryCatch("%c", IllegalFormatCodePointException.class,
- Short.MIN_VALUE);
- tryCatch("%c", IllegalFormatCodePointException.class,
- Integer.MIN_VALUE);
- tryCatch("%c", IllegalFormatCodePointException.class,
- Integer.MAX_VALUE);
-
- tryCatch("%#c", FormatFlagsConversionMismatchException.class);
- tryCatch("%,c", FormatFlagsConversionMismatchException.class);
- tryCatch("%(c", FormatFlagsConversionMismatchException.class);
- tryCatch("%$c", UnknownFormatConversionException.class);
- tryCatch("%.2c", IllegalFormatPrecisionException.class);
-
- //---------------------------------------------------------------------
- // %s
- //
- // General conversion applicable to any argument.
- //---------------------------------------------------------------------
- test("%s", "Hello, Duke", "Hello, Duke");
- test("%S", "HELLO, DUKE", "Hello, Duke");
- test("%20S", " HELLO, DUKE", "Hello, Duke");
- test("%20s", " Hello, Duke", "Hello, Duke");
- test("%-20s", "Hello, Duke ", "Hello, Duke");
- test("%-20.5s", "Hello ", "Hello, Duke");
- test("%s", "null", (Object)null);
-
- StringBuffer sb = new StringBuffer("foo bar");
- test("%s", sb.toString(), sb);
- test("%S", sb.toString().toUpperCase(), sb);
-
- //---------------------------------------------------------------------
- // %s - errors
- //---------------------------------------------------------------------
- tryCatch("%-s", MissingFormatWidthException.class);
- tryCatch("%--s", DuplicateFormatFlagsException.class);
- tryCatch("%#s", FormatFlagsConversionMismatchException.class, 0);
- tryCatch("%#s", FormatFlagsConversionMismatchException.class, 0.5f);
- tryCatch("%#s", FormatFlagsConversionMismatchException.class, "hello");
- tryCatch("%#s", FormatFlagsConversionMismatchException.class, null);
-
- //---------------------------------------------------------------------
- // %h
- //
- // General conversion applicable to any argument.
- //---------------------------------------------------------------------
- test("%h", Integer.toHexString("Hello, Duke".hashCode()),
- "Hello, Duke");
- test("%10h", " ddf63471", "Hello, Duke");
- test("%-10h", "ddf63471 ", "Hello, Duke");
- test("%-10H", "DDF63471 ", "Hello, Duke");
- test("%10h", " 402e0000", 15.0);
- test("%10H", " 402E0000", 15.0);
-
- //---------------------------------------------------------------------
- // %h - errors
- //---------------------------------------------------------------------
- tryCatch("%#h", FormatFlagsConversionMismatchException.class);
-
- //---------------------------------------------------------------------
- // flag/conversion errors
- //---------------------------------------------------------------------
- tryCatch("%F", UnknownFormatConversionException.class);
-
- tryCatch("%#g", FormatFlagsConversionMismatchException.class);
-
-#if[dec]
-
-#if[prim]
- $type$ minByte = Byte.MIN_VALUE; // -128
-#else[prim]
- $type$ minByte = new $type$(Byte.MIN_VALUE);
-#end[prim]
-
- //---------------------------------------------------------------------
- // %d
- //
- // Numeric conversion applicable to byte, short, int, long, and
- // BigInteger.
- //---------------------------------------------------------------------
- test("%d", "null", (Object)null);
-
-#if[byte]
-#if[prim]
- //---------------------------------------------------------------------
- // %d - byte
- //---------------------------------------------------------------------
- $type$ seventeen = ($type$) 17;
- test("%d", "17", seventeen);
- test("%,d", "17", seventeen);
- test("%,d", "-17", negate(seventeen));
- test("%(d", "17", seventeen);
- test("%(d", "(17)", negate(seventeen));
- test("% d", " 17", seventeen);
- test("% d", "-17", negate(seventeen));
- test("%+d", "+17", seventeen);
- test("%+d", "-17", negate(seventeen));
- test("%010d", "0000000017", seventeen);
- test("%010d", "-000000017", negate(seventeen));
- test("%(10d", " (17)", negate(seventeen));
- test("%-10d", "17 ", seventeen);
- test("%-10d", "-17 ", negate(seventeen));
-#end[prim]
-#else[byte]
-#if[short]
- //---------------------------------------------------------------------
- // %d - short
- //---------------------------------------------------------------------
- $type$ oneToFive = ($type$) 12345;
- test("%d", "12345", oneToFive);
- test("%,d", "12,345", oneToFive);
- test("%,d", "-12,345", negate(oneToFive));
- test("%(d", "12345", oneToFive);
- test("%(d", "(12345)", negate(oneToFive));
- test("% d", " 12345", oneToFive);
- test("% d", "-12345", negate(oneToFive));
- test("%+d", "+12345", oneToFive);
- test("%+d", "-12345", negate(oneToFive));
- test("%010d", "0000012345", oneToFive);
- test("%010d", "-000012345", negate(oneToFive));
- test("%(10d", " (12345)", negate(oneToFive));
- test("%-10d", "12345 ", oneToFive);
- test("%-10d", "-12345 ", negate(oneToFive));
-
-#else[short]
-#if[prim]
- //---------------------------------------------------------------------
- // %d - int and long
- //---------------------------------------------------------------------
- $type$ oneToSeven = ($type$) 1234567;
- test("%d", "1234567", oneToSeven);
- test("%,d", "1,234,567", oneToSeven);
- test(Locale.FRANCE, "%,d", "1\u00a0234\u00a0567", oneToSeven);
- test("%,d", "-1,234,567", negate(oneToSeven));
- test("%(d", "1234567", oneToSeven);
- test("%(d", "(1234567)", negate(oneToSeven));
- test("% d", " 1234567", oneToSeven);
- test("% d", "-1234567", negate(oneToSeven));
- test("%+d", "+1234567", oneToSeven);
- test("%+d", "-1234567", negate(oneToSeven));
- test("%010d", "0001234567", oneToSeven);
- test("%010d", "-001234567", negate(oneToSeven));
- test("%(10d", " (1234567)", negate(oneToSeven));
- test("%-10d", "1234567 ", oneToSeven);
- test("%-10d", "-1234567 ", negate(oneToSeven));
-#end[prim]
-#end[short]
-#end[byte]
- //---------------------------------------------------------------------
- // %d - errors
- //---------------------------------------------------------------------
- tryCatch("%#d", FormatFlagsConversionMismatchException.class);
- tryCatch("%D", UnknownFormatConversionException.class);
- tryCatch("%0d", MissingFormatWidthException.class);
- tryCatch("%-d", MissingFormatWidthException.class);
- tryCatch("%7.3d", IllegalFormatPrecisionException.class);
-
- //---------------------------------------------------------------------
- // %o
- //
- // Numeric conversion applicable to byte, short, int, long, and
- // BigInteger.
- //---------------------------------------------------------------------
- test("%o", "null", (Object)null);
-
-#if[byte]
- //---------------------------------------------------------------------
- // %o - byte
- //---------------------------------------------------------------------
- test("%010o", "0000000200", minByte);
- test("%-10o", "200 ", minByte);
- test("%#10o", " 0200", minByte);
-#end[byte]
-#if[short]
- //---------------------------------------------------------------------
- // %o - short
- //---------------------------------------------------------------------
-
- test("%010o", "0000177600", minByte);
- test("%-10o", "177600 ", minByte);
- test("%#10o", " 0177600", minByte);
-#end[short]
-#if[int]
- //---------------------------------------------------------------------
- // %o - int
- //---------------------------------------------------------------------
- test("%014o", "00037777777600", minByte);
- test("%-14o", "37777777600 ", minByte);
- test("%#14o", " 037777777600", minByte);
-
- $type$ oneToSevenOct = ($type$) 1234567;
- test("%o", "4553207", oneToSevenOct);
- test("%010o", "0004553207", oneToSevenOct);
- test("%-10o", "4553207 ", oneToSevenOct);
- test("%#10o", " 04553207", oneToSevenOct);
-#end[int]
-#if[long]
- //---------------------------------------------------------------------
- // %o - long
- //---------------------------------------------------------------------
- test("%024o", "001777777777777777777600", minByte);
- test("%-24o", "1777777777777777777600 ", minByte);
- test("%#24o", " 01777777777777777777600", minByte);
-
- $type$ oneToSevenOct = ($type$) 1234567;
- test("%o", "4553207", oneToSevenOct);
- test("%010o", "0004553207", oneToSevenOct);
- test("%-10o", "4553207 ", oneToSevenOct);
- test("%#10o", " 04553207", oneToSevenOct);
-#end[long]
-
- //---------------------------------------------------------------------
- // %o - errors
- //---------------------------------------------------------------------
- tryCatch("%(o", FormatFlagsConversionMismatchException.class,
- minByte);
- tryCatch("%+o", FormatFlagsConversionMismatchException.class,
- minByte);
- tryCatch("% o", FormatFlagsConversionMismatchException.class,
- minByte);
- tryCatch("%0o", MissingFormatWidthException.class);
- tryCatch("%-o", MissingFormatWidthException.class);
- tryCatch("%,o", FormatFlagsConversionMismatchException.class);
- tryCatch("%O", UnknownFormatConversionException.class);
-
- //---------------------------------------------------------------------
- // %x
- //
- // Numeric conversion applicable to byte, short, int, long, and
- // BigInteger.
- //---------------------------------------------------------------------
- test("%x", "null", (Object)null);
-
-#if[byte]
- //---------------------------------------------------------------------
- // %x - byte
- //---------------------------------------------------------------------
- test("%010x", "0000000080", minByte);
- test("%-10x", "80 ", minByte);
- test("%#10x", " 0x80", minByte);
- test("%0#10x","0x00000080", minByte);
- test("%#10X", " 0X80", minByte);
- test("%X", "80", minByte);
-#end[byte]
-#if[short]
- //---------------------------------------------------------------------
- // %x - short
- //---------------------------------------------------------------------
- test("%010x", "000000ff80", minByte);
- test("%-10x", "ff80 ", minByte);
- test("%#10x", " 0xff80", minByte);
- test("%0#10x","0x0000ff80", minByte);
- test("%#10X", " 0XFF80", minByte);
- test("%X", "FF80", minByte);
-#end[short]
-#if[int]
- //---------------------------------------------------------------------
- // %x - int
- //---------------------------------------------------------------------
- $type$ oneToSevenHex = ($type$)1234567;
- test("%x", "null", (Object)null);
- test("%x", "12d687", oneToSevenHex);
- test("%010x", "000012d687", oneToSevenHex);
- test("%-10x", "12d687 ", oneToSevenHex);
- test("%#10x", " 0x12d687", oneToSevenHex);
- test("%#10X", " 0X12D687",oneToSevenHex);
- test("%X", "12D687", oneToSevenHex);
-
- test("%010x", "00ffffff80", minByte);
- test("%-10x", "ffffff80 ", minByte);
- test("%#10x", "0xffffff80", minByte);
- test("%0#12x","0x00ffffff80", minByte);
- test("%#12X", " 0XFFFFFF80", minByte);
- test("%X", "FFFFFF80", minByte);
-#end[int]
-#if[long]
- //---------------------------------------------------------------------
- // %x - long
- //---------------------------------------------------------------------
- $type$ oneToSevenHex = ($type$)1234567;
- test("%x", "null", (Object)null);
- test("%x", "12d687", oneToSevenHex);
- test("%010x", "000012d687", oneToSevenHex);
- test("%-10x", "12d687 ", oneToSevenHex);
- test("%#10x", " 0x12d687", oneToSevenHex);
- test("%#10X", " 0X12D687",oneToSevenHex);
- test("%X", "12D687", oneToSevenHex);
-
- test("%018x", "00ffffffffffffff80", minByte);
- test("%-18x", "ffffffffffffff80 ", minByte);
- test("%#20x", " 0xffffffffffffff80", minByte);
- test("%0#20x", "0x00ffffffffffffff80", minByte);
- test("%#20X", " 0XFFFFFFFFFFFFFF80", minByte);
- test("%X", "FFFFFFFFFFFFFF80", minByte);
-#end[long]
- //---------------------------------------------------------------------
- // %x - errors
- //---------------------------------------------------------------------
- tryCatch("%,x", FormatFlagsConversionMismatchException.class);
- tryCatch("%0x", MissingFormatWidthException.class);
- tryCatch("%-x", MissingFormatWidthException.class);
-
-#end[dec]
-
-#if[BigInteger]
- //---------------------------------------------------------------------
- // BigInteger - errors
- //---------------------------------------------------------------------
- tryCatch("%f", IllegalFormatConversionException.class,
- new BigInteger("1"));
-
- //---------------------------------------------------------------------
- // %d - BigInteger
- //---------------------------------------------------------------------
- test("%d", "null", (Object)null);
- test("%d", "1234567", new BigInteger("1234567", 10));
- test("%,d", "1,234,567", new BigInteger("1234567", 10));
- test(Locale.FRANCE, "%,d", "1\u00a0234\u00a0567", new BigInteger("1234567", 10));
- test("%,d", "-1,234,567", new BigInteger("-1234567", 10));
- test("%(d", "1234567", new BigInteger("1234567", 10));
- test("%(d", "(1234567)", new BigInteger("-1234567", 10));
- test("% d", " 1234567", new BigInteger("1234567", 10));
- test("% d", "-1234567", new BigInteger("-1234567", 10));
- test("%+d", "+1234567", new BigInteger("1234567", 10));
- test("%+d", "-1234567", new BigInteger("-1234567", 10));
- test("%010d", "0001234567", new BigInteger("1234567", 10));
- test("%010d", "-001234567", new BigInteger("-1234567", 10));
- test("%(10d", " (1234567)", new BigInteger("-1234567", 10));
- test("%+d", "+1234567", new BigInteger("1234567", 10));
- test("%+d", "-1234567", new BigInteger("-1234567", 10));
- test("%-10d", "1234567 ", new BigInteger("1234567", 10));
- test("%-10d", "-1234567 ", new BigInteger("-1234567", 10));
-
- //---------------------------------------------------------------------
- // %o - BigInteger
- //---------------------------------------------------------------------
- test("%o", "null", (Object)null);
- test("%o", "1234567", new BigInteger("1234567", 8));
- test("%(o", "1234567", new BigInteger("1234567", 8));
- test("%(o", "(1234567)", new BigInteger("-1234567", 8));
- test("% o", " 1234567", new BigInteger("1234567", 8));
- test("% o", "-1234567", new BigInteger("-1234567", 8));
- test("%+o", "+1234567", new BigInteger("1234567", 8));
- test("%+o", "-1234567", new BigInteger("-1234567", 8));
- test("%010o", "0001234567", new BigInteger("1234567", 8));
- test("%010o", "-001234567", new BigInteger("-1234567", 8));
- test("%(10o", " (1234567)", new BigInteger("-1234567", 8));
- test("%+o", "+1234567", new BigInteger("1234567", 8));
- test("%+o", "-1234567", new BigInteger("-1234567", 8));
- test("%-10o", "1234567 ", new BigInteger("1234567", 8));
- test("%-10o", "-1234567 ", new BigInteger("-1234567", 8));
- test("%#10o", " 01234567", new BigInteger("1234567", 8));
- test("%#10o", " -01234567", new BigInteger("-1234567", 8));
-
- //---------------------------------------------------------------------
- // %x - BigInteger
- //---------------------------------------------------------------------
- test("%x", "null", (Object)null);
- test("%x", "1234567", new BigInteger("1234567", 16));
- test("%(x", "1234567", new BigInteger("1234567", 16));
- test("%(x", "(1234567)", new BigInteger("-1234567", 16));
- test("% x", " 1234567", new BigInteger("1234567", 16));
- test("% x", "-1234567", new BigInteger("-1234567", 16));
- test("%+x", "+1234567", new BigInteger("1234567", 16));
- test("%+x", "-1234567", new BigInteger("-1234567", 16));
- test("%010x", "0001234567", new BigInteger("1234567", 16));
- test("%010x", "-001234567", new BigInteger("-1234567", 16));
- test("%(10x", " (1234567)", new BigInteger("-1234567", 16));
- test("%+x", "+1234567", new BigInteger("1234567", 16));
- test("%+x", "-1234567", new BigInteger("-1234567", 16));
- test("%-10x", "1234567 ", new BigInteger("1234567", 16));
- test("%-10x", "-1234567 ", new BigInteger("-1234567", 16));
- test("%#10x", " 0x1234567", new BigInteger("1234567", 16));
- test("%#10x", "-0x1234567", new BigInteger("-1234567", 16));
- test("%#10X", " 0X1234567", new BigInteger("1234567", 16));
- test("%#10X", "-0X1234567", new BigInteger("-1234567", 16));
- test("%X", "1234567A", new BigInteger("1234567a", 16));
- test("%X", "-1234567A", new BigInteger("-1234567a", 16));
-#end[BigInteger]
-
-#if[fp]
-#if[BigDecimal]
- //---------------------------------------------------------------------
- // %s - BigDecimal
- //---------------------------------------------------------------------
- $type$ one = BigDecimal.ONE;
- $type$ ten = BigDecimal.TEN;
- $type$ pi = new $type$(Math.PI);
- $type$ piToThe300 = pi.pow(300);
-
- test("%s", "3.141592653589793115997963468544185161590576171875", pi);
-#end[BigDecimal]
-#if[float]
- //---------------------------------------------------------------------
- // %s - float
- //---------------------------------------------------------------------
- $type$ one = 1.0f;
- $type$ ten = 10.0f;
- $type$ pi = (float) Math.PI;
-
- test("%s", "3.1415927", pi);
-#end[float]
-#if[Float]
- //---------------------------------------------------------------------
- // %s - Float
- //---------------------------------------------------------------------
- $type$ one = new $type$(1.0f);
- $type$ ten = new $type$(10.0f);
- $type$ pi = new $type$(Math.PI);
-
- test("%s", "3.1415927", pi);
-#end[Float]
-#if[double]
- //---------------------------------------------------------------------
- // %s - double
- //---------------------------------------------------------------------
- $type$ one = 1.0;
- $type$ ten = 10.0;
- $type$ pi = Math.PI;
-
- test("%s", "3.141592653589793", pi);
-#end[double]
-#if[Double]
- //---------------------------------------------------------------------
- // %s - Double
- //---------------------------------------------------------------------
- $type$ one = new $type$(1.0);
- $type$ ten = new $type$(10.0);
- $type$ pi = new $type$(Math.PI);
-
- test("%s", "3.141592653589793", pi);
-#end[Double]
-
- //---------------------------------------------------------------------
- // flag/conversion errors
- //---------------------------------------------------------------------
- tryCatch("%d", IllegalFormatConversionException.class, one);
- tryCatch("%,.4e", FormatFlagsConversionMismatchException.class, one);
-
- //---------------------------------------------------------------------
- // %e
- //
- // Floating-point conversions applicable to float, double, and
- // BigDecimal.
- //---------------------------------------------------------------------
- test("%e", "null", (Object)null);
-
- //---------------------------------------------------------------------
- // %e - float and double
- //---------------------------------------------------------------------
- // double PI = 3.141 592 653 589 793 238 46;
- test("%e", "3.141593e+00", pi);
- test("%.0e", "1e+01", ten);
- test("%#.0e", "1.e+01", ten);
- test("%E", "3.141593E+00", pi);
- test("%10.3e", " 3.142e+00", pi);
- test("%10.3e", "-3.142e+00", negate(pi));
- test("%010.3e", "03.142e+00", pi);
- test("%010.3e", "-3.142e+00", negate(pi));
- test("%-12.3e", "3.142e+00 ", pi);
- test("%-12.3e", "-3.142e+00 ", negate(pi));
- test("%.3e", "3.142e+00", pi);
- test("%.3e", "-3.142e+00", negate(pi));
- test("%.3e", "3.142e+06", mult(pi, 1000000.0));
- test("%.3e", "-3.142e+06", mult(pi, -1000000.0));
-
- test(Locale.FRANCE, "%e", "3,141593e+00", pi);
-
- // double PI^300
- // = 13962455701329742638131355433930076081862072808 ... e+149
-#if[BigDecimal]
- //---------------------------------------------------------------------
- // %e - BigDecimal
- //---------------------------------------------------------------------
- test("%.3e", "1.396e+149", piToThe300);
- test("%.3e", "-1.396e+149", piToThe300.negate());
- test("%.3e", "1.000e-100", recip(ten.pow(100)));
- test("%.3e", "-1.000e-100", negate(recip(ten.pow(100))));
-
- test("%3.0e", "1e-06", new BigDecimal("0.000001"));
- test("%3.0e", "1e-05", new BigDecimal("0.00001"));
- test("%3.0e", "1e-04", new BigDecimal("0.0001"));
- test("%3.0e", "1e-03", new BigDecimal("0.001"));
- test("%3.0e", "1e-02", new BigDecimal("0.01"));
- test("%3.0e", "1e-01", new BigDecimal("0.1"));
- test("%3.0e", "9e-01", new BigDecimal("0.9"));
- test("%3.1e", "9.0e-01", new BigDecimal("0.9"));
- test("%3.0e", "1e+00", new BigDecimal("1.00"));
- test("%3.0e", "1e+01", new BigDecimal("10.00"));
- test("%3.0e", "1e+02", new BigDecimal("99.19"));
- test("%3.1e", "9.9e+01", new BigDecimal("99.19"));
- test("%3.0e", "1e+02", new BigDecimal("99.99"));
- test("%3.0e", "1e+02", new BigDecimal("100.00"));
- test("%#3.0e", "1.e+03", new BigDecimal("1000.00"));
- test("%3.0e", "1e+04", new BigDecimal("10000.00"));
- test("%3.0e", "1e+05", new BigDecimal("100000.00"));
- test("%3.0e", "1e+06", new BigDecimal("1000000.00"));
- test("%3.0e", "1e+07", new BigDecimal("10000000.00"));
- test("%3.0e", "1e+08", new BigDecimal("100000000.00"));
-#end[BigDecimal]
-
- test("%10.3e", " 1.000e+00", one);
- test("%+.3e", "+3.142e+00", pi);
- test("%+.3e", "-3.142e+00", negate(pi));
- test("% .3e", " 3.142e+00", pi);
- test("% .3e", "-3.142e+00", negate(pi));
- test("%#.0e", "3.e+00", create(3.0));
- test("%#.0e", "-3.e+00", create(-3.0));
- test("%.0e", "3e+00", create(3.0));
- test("%.0e", "-3e+00", create(-3.0));
-
- test("%(.4e", "3.1416e+06", mult(pi, 1000000.0));
- test("%(.4e", "(3.1416e+06)", mult(pi, -1000000.0));
-
- //---------------------------------------------------------------------
- // %e - boundary problems
- //---------------------------------------------------------------------
- test("%3.0e", "1e-06", 0.000001);
- test("%3.0e", "1e-05", 0.00001);
- test("%3.0e", "1e-04", 0.0001);
- test("%3.0e", "1e-03", 0.001);
- test("%3.0e", "1e-02", 0.01);
- test("%3.0e", "1e-01", 0.1);
- test("%3.0e", "9e-01", 0.9);
- test("%3.1e", "9.0e-01", 0.9);
- test("%3.0e", "1e+00", 1.00);
- test("%3.0e", "1e+01", 10.00);
- test("%3.0e", "1e+02", 99.19);
- test("%3.1e", "9.9e+01", 99.19);
- test("%3.0e", "1e+02", 99.99);
- test("%3.0e", "1e+02", 100.00);
- test("%#3.0e", "1.e+03", 1000.00);
- test("%3.0e", "1e+04", 10000.00);
- test("%3.0e", "1e+05", 100000.00);
- test("%3.0e", "1e+06", 1000000.00);
- test("%3.0e", "1e+07", 10000000.00);
- test("%3.0e", "1e+08", 100000000.00);
-
- //---------------------------------------------------------------------
- // %f
- //
- // Floating-point conversions applicable to float, double, and
- // BigDecimal.
- //---------------------------------------------------------------------
- test("%f", "null", (Object)null);
- test("%f", "3.141593", pi);
- test(Locale.FRANCE, "%f", "3,141593", pi);
- test("%10.3f", " 3.142", pi);
- test("%10.3f", " -3.142", negate(pi));
- test("%010.3f", "000003.142", pi);
- test("%010.3f", "-00003.142", negate(pi));
- test("%-10.3f", "3.142 ", pi);
- test("%-10.3f", "-3.142 ", negate(pi));
- test("%.3f", "3.142", pi);
- test("%.3f", "-3.142", negate(pi));
- test("%+.3f", "+3.142", pi);
- test("%+.3f", "-3.142", negate(pi));
- test("% .3f", " 3.142", pi);
- test("% .3f", "-3.142", negate(pi));
- test("%#.0f", "3.", create(3.0));
- test("%#.0f", "-3.", create(-3.0));
- test("%.0f", "3", create(3.0));
- test("%.0f", "-3", create(-3.0));
- test("%.3f", "10.000", ten);
- test("%.3f", "1.000", one);
- test("%10.3f", " 1.000", one);
-
- //---------------------------------------------------------------------
- // %f - boundary problems
- //---------------------------------------------------------------------
- test("%3.0f", " 0", 0.000001);
- test("%3.0f", " 0", 0.00001);
- test("%3.0f", " 0", 0.0001);
- test("%3.0f", " 0", 0.001);
- test("%3.0f", " 0", 0.01);
- test("%3.0f", " 0", 0.1);
- test("%3.0f", " 1", 0.9);
- test("%3.1f", "0.9", 0.9);
- test("%3.0f", " 1", 1.00);
- test("%3.0f", " 10", 10.00);
- test("%3.0f", " 99", 99.19);
- test("%3.1f", "99.2", 99.19);
- test("%3.0f", "100", 99.99);
- test("%3.0f", "100", 100.00);
- test("%#3.0f", "1000.", 1000.00);
- test("%3.0f", "10000", 10000.00);
- test("%3.0f", "100000", 100000.00);
- test("%3.0f", "1000000", 1000000.00);
- test("%3.0f", "10000000", 10000000.00);
- test("%3.0f", "100000000", 100000000.00);
-#if[BigDecimal]
- //---------------------------------------------------------------------
- // %f - BigDecimal
- //---------------------------------------------------------------------
- test("%4.0f", " 99", new BigDecimal("99.19"));
- test("%4.1f", "99.2", new BigDecimal("99.19"));
-
- BigDecimal val = new BigDecimal("99.95");
- test("%4.0f", " 100", val);
- test("%#4.0f", "100.", val);
- test("%4.1f", "100.0", val);
- test("%4.2f", "99.95", val);
- test("%4.3f", "99.950", val);
-
- val = new BigDecimal(".99");
- test("%4.1f", " 1.0", val);
- test("%4.2f", "0.99", val);
- test("%4.3f", "0.990", val);
-
- // #6476425
- val = new BigDecimal("0.00001");
- test("%.0f", "0", val);
- test("%.1f", "0.0", val);
- test("%.2f", "0.00", val);
- test("%.3f", "0.000", val);
- test("%.4f", "0.0000", val);
- test("%.5f", "0.00001", val);
-
- val = new BigDecimal("1.00001");
- test("%.0f", "1", val);
- test("%.1f", "1.0", val);
- test("%.2f", "1.00", val);
- test("%.3f", "1.000", val);
- test("%.4f", "1.0000", val);
- test("%.5f", "1.00001", val);
-
- val = new BigDecimal("1.23456");
- test("%.0f", "1", val);
- test("%.1f", "1.2", val);
- test("%.2f", "1.23", val);
- test("%.3f", "1.235", val);
- test("%.4f", "1.2346", val);
- test("%.5f", "1.23456", val);
- test("%.6f", "1.234560", val);
-
- val = new BigDecimal("9.99999");
- test("%.0f", "10", val);
- test("%.1f", "10.0", val);
- test("%.2f", "10.00", val);
- test("%.3f", "10.000", val);
- test("%.4f", "10.0000", val);
- test("%.5f", "9.99999", val);
- test("%.6f", "9.999990", val);
-
-
- val = new BigDecimal("1.99999");
- test("%.0f", "2", val);
- test("%.1f", "2.0", val);
- test("%.2f", "2.00", val);
- test("%.3f", "2.000", val);
- test("%.4f", "2.0000", val);
- test("%.5f", "1.99999", val);
- test("%.6f", "1.999990", val);
-
-#end[BigDecimal]
-
-#if[float]
- //---------------------------------------------------------------------
- // %f - float
- //---------------------------------------------------------------------
- // Float can not accurately store 1e6 * PI.
- test("%.3f", "3141.593", mult(pi, 1000.0));
- test("%.3f", "-3141.593", mult(pi, -1000.0));
-
- test("%,.2f", "3,141.59", mult(pi, 1000.0));
- test(Locale.FRANCE, "%,.2f", "3\u00a0141,59", mult(pi, 1000.0));
- test("%,.2f", "-3,141.59", mult(pi, -1000.0));
- test("%(.2f", "3141.59", mult(pi, 1000.0));
- test("%(.2f", "(3141.59)", mult(pi, -1000.0));
- test("%(,.2f", "3,141.59", mult(pi, 1000.0));
- test("%(,.2f", "(3,141.59)", mult(pi, -1000.0));
-
-#else[float]
-#if[!Float]
- //---------------------------------------------------------------------
- // %f - float, double, Double, BigDecimal
- //---------------------------------------------------------------------
- test("%.3f", "3141592.654", mult(pi, 1000000.0));
- test("%.3f", "-3141592.654", mult(pi, -1000000.0));
- test("%,.4f", "3,141,592.6536", mult(pi, 1000000.0));
- test(Locale.FRANCE, "%,.4f", "3\u00a0141\u00a0592,6536", mult(pi, 1000000.0));
- test("%,.4f", "-3,141,592.6536", mult(pi, -1000000.0));
- test("%(.4f", "3141592.6536", mult(pi, 1000000.0));
- test("%(.4f", "(3141592.6536)", mult(pi, -1000000.0));
- test("%(,.4f", "3,141,592.6536", mult(pi, 1000000.0));
- test("%(,.4f", "(3,141,592.6536)", mult(pi, -1000000.0));
-#end[!Float]
-#end[float]
-
-
- //---------------------------------------------------------------------
- // %g
- //
- // Floating-point conversions applicable to float, double, and
- // BigDecimal.
- //---------------------------------------------------------------------
- test("%g", "null", (Object)null);
- test("%g", "3.14159", pi);
- test(Locale.FRANCE, "%g", "3,14159", pi);
- test("%.0g", "1e+01", ten);
- test("%G", "3.14159", pi);
- test("%10.3g", " 3.14", pi);
- test("%10.3g", " -3.14", negate(pi));
- test("%010.3g", "0000003.14", pi);
- test("%010.3g", "-000003.14", negate(pi));
- test("%-12.3g", "3.14 ", pi);
- test("%-12.3g", "-3.14 ", negate(pi));
- test("%.3g", "3.14", pi);
- test("%.3g", "-3.14", negate(pi));
- test("%.3g", "3.14e+08", mult(pi, 100000000.0));
- test("%.3g", "-3.14e+08", mult(pi, -100000000.0));
-
- test("%.3g", "1.00e-05", recip(create(100000.0)));
- test("%.3g", "-1.00e-05", recip(create(-100000.0)));
- test("%.0g", "-1e-05", recip(create(-100000.0)));
- test("%.0g", "1e+05", create(100000.0));
- test("%.3G", "1.00E-05", recip(create(100000.0)));
- test("%.3G", "-1.00E-05", recip(create(-100000.0)));
-
- test("%3.0g", "1e-06", 0.000001);
- test("%3.0g", "1e-05", 0.00001);
- test("%3.0g", "1e-05", 0.0000099);
- test("%3.1g", "1e-05", 0.0000099);
- test("%3.2g", "9.9e-06", 0.0000099);
- test("%3.0g", "0.0001", 0.0001);
- test("%3.0g", "9e-05", 0.00009);
- test("%3.0g", "0.0001", 0.000099);
- test("%3.1g", "0.0001", 0.000099);
- test("%3.2g", "9.9e-05", 0.000099);
- test("%3.0g", "0.001", 0.001);
- test("%3.0g", "0.001", 0.00099);
- test("%3.1g", "0.001", 0.00099);
- test("%3.2g", "0.00099", 0.00099);
- test("%3.3g", "0.00100", 0.001);
- test("%3.4g", "0.001000", 0.001);
- test("%3.0g", "0.01", 0.01);
- test("%3.0g", "0.1", 0.1);
- test("%3.0g", "0.9", 0.9);
- test("%3.1g", "0.9", 0.9);
- test("%3.0g", " 1", 1.00);
- test("%3.2g", " 10", 10.00);
- test("%3.0g", "1e+01", 10.00);
- test("%3.0g", "1e+02", 99.19);
- test("%3.1g", "1e+02", 99.19);
- test("%3.2g", " 99", 99.19);
- test("%3.0g", "1e+02", 99.9);
- test("%3.1g", "1e+02", 99.9);
- test("%3.2g", "1.0e+02", 99.9);
- test("%3.0g", "1e+02", 99.99);
- test("%3.0g", "1e+02", 100.00);
- test("%3.0g", "1e+03", 999.9);
- test("%3.1g", "1e+03", 999.9);
- test("%3.2g", "1.0e+03", 999.9);
- test("%3.3g", "1.00e+03", 999.9);
- test("%3.4g", "999.9", 999.9);
- test("%3.4g", "1000", 999.99);
- test("%3.0g", "1e+03", 1000.00);
- test("%3.0g", "1e+04", 10000.00);
- test("%3.0g", "1e+05", 100000.00);
- test("%3.0g", "1e+06", 1000000.00);
- test("%3.0g", "1e+07", 10000000.00);
- test("%3.9g", "100000000", 100000000.00);
- test("%3.10g", "100000000.0", 100000000.00);
-
- tryCatch("%#3.0g", FormatFlagsConversionMismatchException.class, 1000.00);
-
- // double PI^300
- // = 13962455701329742638131355433930076081862072808 ... e+149
-#if[BigDecimal]
- //---------------------------------------------------------------------
- // %g - BigDecimal
- //---------------------------------------------------------------------
- test("%.3g", "1.40e+149", piToThe300);
- test("%.3g", "-1.40e+149", piToThe300.negate());
- test(Locale.FRANCE, "%.3g", "-1,40e+149", piToThe300.negate());
- test("%.3g", "1.00e-100", recip(ten.pow(100)));
- test("%.3g", "-1.00e-100", negate(recip(ten.pow(100))));
-
- test("%3.0g", "1e-06", new BigDecimal("0.000001"));
- test("%3.0g", "1e-05", new BigDecimal("0.00001"));
- test("%3.0g", "0.0001", new BigDecimal("0.0001"));
- test("%3.0g", "0.001", new BigDecimal("0.001"));
- test("%3.3g", "0.00100", new BigDecimal("0.001"));
- test("%3.4g", "0.001000", new BigDecimal("0.001"));
- test("%3.0g", "0.01", new BigDecimal("0.01"));
- test("%3.0g", "0.1", new BigDecimal("0.1"));
- test("%3.0g", "0.9", new BigDecimal("0.9"));
- test("%3.1g", "0.9", new BigDecimal("0.9"));
- test("%3.0g", " 1", new BigDecimal("1.00"));
- test("%3.2g", " 10", new BigDecimal("10.00"));
- test("%3.0g", "1e+01", new BigDecimal("10.00"));
- test("%3.0g", "1e+02", new BigDecimal("99.19"));
- test("%3.1g", "1e+02", new BigDecimal("99.19"));
- test("%3.2g", " 99", new BigDecimal("99.19"));
- test("%3.0g", "1e+02", new BigDecimal("99.99"));
- test("%3.0g", "1e+02", new BigDecimal("100.00"));
- test("%3.0g", "1e+03", new BigDecimal("1000.00"));
- test("%3.0g", "1e+04", new BigDecimal("10000.00"));
- test("%3.0g", "1e+05", new BigDecimal("100000.00"));
- test("%3.0g", "1e+06", new BigDecimal("1000000.00"));
- test("%3.0g", "1e+07", new BigDecimal("10000000.00"));
- test("%3.9g", "100000000", new BigDecimal("100000000.00"));
- test("%3.10g", "100000000.0", new BigDecimal("100000000.00"));
-#end[BigDecimal]
-
- test("%.3g", "10.0", ten);
- test("%.3g", "1.00", one);
- test("%10.3g", " 1.00", one);
- test("%+10.3g", " +3.14", pi);
- test("%+10.3g", " -3.14", negate(pi));
- test("% .3g", " 3.14", pi);
- test("% .3g", "-3.14", negate(pi));
- test("%.0g", "3", create(3.0));
- test("%.0g", "-3", create(-3.0));
-
- test("%(.4g", "3.142e+08", mult(pi, 100000000.0));
- test("%(.4g", "(3.142e+08)", mult(pi, -100000000.0));
-
-#if[float]
- // Float can not accurately store 1e6 * PI.
- test("%,.6g", "3,141.59", mult(pi, 1000.0));
- test("%(,.6g", "(3,141.59)", mult(pi, -1000.0));
-#else[float]
-#if[!Float]
- test("%,.11g", "3,141,592.6536", mult(pi, 1000000.0));
- test("%(,.11g", "(3,141,592.6536)", mult(pi, -1000000.0));
-#end[!Float]
-#end[float]
-
-#if[double]
- //---------------------------------------------------------------------
- // %a
- //
- // Floating-point conversions applicable to float, double, and
- // BigDecimal.
- //---------------------------------------------------------------------
- test("%a", "null", (Object)null);
- test("%.11a", "0x0.00000000000p0", 0.0);
- test(Locale.FRANCE, "%.11a", "0x0.00000000000p0", 0.0); // no localization
- test("%.1a", "0x0.0p0", 0.0);
- test("%.11a", "-0x0.00000000000p0", -0.0);
- test("%.1a", "-0x0.0p0", -0.0);
- test("%.11a", "0x1.00000000000p0", 1.0);
- test("%.1a", "0x1.0p0", 1.0);
- test("%.11a", "-0x1.00000000000p0", -1.0);
- test("%.1a", "-0x1.0p0", -1.0);
- test("%.11a", "0x1.80000000000p1", 3.0);
- test("%.1a", "0x1.8p1", 3.0);
- test("%.11a", "0x1.00000000000p-1022", DoubleConsts.MIN_NORMAL);
- test("%.1a", "0x1.0p-1022", DoubleConsts.MIN_NORMAL);
- test("%.11a", "0x1.00000000000p-1022",
- FpUtils.nextDown(DoubleConsts.MIN_NORMAL));
- test("%.1a", "0x1.0p-1022",
- FpUtils.nextDown(DoubleConsts.MIN_NORMAL));
- test("%.11a", "0x1.ffffffffffep-1023",
- Double.parseDouble("0x0.fffffffffffp-1022"));
- test("%.1a", "0x1.0p-1022",
- Double.parseDouble("0x0.fffffffffffp-1022"));
- test("%.30a", "0x0.000000000000100000000000000000p-1022", Double.MIN_VALUE);
- test("%.13a", "0x0.0000000000001p-1022", Double.MIN_VALUE);
- test("%.11a", "0x1.00000000000p-1074", Double.MIN_VALUE);
- test("%.1a", "0x1.0p-1074", Double.MIN_VALUE);
-
- test("%.11a", "0x1.08000000000p-1069",
- Double.MIN_VALUE + Double.MIN_VALUE*32);
- test("%.1a", "0x1.0p-1069",
- Double.MIN_VALUE + Double.MIN_VALUE*32);
- test("%.30a", "0x1.fffffffffffff00000000000000000p1023", Double.MAX_VALUE);
- test("%.13a", "0x1.fffffffffffffp1023", Double.MAX_VALUE);
- test("%.11a", "0x1.00000000000p1024", Double.MAX_VALUE);
- test("%.1a", "0x1.0p1024", Double.MAX_VALUE);
- test("%.11a", "0x1.18000000000p0", Double.parseDouble("0x1.18p0"));
- test("%.1a", "0x1.2p0", Double.parseDouble("0x1.18p0"));
-
- test("%.11a", "0x1.18000000000p0",
- Double.parseDouble("0x1.180000000001p0"));
- test("%.1a", "0x1.2p0",
- Double.parseDouble("0x1.180000000001p0"));
- test("%.11a", "0x1.28000000000p0", Double.parseDouble("0x1.28p0"));
- test("%.1a", "0x1.2p0", Double.parseDouble("0x1.28p0"));
-
- test("%.11a", "0x1.28000000000p0",
- Double.parseDouble("0x1.280000000001p0"));
- test("%.1a", "0x1.3p0", Double.parseDouble("0x1.280000000001p0"));
-#end[double]
-
- //---------------------------------------------------------------------
- // %f, %e, %g, %a - Boundaries
- //---------------------------------------------------------------------
-#if[float]
- //---------------------------------------------------------------------
- // %f, %e, %g, %a - NaN
- //---------------------------------------------------------------------
- test("%f", "NaN", Float.NaN);
- // s
- test("%+f", "NaN", Float.NaN);
-// test("%F", "NAN", Float.NaN);
- test("%e", "NaN", Float.NaN);
- test("%+e", "NaN", Float.NaN);
- test("%E", "NAN", Float.NaN);
- test("%g", "NaN", Float.NaN);
- test("%+g", "NaN", Float.NaN);
- test("%G", "NAN", Float.NaN);
- test("%a", "NaN", Float.NaN);
- test("%+a", "NaN", Float.NaN);
- test("%A", "NAN", Float.NaN);
-
- //---------------------------------------------------------------------
- // %f, %e, %g, %a - +0.0
- //---------------------------------------------------------------------
- test("%f", "0.000000", +0.0);
- test("%+f", "+0.000000", +0.0);
- test("% f", " 0.000000", +0.0);
-// test("%F", "0.000000", +0.0);
- test("%e", "0.000000e+00", 0e0);
- test("%e", "0.000000e+00", +0.0);
- test("%+e", "+0.000000e+00", +0.0);
- test("% e", " 0.000000e+00", +0.0);
- test("%E", "0.000000E+00", 0e0);
- test("%E", "0.000000E+00", +0.0);
- test("%+E", "+0.000000E+00", +0.0);
- test("% E", " 0.000000E+00", +0.0);
- test("%g", "0.00000", +0.0);
- test("%+g", "+0.00000", +0.0);
- test("% g", " 0.00000", +0.0);
- test("%G", "0.00000", +0.0);
- test("% G", " 0.00000", +0.0);
- test("%a", "0x0.0p0", +0.0);
- test("%+a", "+0x0.0p0", +0.0);
- test("% a", " 0x0.0p0", +0.0);
- test("%A", "0X0.0P0", +0.0);
- test("% A", " 0X0.0P0", +0.0);
-
- //---------------------------------------------------------------------
- // %f, %e, %g, %a - -0.0
- //---------------------------------------------------------------------
- test("%f", "-0.000000", -0.0);
- test("%+f", "-0.000000", -0.0);
-// test("%F", "-0.000000", -0.0);
- test("%e", "-0.000000e+00", -0.0);
- test("%+e", "-0.000000e+00", -0.0);
- test("%E", "-0.000000E+00", -0.0);
- test("%+E", "-0.000000E+00", -0.0);
- test("%g", "-0.00000", -0.0);
- test("%+g", "-0.00000", -0.0);
- test("%G", "-0.00000", -0.0);
- test("%a", "-0x0.0p0", -0.0);
- test("%+a", "-0x0.0p0", -0.0);
- test("%+A", "-0X0.0P0", -0.0);
-
- //---------------------------------------------------------------------
- // %f, %e, %g, %a - +Infinity
- //---------------------------------------------------------------------
- test("%f", "Infinity", Float.POSITIVE_INFINITY);
- test("%+f", "+Infinity", Float.POSITIVE_INFINITY);
- test("% f", " Infinity", Float.POSITIVE_INFINITY);
-// test("%F", "INFINITY", Float.POSITIVE_INFINITY);
- test("%e", "Infinity", Float.POSITIVE_INFINITY);
- test("%+e", "+Infinity", Float.POSITIVE_INFINITY);
- test("% e", " Infinity", Float.POSITIVE_INFINITY);
- test("%E", "INFINITY", Float.POSITIVE_INFINITY);
- test("%+E", "+INFINITY", Float.POSITIVE_INFINITY);
- test("% E", " INFINITY", Float.POSITIVE_INFINITY);
- test("%g", "Infinity", Float.POSITIVE_INFINITY);
- test("%+g", "+Infinity", Float.POSITIVE_INFINITY);
- test("%G", "INFINITY", Float.POSITIVE_INFINITY);
- test("% G", " INFINITY", Float.POSITIVE_INFINITY);
- test("%+G", "+INFINITY", Float.POSITIVE_INFINITY);
- test("%a", "Infinity", Float.POSITIVE_INFINITY);
- test("%+a", "+Infinity", Float.POSITIVE_INFINITY);
- test("% a", " Infinity", Float.POSITIVE_INFINITY);
- test("%A", "INFINITY", Float.POSITIVE_INFINITY);
- test("%+A", "+INFINITY", Float.POSITIVE_INFINITY);
- test("% A", " INFINITY", Float.POSITIVE_INFINITY);
-
- //---------------------------------------------------------------------
- // %f, %e, %g, %a - -Infinity
- //---------------------------------------------------------------------
- test("%f", "-Infinity", Float.NEGATIVE_INFINITY);
- test("%+f", "-Infinity", Float.NEGATIVE_INFINITY);
- test("%(f", "(Infinity)", Float.NEGATIVE_INFINITY);
-// test("%F", "-INFINITY", Float.NEGATIVE_INFINITY);
- test("%e", "-Infinity", Float.NEGATIVE_INFINITY);
- test("%+e", "-Infinity", Float.NEGATIVE_INFINITY);
- test("%E", "-INFINITY", Float.NEGATIVE_INFINITY);
- test("%+E", "-INFINITY", Float.NEGATIVE_INFINITY);
- test("%g", "-Infinity", Float.NEGATIVE_INFINITY);
- test("%+g", "-Infinity", Float.NEGATIVE_INFINITY);
- test("%G", "-INFINITY", Float.NEGATIVE_INFINITY);
- test("%+G", "-INFINITY", Float.NEGATIVE_INFINITY);
- test("%a", "-Infinity", Float.NEGATIVE_INFINITY);
- test("%+a", "-Infinity", Float.NEGATIVE_INFINITY);
- test("%A", "-INFINITY", Float.NEGATIVE_INFINITY);
- test("%+A", "-INFINITY", Float.NEGATIVE_INFINITY);
-
- //---------------------------------------------------------------------
- // %f, %e, %g, %a - Float.MIN_VALUE
- //---------------------------------------------------------------------
- test("%f", "0.000000", Float.MIN_VALUE);
- test("%,f", "0.000000", Float.MIN_VALUE);
- test("%(f", "(0.000000)", -Float.MIN_VALUE);
- test("%30.0f", " 0", Float.MIN_VALUE);
- test("%30.5f", " 0.00000", Float.MIN_VALUE);
- test("%30.13f", " 0.0000000000000", Float.MIN_VALUE);
- test("%30.20f", " 0.00000000000000000000", Float.MIN_VALUE);
- test("%e", "1.401298e-45", Float.MIN_VALUE);
- test("%E", "1.401298E-45", Float.MIN_VALUE);
- test("%(.1e", "1.4e-45", Float.MIN_VALUE);
- test("%(E", "(1.401298E-45)", -Float.MIN_VALUE);
- test("%30.5e", " 1.40130e-45", Float.MIN_VALUE);
- test("%30.13e", " 1.4012984643248e-45", Float.MIN_VALUE);
- test("%30.20e", " 1.40129846432481700000e-45", Float.MIN_VALUE);
- test("%g", "1.40130e-45", Float.MIN_VALUE);
- test("%G", "1.40130E-45", Float.MIN_VALUE);
- test("%(g", "1.40130e-45", Float.MIN_VALUE);
- test("%,g", "1.40130e-45", Float.MIN_VALUE);
- test("%(G", "(1.40130E-45)", -Float.MIN_VALUE);
- test("%30.5g", " 1.4013e-45", Float.MIN_VALUE);
- test("%30.13g", " 1.401298464325e-45", Float.MIN_VALUE);
- test("%30.20g", " 1.4012984643248170000e-45", Float.MIN_VALUE);
- test("%a", "0x1.0p-149", Float.MIN_VALUE);
- test("%A", "0X1.0P-149", Float.MIN_VALUE);
- test("%20a", " 0x1.0p-149", Float.MIN_VALUE);
-
- //---------------------------------------------------------------------
- // %f, %e, %g, %a - Float.MAX_VALUE
- //---------------------------------------------------------------------
- test("%f", "340282346638528860000000000000000000000.000000", Float.MAX_VALUE);
- test("%,f","340,282,346,638,528,860,000,000,000,000,000,000,000.000000",
- Float.MAX_VALUE);
- test("%(f", "(340282346638528860000000000000000000000.000000)", -Float.MAX_VALUE);
- test("%60.5f", " 340282346638528860000000000000000000000.00000",
- Float.MAX_VALUE);
- test("%60.13f", " 340282346638528860000000000000000000000.0000000000000",
- Float.MAX_VALUE);
- test("%61.20f", " 340282346638528860000000000000000000000.00000000000000000000",
- Float.MAX_VALUE);
- test("%e", "3.402823e+38", Float.MAX_VALUE);
- test("%E", "3.402823E+38", Float.MAX_VALUE);
- test("%(e", "3.402823e+38", Float.MAX_VALUE);
- test("%(e", "(3.402823e+38)", -Float.MAX_VALUE);
- test("%30.5e", " 3.40282e+38", Float.MAX_VALUE);
- test("%30.13e", " 3.4028234663853e+38", Float.MAX_VALUE);
- test("%30.20e", " 3.40282346638528860000e+38", Float.MAX_VALUE);
- test("%g", "3.40282e+38", Float.MAX_VALUE);
- test("%G", "3.40282E+38", Float.MAX_VALUE);
- test("%,g", "3.40282e+38", Float.MAX_VALUE);
- test("%(g", "(3.40282e+38)", -Float.MAX_VALUE);
- test("%30.5g", " 3.4028e+38", Float.MAX_VALUE);
- test("%30.13g", " 3.402823466385e+38", Float.MAX_VALUE);
- test("%30.20G", " 3.4028234663852886000E+38", Float.MAX_VALUE);
- test("%a", "0x1.fffffep127", Float.MAX_VALUE);
- test("%A", "0X1.FFFFFEP127", Float.MAX_VALUE);
- test("%20a"," 0x1.fffffep127", Float.MAX_VALUE);
-
-#end[float]
-
-#if[double]
- //---------------------------------------------------------------------
- // %f, %e, %g, %a - Double.MIN_VALUE
- //---------------------------------------------------------------------
- test("%f", "0.000000", Double.MIN_VALUE);
- test("%,f", "0.000000", Double.MIN_VALUE);
- test("%(f", "(0.000000)", -Double.MIN_VALUE);
- test("%30.0f", " 0", Double.MIN_VALUE);
- test("%30.5f", " 0.00000", Double.MIN_VALUE);
- test("%30.13f", " 0.0000000000000", Double.MIN_VALUE);
- test("%30.20f", " 0.00000000000000000000", Double.MIN_VALUE);
- test("%30.350f","0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000490000000000000000000000000",
- Double.MIN_VALUE);
- test("%e", "4.900000e-324", Double.MIN_VALUE);
- test("%E", "4.900000E-324", Double.MIN_VALUE);
- test("%(.1e", "4.9e-324", Double.MIN_VALUE);
- test("%(E", "(4.900000E-324)", -Double.MIN_VALUE);
- test("%30.5e", " 4.90000e-324", Double.MIN_VALUE);
- test("%30.13e", " 4.9000000000000e-324", Double.MIN_VALUE);
- test("%30.20e", " 4.90000000000000000000e-324", Double.MIN_VALUE);
- test("%g", "4.90000e-324", Double.MIN_VALUE);
- test("%G", "4.90000E-324", Double.MIN_VALUE);
- test("%(g", "4.90000e-324", Double.MIN_VALUE);
- test("%,g", "4.90000e-324", Double.MIN_VALUE);
- test("%30.5g", " 4.9000e-324", Double.MIN_VALUE);
- test("%30.13g", " 4.900000000000e-324", Double.MIN_VALUE);
- test("%30.20g", " 4.9000000000000000000e-324", Double.MIN_VALUE);
- test("%a", "0x0.0000000000001p-1022", Double.MIN_VALUE);
- test("%A", "0X0.0000000000001P-1022", Double.MIN_VALUE);
- test("%30a", " 0x0.0000000000001p-1022", Double.MIN_VALUE);
-
- //---------------------------------------------------------------------
- // %f, %e, %g, %a - Double.MAX_VALUE
- //---------------------------------------------------------------------
- test("%f", "179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000",
- Double.MAX_VALUE);
- test("%,f", "179,769,313,486,231,570,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000",
- Double.MAX_VALUE);
- test("%,(f", "(179,769,313,486,231,570,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000)",
- -Double.MAX_VALUE);
- test("%,30.5f", "179,769,313,486,231,570,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000",
- Double.MAX_VALUE);
- test("%30.13f", "179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000000000000",
- Double.MAX_VALUE);
- test("%30.20f", "179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000000",
- Double.MAX_VALUE);
- test("%e", "1.797693e+308", Double.MAX_VALUE);
- test("%E", "1.797693E+308", Double.MAX_VALUE);
- test("%(e", "1.797693e+308", Double.MAX_VALUE);
- test("%(e", "(1.797693e+308)", -Double.MAX_VALUE);
- test("%30.5e", " 1.79769e+308", Double.MAX_VALUE);
- test("%30.13e", " 1.7976931348623e+308", Double.MAX_VALUE);
- test("%30.20e", " 1.79769313486231570000e+308", Double.MAX_VALUE);
- test("%g", "1.79769e+308", Double.MAX_VALUE);
- test("%G", "1.79769E+308", Double.MAX_VALUE);
- test("%,g", "1.79769e+308", Double.MAX_VALUE);
- test("%(g", "(1.79769e+308)", -Double.MAX_VALUE);
- test("%30.5g", " 1.7977e+308", Double.MAX_VALUE);
- test("%30.13g", " 1.797693134862e+308", Double.MAX_VALUE);
- test("%30.20g", " 1.7976931348623157000e+308", Double.MAX_VALUE);
- test("%a", "0x1.fffffffffffffp1023", Double.MAX_VALUE);
- test("%A", "0X1.FFFFFFFFFFFFFP1023", Double.MAX_VALUE);
- test("%30a", " 0x1.fffffffffffffp1023", Double.MAX_VALUE);
-#end[double]
-
-#end[fp]
-
- //---------------------------------------------------------------------
- // %t
- //
- // Date/Time conversions applicable to Calendar, Date, and long.
- //---------------------------------------------------------------------
- test("%tA", "null", (Object)null);
- test("%TA", "NULL", (Object)null);
-
- //---------------------------------------------------------------------
- // %t - errors
- //---------------------------------------------------------------------
- tryCatch("%t", UnknownFormatConversionException.class);
- tryCatch("%T", UnknownFormatConversionException.class);
- tryCatch("%tP", UnknownFormatConversionException.class);
- tryCatch("%TP", UnknownFormatConversionException.class);
- tryCatch("%.5tB", IllegalFormatPrecisionException.class);
- tryCatch("%#tB", FormatFlagsConversionMismatchException.class);
- tryCatch("%-tB", MissingFormatWidthException.class);
-
-#if[datetime]
- //---------------------------------------------------------------------
- // %t - create test Calendar
- //---------------------------------------------------------------------
-
- // Get the supported ids for GMT-08:00 (Pacific Standard Time)
- String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
- // Create a Pacific Standard Time time zone
- SimpleTimeZone tz = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);
- // public GregorianCalendar(TimeZone zone, Locale aLocale);
- Calendar c0 = new GregorianCalendar(tz, Locale.US);
- // public final void set(int year, int month, int date,
- // int hourOfDay, int minute, int second);
- c0.set(1995, MAY, 23, 19, 48, 34);
- c0.set(Calendar.MILLISECOND, 584);
-
- //---------------------------------------------------------------------
- // %t - Minutes, {nano,milli}*seconds
- //
- // testDateTime() verifies the expected output for all applicable types
- // (Calendar, Date, and long). It also verifies output for "%t" and
- // "%T". Thus it is sufficient to invoke that method once per
- // conversion/expected output.
- //---------------------------------------------------------------------
- testDateTime("%tM", "48", c0);
- testDateTime("%tN", "584000000", c0);
- testDateTime("%tL", "584", c0);
-// testDateTime("%tQ", "801283714584", c0);
-
- testDateTime("%ts", String.valueOf(c0.getTimeInMillis() / 1000), c0);
- testDateTime("%tS", "34", c0);
- testDateTime("%tT", "19:48:34", c0);
-
- //---------------------------------------------------------------------
- // %t - Hours, morning/afternoon markers
- //
- // testHours() iterates through all twenty-four hours to verify
- // numeric return value and morning/afternoon markers.
- //---------------------------------------------------------------------
- testHours();
-
- //---------------------------------------------------------------------
- // %t - Portions of date [ day, month, dates, weeks ]
- //---------------------------------------------------------------------
- testDateTime("%ta", "Tue", c0);
- testDateTime("%tA", "Tuesday", c0);
- testDateTime("%tb", "May", c0);
- testDateTime("%tB", "May", c0);
- testDateTime("%tC", "19", c0);
- testDateTime("%td", "23", c0);
- testDateTime("%te", "23", c0);
- testDateTime("%th", "May", c0);
- testDateTime("%tj", "143", c0);
- testDateTime("%tm", "05", c0);
- testDateTime("%ty", "95", c0);
- testDateTime("%tY", "1995", c0);
-
- //---------------------------------------------------------------------
- // %t - TimeZone
- //---------------------------------------------------------------------
- testDateTime("%tz", "-0800", c0);
- testDateTime("%tZ", "PST", c0);
-
- //---------------------------------------------------------------------
- // %tz should always adjust for DST
- //---------------------------------------------------------------------
- TimeZone dtz = TimeZone.getDefault();
-
- // Artificial TimeZone based on PST with 3:15 DST always in effect
- TimeZone atz = new SimpleTimeZone(-8 * 60 * 60 * 1000, "AlwaysDST",
- JANUARY, 1, 0, 0, STANDARD_TIME,
- // 24hrs - 1m = 60 * 60 * 1000 * 24 - 1
- DECEMBER, 31, 0, 60 * 60 * 1000 * 24 - 1, STANDARD_TIME,
- (int)(60 * 60 * 1000 * 3.25));
- TimeZone.setDefault(atz);
- testDateTime("%tz", "-0445", Calendar.getInstance(atz));
-
- // Restore the TimeZone and verify
- TimeZone.setDefault(dtz);
- if (atz.hasSameRules(TimeZone.getDefault()))
- throw new RuntimeException("Default TimeZone not restored");
-
- //---------------------------------------------------------------------
- // %t - Composites
- //---------------------------------------------------------------------
- testDateTime("%tr", "07:48:34 PM", c0);
- testDateTime("%tR", "19:48", c0);
- testDateTime("%tc", "Tue May 23 19:48:34 PST 1995", c0);
- testDateTime("%tD", "05/23/95", c0);
- testDateTime("%tF", "1995-05-23", c0);
- testDateTime("%-12tF", "1995-05-23 ", c0);
- testDateTime("%12tF", " 1995-05-23", c0);
-#end[datetime]
-
- //---------------------------------------------------------------------
- // %n
- //---------------------------------------------------------------------
- test("%n", System.getProperty("line.separator"), (Object)null);
- test("%n", System.getProperty("line.separator"), "");
-
- tryCatch("%,n", IllegalFormatFlagsException.class);
- tryCatch("%.n", UnknownFormatConversionException.class);
- tryCatch("%5.n", UnknownFormatConversionException.class);
- tryCatch("%5n", IllegalFormatWidthException.class);
- tryCatch("%.7n", IllegalFormatPrecisionException.class);
- tryCatch("%<n", IllegalFormatFlagsException.class);
-
- //---------------------------------------------------------------------
- // %%
- //---------------------------------------------------------------------
- test("%%", "%", (Object)null);
- test("%%", "%", "");
- tryCatch("%%%", UnknownFormatConversionException.class);
- // perhaps an IllegalFormatArgumentIndexException should be defined?
- tryCatch("%<%", IllegalFormatFlagsException.class);
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Formatter/Basic-X.java.template Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,1712 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* Type-specific source code for unit test
+ *
+ * Regenerate the BasicX classes via genBasic.sh whenever this file changes.
+ * We check in the generated source files so that the test tree can be used
+ * independently of the rest of the source tree.
+ */
+
+#warn This file is preprocessed before being compiled
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.text.DateFormatSymbols;
+import java.util.*;
+#if[double]
+import sun.misc.FpUtils;
+import sun.misc.DoubleConsts;
+#end[double]
+
+import static java.util.Calendar.*;
+#if[datetime]
+import static java.util.SimpleTimeZone.*;
+import java.util.regex.Pattern;
+#end[datetime]
+
+public class Basic$Type$ extends Basic {
+
+ private static void test(String fs, String exp, Object ... args) {
+ Formatter f = new Formatter(new StringBuilder(), Locale.US);
+ f.format(fs, args);
+ ck(fs, exp, f.toString());
+ }
+
+ private static void test(Locale l, String fs, String exp, Object ... args)
+ {
+ Formatter f = new Formatter(new StringBuilder(), l);
+ f.format(fs, args);
+ ck(fs, exp, f.toString());
+ }
+
+ private static void test(String fs, Object ... args) {
+ Formatter f = new Formatter(new StringBuilder(), Locale.US);
+ f.format(fs, args);
+ ck(fs, "fail", f.toString());
+ }
+
+ private static void test(String fs) {
+ Formatter f = new Formatter(new StringBuilder(), Locale.US);
+ f.format(fs, "fail");
+ ck(fs, "fail", f.toString());
+ }
+
+ private static void testSysOut(String fs, String exp, Object ... args) {
+ FileOutputStream fos = null;
+ FileInputStream fis = null;
+ try {
+ PrintStream saveOut = System.out;
+ fos = new FileOutputStream("testSysOut");
+ System.setOut(new PrintStream(fos));
+ System.out.format(Locale.US, fs, args);
+ fos.close();
+
+ fis = new FileInputStream("testSysOut");
+ byte [] ba = new byte[exp.length()];
+ int len = fis.read(ba);
+ String got = new String(ba);
+ if (len != ba.length)
+ fail(fs, exp, got);
+ ck(fs, exp, got);
+
+ System.setOut(saveOut);
+ } catch (FileNotFoundException ex) {
+ fail(fs, ex.getClass());
+ } catch (IOException ex) {
+ fail(fs, ex.getClass());
+ } finally {
+ try {
+ if (fos != null)
+ fos.close();
+ if (fis != null)
+ fis.close();
+ } catch (IOException ex) {
+ fail(fs, ex.getClass());
+ }
+ }
+ }
+
+ private static void tryCatch(String fs, Class<?> ex) {
+ boolean caught = false;
+ try {
+ test(fs);
+ } catch (Throwable x) {
+ if (ex.isAssignableFrom(x.getClass()))
+ caught = true;
+ }
+ if (!caught)
+ fail(fs, ex);
+ else
+ pass();
+ }
+
+ private static void tryCatch(String fs, Class<?> ex, Object ... args) {
+ boolean caught = false;
+ try {
+ test(fs, args);
+ } catch (Throwable x) {
+ if (ex.isAssignableFrom(x.getClass()))
+ caught = true;
+ }
+ if (!caught)
+ fail(fs, ex);
+ else
+ pass();
+ }
+
+#if[datetime]
+ private static void testDateTime(String fs, String exp, Calendar c) {
+ testDateTime(fs, exp, c, true);
+ }
+
+ private static void testDateTime(String fs, String exp, Calendar c, boolean upper) {
+ //---------------------------------------------------------------------
+ // Date/Time conversions applicable to Calendar, Date, and long.
+ //---------------------------------------------------------------------
+
+ // Calendar
+ test(fs, exp, c);
+ test((Locale)null, fs, exp, c);
+ test(Locale.US, fs, exp, c);
+
+ // Date/long do not have timezone information so they will always use
+ // the default timezone.
+ String nexp = (fs.equals("%tZ") || fs.equals("%TZ")
+ || fs.equals("%tc") || fs.equals("%Tc")
+ ? exp.replace("PST", "GMT-08:00")
+ : exp);
+
+ // Date (implemented via conversion to Calendar)
+ Date d = c.getTime();
+ test(fs, nexp, d);
+ test((Locale)null, fs, nexp, d);
+ test(Locale.US, fs, nexp, d);
+
+ // long (implemented via conversion to Calendar)
+ long l = c.getTimeInMillis();
+ test(fs, nexp, l);
+ test((Locale)null, fs, nexp, l);
+ test(Locale.US, fs, nexp, l);
+
+ if (upper)
+ // repeat all tests for upper case variant (%T)
+ testDateTime(Pattern.compile("t").matcher(fs).replaceFirst("T"),
+ exp.toUpperCase(), c, false);
+ }
+
+ private static void testHours() {
+ for (int i = 0; i < 24; i++) {
+ // GregorianCalendar(int year, int month, int dayOfMonth,
+ // int hourOfDay, int minute, int second);
+ Calendar c = new GregorianCalendar(1995, MAY, 23, i, 48, 34);
+
+ //-----------------------------------------------------------------
+ // DateTime.HOUR_OF_DAY - 'k' (0 - 23) -- like H
+ //-----------------------------------------------------------------
+ String exp = Integer.toString(i);
+ testDateTime("%tk", exp, c);
+
+ //-----------------------------------------------------------------
+ // DateTime.HOUR - 'l' (1 - 12) -- like I
+ //-----------------------------------------------------------------
+ int v = i % 12;
+ v = (v == 0 ? 12 : v);
+ String exp2 = Integer.toString(v);
+ testDateTime("%tl", exp2, c);
+
+ //-----------------------------------------------------------------
+ // DateTime.HOUR_OF_DAY_0 - 'H' (00 - 23) [zero padded]
+ //-----------------------------------------------------------------
+ if (exp.length() < 2) exp = "0" + exp;
+ testDateTime("%tH", exp, c);
+
+ //-----------------------------------------------------------------
+ // DateTime.HOUR_0 - 'I' (01 - 12)
+ //-----------------------------------------------------------------
+ if (exp2.length() < 2) exp2 = "0" + exp2;
+ testDateTime("%tI", exp2, c);
+
+ //-----------------------------------------------------------------
+ // DateTime.AM_PM - (am or pm)
+ //-----------------------------------------------------------------
+ testDateTime("%tp", (i <12 ? "am" : "pm"), c);
+ }
+ }
+#end[datetime]
+
+#if[dec]
+#if[prim]
+ private static $type$ negate($type$ v) {
+ return ($type$) -v;
+ }
+#end[prim]
+#end[dec]
+#if[Byte]
+ private static $type$ negate($type$ v) {
+ return new $type$((byte) -v.byteValue());
+ }
+#end[Byte]
+#if[Short]
+ private static $type$ negate($type$ v) {
+ return new $type$((short) -v.shortValue());
+ }
+#end[Short]
+#if[Integer]
+ private static $type$ negate($type$ v) {
+ return new $type$(-v.intValue());
+ }
+#end[Integer]
+#if[Long]
+ private static $type$ negate($type$ v) {
+ return new $type$(-v.longValue());
+ }
+#end[Long]
+
+#if[BigDecimal]
+ private static $type$ create(double v) {
+ return new $type$(v);
+ }
+
+ private static $type$ negate($type$ v) {
+ return v.negate();
+ }
+
+ private static $type$ mult($type$ v, double mul) {
+ return v.multiply(new $type$(mul));
+ }
+
+ private static $type$ recip($type$ v) {
+ return BigDecimal.ONE.divide(v);
+ }
+#end[BigDecimal]
+#if[float]
+ private static $type$ create(double v) {
+ return ($type$) v;
+ }
+
+ private static $type$ negate(double v) {
+ return ($type$) -v;
+ }
+
+ private static $type$ mult($type$ v, double mul) {
+ return v * ($type$) mul;
+ }
+
+ private static $type$ recip($type$ v) {
+ return 1.0f / v;
+ }
+#end[float]
+#if[Float]
+ private static $type$ create(double v) {
+ return new $type$(v);
+ }
+
+ private static $type$ negate($type$ v) {
+ return new $type$(-v.floatValue());
+ }
+
+ private static $type$ mult($type$ v, double mul) {
+ return new $type$(v.floatValue() * (float) mul);
+ }
+
+ private static $type$ recip($type$ v) {
+ return new $type$(1.0f / v.floatValue());
+ }
+#end[Float]
+#if[double]
+ private static $type$ create(double v) {
+ return ($type$) v;
+ }
+
+
+ private static $type$ negate(double v) {
+ return -v;
+ }
+
+ private static $type$ mult($type$ v, double mul) {
+ return v * mul;
+ }
+
+ private static $type$ recip($type$ v) {
+ return 1.0 / v;
+ }
+#end[double]
+#if[Double]
+ private static $type$ create(double v) {
+ return new $type$(v);
+ }
+
+ private static $type$ negate($type$ v) {
+ return new $type$(-v.doubleValue());
+ }
+
+ private static $type$ mult($type$ v, double mul) {
+ return new $type$(v.doubleValue() * mul);
+ }
+
+ private static $type$ recip($type$ v) {
+ return new $type$(1.0 / v.doubleValue());
+ }
+#end[Double]
+
+ public static void test() {
+ TimeZone.setDefault(TimeZone.getTimeZone("GMT-0800"));
+
+ // Any characters not explicitly defined as conversions, date/time
+ // conversion suffixes, or flags are illegal and are reserved for
+ // future extensions. Use of such a character in a format string will
+ // cause an UnknownFormatConversionException or
+ // UnknownFormatFlagsException to be thrown.
+ tryCatch("%q", UnknownFormatConversionException.class);
+ tryCatch("%t&", UnknownFormatConversionException.class);
+ tryCatch("%&d", UnknownFormatConversionException.class);
+ tryCatch("%^b", UnknownFormatConversionException.class);
+
+ //---------------------------------------------------------------------
+ // Formatter.java class javadoc examples
+ //---------------------------------------------------------------------
+ test(Locale.FRANCE, "e = %+10.4f", "e = +2,7183", Math.E);
+ test("%4$2s %3$2s %2$2s %1$2s", " d c b a", "a", "b", "c", "d");
+ test("Amount gained or lost since last statement: $ %,(.2f",
+ "Amount gained or lost since last statement: $ (6,217.58)",
+ (new BigDecimal("-6217.58")));
+ Calendar c = new GregorianCalendar(1969, JULY, 20, 16, 17, 0);
+ testSysOut("Local time: %tT", "Local time: 16:17:00", c);
+
+ test("Unable to open file '%1$s': %2$s",
+ "Unable to open file 'food': No such file or directory",
+ "food", "No such file or directory");
+ Calendar duke = new GregorianCalendar(1995, MAY, 23, 19, 48, 34);
+ duke.set(Calendar.MILLISECOND, 584);
+ test("Duke's Birthday: %1$tB %1$te, %1$tY",
+ "Duke's Birthday: May 23, 1995",
+ duke);
+ test("Duke's Birthday: %1$tB %1$te, %1$tY",
+ "Duke's Birthday: May 23, 1995",
+ duke.getTime());
+ test("Duke's Birthday: %1$tB %1$te, %1$tY",
+ "Duke's Birthday: May 23, 1995",
+ duke.getTimeInMillis());
+
+ test("%4$s %3$s %2$s %1$s %4$s %3$s %2$s %1$s",
+ "d c b a d c b a", "a", "b", "c", "d");
+ test("%s %s %<s %<s", "a b b b", "a", "b", "c", "d");
+ test("%s %s %s %s", "a b c d", "a", "b", "c", "d");
+ test("%2$s %s %<s %s", "b a a b", "a", "b", "c", "d");
+
+ //---------------------------------------------------------------------
+ // %b
+ //
+ // General conversion applicable to any argument.
+ //---------------------------------------------------------------------
+ test("%b", "true", true);
+ test("%b", "false", false);
+ test("%B", "TRUE", true);
+ test("%B", "FALSE", false);
+ test("%b", "true", Boolean.TRUE);
+ test("%b", "false", Boolean.FALSE);
+ test("%B", "TRUE", Boolean.TRUE);
+ test("%B", "FALSE", Boolean.FALSE);
+ test("%14b", " true", true);
+ test("%-14b", "true ", true);
+ test("%5.1b", " f", false);
+ test("%-5.1b", "f ", false);
+
+ test("%b", "true", "foo");
+ test("%b", "false", (Object)null);
+
+ // Boolean.java hardcodes the Strings for "true" and "false", so no
+ // localization is possible.
+ test(Locale.FRANCE, "%b", "true", true);
+ test(Locale.FRANCE, "%b", "false", false);
+
+ // If you pass in a single array to a varargs method, the compiler
+ // uses it as the array of arguments rather than treating it as a
+ // single array-type argument.
+ test("%b", "false", (Object[])new String[2]);
+ test("%b", "true", new String[2], new String[2]);
+
+ int [] ia = { 1, 2, 3 };
+ test("%b", "true", ia);
+
+ //---------------------------------------------------------------------
+ // %b - errors
+ //---------------------------------------------------------------------
+ tryCatch("%#b", FormatFlagsConversionMismatchException.class);
+ tryCatch("%-b", MissingFormatWidthException.class);
+ // correct or side-effect of implementation?
+ tryCatch("%.b", UnknownFormatConversionException.class);
+ tryCatch("%,b", FormatFlagsConversionMismatchException.class);
+
+ //---------------------------------------------------------------------
+ // %c
+ //
+ // General conversion applicable to any argument.
+ //---------------------------------------------------------------------
+ test("%c", "i", 'i');
+ test("%C", "I", 'i');
+ test("%4c", " i", 'i');
+ test("%-4c", "i ", 'i');
+ test("%4C", " I", 'i');
+ test("%-4C", "I ", 'i');
+ test("%c", "i", new Character('i'));
+ test("%c", "H", (byte) 72);
+ test("%c", "i", (short) 105);
+ test("%c", "!", (int) 33);
+ test("%c", "\u007F", Byte.MAX_VALUE);
+ test("%c", new String(Character.toChars(Short.MAX_VALUE)),
+ Short.MAX_VALUE);
+ test("%c", "null", (Object) null);
+
+ //---------------------------------------------------------------------
+ // %c - errors
+ //---------------------------------------------------------------------
+ tryCatch("%c", IllegalFormatConversionException.class,
+ Boolean.TRUE);
+ tryCatch("%c", IllegalFormatConversionException.class,
+ (float) 0.1);
+ tryCatch("%c", IllegalFormatConversionException.class,
+ new Object());
+ tryCatch("%c", IllegalFormatCodePointException.class,
+ Byte.MIN_VALUE);
+ tryCatch("%c", IllegalFormatCodePointException.class,
+ Short.MIN_VALUE);
+ tryCatch("%c", IllegalFormatCodePointException.class,
+ Integer.MIN_VALUE);
+ tryCatch("%c", IllegalFormatCodePointException.class,
+ Integer.MAX_VALUE);
+
+ tryCatch("%#c", FormatFlagsConversionMismatchException.class);
+ tryCatch("%,c", FormatFlagsConversionMismatchException.class);
+ tryCatch("%(c", FormatFlagsConversionMismatchException.class);
+ tryCatch("%$c", UnknownFormatConversionException.class);
+ tryCatch("%.2c", IllegalFormatPrecisionException.class);
+
+ //---------------------------------------------------------------------
+ // %s
+ //
+ // General conversion applicable to any argument.
+ //---------------------------------------------------------------------
+ test("%s", "Hello, Duke", "Hello, Duke");
+ test("%S", "HELLO, DUKE", "Hello, Duke");
+ test("%20S", " HELLO, DUKE", "Hello, Duke");
+ test("%20s", " Hello, Duke", "Hello, Duke");
+ test("%-20s", "Hello, Duke ", "Hello, Duke");
+ test("%-20.5s", "Hello ", "Hello, Duke");
+ test("%s", "null", (Object)null);
+
+ StringBuffer sb = new StringBuffer("foo bar");
+ test("%s", sb.toString(), sb);
+ test("%S", sb.toString().toUpperCase(), sb);
+
+ //---------------------------------------------------------------------
+ // %s - errors
+ //---------------------------------------------------------------------
+ tryCatch("%-s", MissingFormatWidthException.class);
+ tryCatch("%--s", DuplicateFormatFlagsException.class);
+ tryCatch("%#s", FormatFlagsConversionMismatchException.class, 0);
+ tryCatch("%#s", FormatFlagsConversionMismatchException.class, 0.5f);
+ tryCatch("%#s", FormatFlagsConversionMismatchException.class, "hello");
+ tryCatch("%#s", FormatFlagsConversionMismatchException.class, null);
+
+ //---------------------------------------------------------------------
+ // %h
+ //
+ // General conversion applicable to any argument.
+ //---------------------------------------------------------------------
+ test("%h", Integer.toHexString("Hello, Duke".hashCode()),
+ "Hello, Duke");
+ test("%10h", " ddf63471", "Hello, Duke");
+ test("%-10h", "ddf63471 ", "Hello, Duke");
+ test("%-10H", "DDF63471 ", "Hello, Duke");
+ test("%10h", " 402e0000", 15.0);
+ test("%10H", " 402E0000", 15.0);
+
+ //---------------------------------------------------------------------
+ // %h - errors
+ //---------------------------------------------------------------------
+ tryCatch("%#h", FormatFlagsConversionMismatchException.class);
+
+ //---------------------------------------------------------------------
+ // flag/conversion errors
+ //---------------------------------------------------------------------
+ tryCatch("%F", UnknownFormatConversionException.class);
+
+ tryCatch("%#g", FormatFlagsConversionMismatchException.class);
+
+#if[dec]
+
+#if[prim]
+ $type$ minByte = Byte.MIN_VALUE; // -128
+#else[prim]
+ $type$ minByte = new $type$(Byte.MIN_VALUE);
+#end[prim]
+
+ //---------------------------------------------------------------------
+ // %d
+ //
+ // Numeric conversion applicable to byte, short, int, long, and
+ // BigInteger.
+ //---------------------------------------------------------------------
+ test("%d", "null", (Object)null);
+
+#if[byte]
+#if[prim]
+ //---------------------------------------------------------------------
+ // %d - byte
+ //---------------------------------------------------------------------
+ $type$ seventeen = ($type$) 17;
+ test("%d", "17", seventeen);
+ test("%,d", "17", seventeen);
+ test("%,d", "-17", negate(seventeen));
+ test("%(d", "17", seventeen);
+ test("%(d", "(17)", negate(seventeen));
+ test("% d", " 17", seventeen);
+ test("% d", "-17", negate(seventeen));
+ test("%+d", "+17", seventeen);
+ test("%+d", "-17", negate(seventeen));
+ test("%010d", "0000000017", seventeen);
+ test("%010d", "-000000017", negate(seventeen));
+ test("%(10d", " (17)", negate(seventeen));
+ test("%-10d", "17 ", seventeen);
+ test("%-10d", "-17 ", negate(seventeen));
+#end[prim]
+#else[byte]
+#if[short]
+ //---------------------------------------------------------------------
+ // %d - short
+ //---------------------------------------------------------------------
+ $type$ oneToFive = ($type$) 12345;
+ test("%d", "12345", oneToFive);
+ test("%,d", "12,345", oneToFive);
+ test("%,d", "-12,345", negate(oneToFive));
+ test("%(d", "12345", oneToFive);
+ test("%(d", "(12345)", negate(oneToFive));
+ test("% d", " 12345", oneToFive);
+ test("% d", "-12345", negate(oneToFive));
+ test("%+d", "+12345", oneToFive);
+ test("%+d", "-12345", negate(oneToFive));
+ test("%010d", "0000012345", oneToFive);
+ test("%010d", "-000012345", negate(oneToFive));
+ test("%(10d", " (12345)", negate(oneToFive));
+ test("%-10d", "12345 ", oneToFive);
+ test("%-10d", "-12345 ", negate(oneToFive));
+
+#else[short]
+#if[prim]
+ //---------------------------------------------------------------------
+ // %d - int and long
+ //---------------------------------------------------------------------
+ $type$ oneToSeven = ($type$) 1234567;
+ test("%d", "1234567", oneToSeven);
+ test("%,d", "1,234,567", oneToSeven);
+ test(Locale.FRANCE, "%,d", "1\u00a0234\u00a0567", oneToSeven);
+ test("%,d", "-1,234,567", negate(oneToSeven));
+ test("%(d", "1234567", oneToSeven);
+ test("%(d", "(1234567)", negate(oneToSeven));
+ test("% d", " 1234567", oneToSeven);
+ test("% d", "-1234567", negate(oneToSeven));
+ test("%+d", "+1234567", oneToSeven);
+ test("%+d", "-1234567", negate(oneToSeven));
+ test("%010d", "0001234567", oneToSeven);
+ test("%010d", "-001234567", negate(oneToSeven));
+ test("%(10d", " (1234567)", negate(oneToSeven));
+ test("%-10d", "1234567 ", oneToSeven);
+ test("%-10d", "-1234567 ", negate(oneToSeven));
+#end[prim]
+#end[short]
+#end[byte]
+ //---------------------------------------------------------------------
+ // %d - errors
+ //---------------------------------------------------------------------
+ tryCatch("%#d", FormatFlagsConversionMismatchException.class);
+ tryCatch("%D", UnknownFormatConversionException.class);
+ tryCatch("%0d", MissingFormatWidthException.class);
+ tryCatch("%-d", MissingFormatWidthException.class);
+ tryCatch("%7.3d", IllegalFormatPrecisionException.class);
+
+ //---------------------------------------------------------------------
+ // %o
+ //
+ // Numeric conversion applicable to byte, short, int, long, and
+ // BigInteger.
+ //---------------------------------------------------------------------
+ test("%o", "null", (Object)null);
+
+#if[byte]
+ //---------------------------------------------------------------------
+ // %o - byte
+ //---------------------------------------------------------------------
+ test("%010o", "0000000200", minByte);
+ test("%-10o", "200 ", minByte);
+ test("%#10o", " 0200", minByte);
+#end[byte]
+#if[short]
+ //---------------------------------------------------------------------
+ // %o - short
+ //---------------------------------------------------------------------
+
+ test("%010o", "0000177600", minByte);
+ test("%-10o", "177600 ", minByte);
+ test("%#10o", " 0177600", minByte);
+#end[short]
+#if[int]
+ //---------------------------------------------------------------------
+ // %o - int
+ //---------------------------------------------------------------------
+ test("%014o", "00037777777600", minByte);
+ test("%-14o", "37777777600 ", minByte);
+ test("%#14o", " 037777777600", minByte);
+
+ $type$ oneToSevenOct = ($type$) 1234567;
+ test("%o", "4553207", oneToSevenOct);
+ test("%010o", "0004553207", oneToSevenOct);
+ test("%-10o", "4553207 ", oneToSevenOct);
+ test("%#10o", " 04553207", oneToSevenOct);
+#end[int]
+#if[long]
+ //---------------------------------------------------------------------
+ // %o - long
+ //---------------------------------------------------------------------
+ test("%024o", "001777777777777777777600", minByte);
+ test("%-24o", "1777777777777777777600 ", minByte);
+ test("%#24o", " 01777777777777777777600", minByte);
+
+ $type$ oneToSevenOct = ($type$) 1234567;
+ test("%o", "4553207", oneToSevenOct);
+ test("%010o", "0004553207", oneToSevenOct);
+ test("%-10o", "4553207 ", oneToSevenOct);
+ test("%#10o", " 04553207", oneToSevenOct);
+#end[long]
+
+ //---------------------------------------------------------------------
+ // %o - errors
+ //---------------------------------------------------------------------
+ tryCatch("%(o", FormatFlagsConversionMismatchException.class,
+ minByte);
+ tryCatch("%+o", FormatFlagsConversionMismatchException.class,
+ minByte);
+ tryCatch("% o", FormatFlagsConversionMismatchException.class,
+ minByte);
+ tryCatch("%0o", MissingFormatWidthException.class);
+ tryCatch("%-o", MissingFormatWidthException.class);
+ tryCatch("%,o", FormatFlagsConversionMismatchException.class);
+ tryCatch("%O", UnknownFormatConversionException.class);
+
+ //---------------------------------------------------------------------
+ // %x
+ //
+ // Numeric conversion applicable to byte, short, int, long, and
+ // BigInteger.
+ //---------------------------------------------------------------------
+ test("%x", "null", (Object)null);
+
+#if[byte]
+ //---------------------------------------------------------------------
+ // %x - byte
+ //---------------------------------------------------------------------
+ test("%010x", "0000000080", minByte);
+ test("%-10x", "80 ", minByte);
+ test("%#10x", " 0x80", minByte);
+ test("%0#10x","0x00000080", minByte);
+ test("%#10X", " 0X80", minByte);
+ test("%X", "80", minByte);
+#end[byte]
+#if[short]
+ //---------------------------------------------------------------------
+ // %x - short
+ //---------------------------------------------------------------------
+ test("%010x", "000000ff80", minByte);
+ test("%-10x", "ff80 ", minByte);
+ test("%#10x", " 0xff80", minByte);
+ test("%0#10x","0x0000ff80", minByte);
+ test("%#10X", " 0XFF80", minByte);
+ test("%X", "FF80", minByte);
+#end[short]
+#if[int]
+ //---------------------------------------------------------------------
+ // %x - int
+ //---------------------------------------------------------------------
+ $type$ oneToSevenHex = ($type$)1234567;
+ test("%x", "null", (Object)null);
+ test("%x", "12d687", oneToSevenHex);
+ test("%010x", "000012d687", oneToSevenHex);
+ test("%-10x", "12d687 ", oneToSevenHex);
+ test("%#10x", " 0x12d687", oneToSevenHex);
+ test("%#10X", " 0X12D687",oneToSevenHex);
+ test("%X", "12D687", oneToSevenHex);
+
+ test("%010x", "00ffffff80", minByte);
+ test("%-10x", "ffffff80 ", minByte);
+ test("%#10x", "0xffffff80", minByte);
+ test("%0#12x","0x00ffffff80", minByte);
+ test("%#12X", " 0XFFFFFF80", minByte);
+ test("%X", "FFFFFF80", minByte);
+#end[int]
+#if[long]
+ //---------------------------------------------------------------------
+ // %x - long
+ //---------------------------------------------------------------------
+ $type$ oneToSevenHex = ($type$)1234567;
+ test("%x", "null", (Object)null);
+ test("%x", "12d687", oneToSevenHex);
+ test("%010x", "000012d687", oneToSevenHex);
+ test("%-10x", "12d687 ", oneToSevenHex);
+ test("%#10x", " 0x12d687", oneToSevenHex);
+ test("%#10X", " 0X12D687",oneToSevenHex);
+ test("%X", "12D687", oneToSevenHex);
+
+ test("%018x", "00ffffffffffffff80", minByte);
+ test("%-18x", "ffffffffffffff80 ", minByte);
+ test("%#20x", " 0xffffffffffffff80", minByte);
+ test("%0#20x", "0x00ffffffffffffff80", minByte);
+ test("%#20X", " 0XFFFFFFFFFFFFFF80", minByte);
+ test("%X", "FFFFFFFFFFFFFF80", minByte);
+#end[long]
+ //---------------------------------------------------------------------
+ // %x - errors
+ //---------------------------------------------------------------------
+ tryCatch("%,x", FormatFlagsConversionMismatchException.class);
+ tryCatch("%0x", MissingFormatWidthException.class);
+ tryCatch("%-x", MissingFormatWidthException.class);
+
+#end[dec]
+
+#if[BigInteger]
+ //---------------------------------------------------------------------
+ // BigInteger - errors
+ //---------------------------------------------------------------------
+ tryCatch("%f", IllegalFormatConversionException.class,
+ new BigInteger("1"));
+
+ //---------------------------------------------------------------------
+ // %d - BigInteger
+ //---------------------------------------------------------------------
+ test("%d", "null", (Object)null);
+ test("%d", "1234567", new BigInteger("1234567", 10));
+ test("%,d", "1,234,567", new BigInteger("1234567", 10));
+ test(Locale.FRANCE, "%,d", "1\u00a0234\u00a0567", new BigInteger("1234567", 10));
+ test("%,d", "-1,234,567", new BigInteger("-1234567", 10));
+ test("%(d", "1234567", new BigInteger("1234567", 10));
+ test("%(d", "(1234567)", new BigInteger("-1234567", 10));
+ test("% d", " 1234567", new BigInteger("1234567", 10));
+ test("% d", "-1234567", new BigInteger("-1234567", 10));
+ test("%+d", "+1234567", new BigInteger("1234567", 10));
+ test("%+d", "-1234567", new BigInteger("-1234567", 10));
+ test("%010d", "0001234567", new BigInteger("1234567", 10));
+ test("%010d", "-001234567", new BigInteger("-1234567", 10));
+ test("%(10d", " (1234567)", new BigInteger("-1234567", 10));
+ test("%+d", "+1234567", new BigInteger("1234567", 10));
+ test("%+d", "-1234567", new BigInteger("-1234567", 10));
+ test("%-10d", "1234567 ", new BigInteger("1234567", 10));
+ test("%-10d", "-1234567 ", new BigInteger("-1234567", 10));
+
+ //---------------------------------------------------------------------
+ // %o - BigInteger
+ //---------------------------------------------------------------------
+ test("%o", "null", (Object)null);
+ test("%o", "1234567", new BigInteger("1234567", 8));
+ test("%(o", "1234567", new BigInteger("1234567", 8));
+ test("%(o", "(1234567)", new BigInteger("-1234567", 8));
+ test("% o", " 1234567", new BigInteger("1234567", 8));
+ test("% o", "-1234567", new BigInteger("-1234567", 8));
+ test("%+o", "+1234567", new BigInteger("1234567", 8));
+ test("%+o", "-1234567", new BigInteger("-1234567", 8));
+ test("%010o", "0001234567", new BigInteger("1234567", 8));
+ test("%010o", "-001234567", new BigInteger("-1234567", 8));
+ test("%(10o", " (1234567)", new BigInteger("-1234567", 8));
+ test("%+o", "+1234567", new BigInteger("1234567", 8));
+ test("%+o", "-1234567", new BigInteger("-1234567", 8));
+ test("%-10o", "1234567 ", new BigInteger("1234567", 8));
+ test("%-10o", "-1234567 ", new BigInteger("-1234567", 8));
+ test("%#10o", " 01234567", new BigInteger("1234567", 8));
+ test("%#10o", " -01234567", new BigInteger("-1234567", 8));
+
+ //---------------------------------------------------------------------
+ // %x - BigInteger
+ //---------------------------------------------------------------------
+ test("%x", "null", (Object)null);
+ test("%x", "1234567", new BigInteger("1234567", 16));
+ test("%(x", "1234567", new BigInteger("1234567", 16));
+ test("%(x", "(1234567)", new BigInteger("-1234567", 16));
+ test("% x", " 1234567", new BigInteger("1234567", 16));
+ test("% x", "-1234567", new BigInteger("-1234567", 16));
+ test("%+x", "+1234567", new BigInteger("1234567", 16));
+ test("%+x", "-1234567", new BigInteger("-1234567", 16));
+ test("%010x", "0001234567", new BigInteger("1234567", 16));
+ test("%010x", "-001234567", new BigInteger("-1234567", 16));
+ test("%(10x", " (1234567)", new BigInteger("-1234567", 16));
+ test("%+x", "+1234567", new BigInteger("1234567", 16));
+ test("%+x", "-1234567", new BigInteger("-1234567", 16));
+ test("%-10x", "1234567 ", new BigInteger("1234567", 16));
+ test("%-10x", "-1234567 ", new BigInteger("-1234567", 16));
+ test("%#10x", " 0x1234567", new BigInteger("1234567", 16));
+ test("%#10x", "-0x1234567", new BigInteger("-1234567", 16));
+ test("%#10X", " 0X1234567", new BigInteger("1234567", 16));
+ test("%#10X", "-0X1234567", new BigInteger("-1234567", 16));
+ test("%X", "1234567A", new BigInteger("1234567a", 16));
+ test("%X", "-1234567A", new BigInteger("-1234567a", 16));
+#end[BigInteger]
+
+#if[fp]
+#if[BigDecimal]
+ //---------------------------------------------------------------------
+ // %s - BigDecimal
+ //---------------------------------------------------------------------
+ $type$ one = BigDecimal.ONE;
+ $type$ ten = BigDecimal.TEN;
+ $type$ pi = new $type$(Math.PI);
+ $type$ piToThe300 = pi.pow(300);
+
+ test("%s", "3.141592653589793115997963468544185161590576171875", pi);
+#end[BigDecimal]
+#if[float]
+ //---------------------------------------------------------------------
+ // %s - float
+ //---------------------------------------------------------------------
+ $type$ one = 1.0f;
+ $type$ ten = 10.0f;
+ $type$ pi = (float) Math.PI;
+
+ test("%s", "3.1415927", pi);
+#end[float]
+#if[Float]
+ //---------------------------------------------------------------------
+ // %s - Float
+ //---------------------------------------------------------------------
+ $type$ one = new $type$(1.0f);
+ $type$ ten = new $type$(10.0f);
+ $type$ pi = new $type$(Math.PI);
+
+ test("%s", "3.1415927", pi);
+#end[Float]
+#if[double]
+ //---------------------------------------------------------------------
+ // %s - double
+ //---------------------------------------------------------------------
+ $type$ one = 1.0;
+ $type$ ten = 10.0;
+ $type$ pi = Math.PI;
+
+ test("%s", "3.141592653589793", pi);
+#end[double]
+#if[Double]
+ //---------------------------------------------------------------------
+ // %s - Double
+ //---------------------------------------------------------------------
+ $type$ one = new $type$(1.0);
+ $type$ ten = new $type$(10.0);
+ $type$ pi = new $type$(Math.PI);
+
+ test("%s", "3.141592653589793", pi);
+#end[Double]
+
+ //---------------------------------------------------------------------
+ // flag/conversion errors
+ //---------------------------------------------------------------------
+ tryCatch("%d", IllegalFormatConversionException.class, one);
+ tryCatch("%,.4e", FormatFlagsConversionMismatchException.class, one);
+
+ //---------------------------------------------------------------------
+ // %e
+ //
+ // Floating-point conversions applicable to float, double, and
+ // BigDecimal.
+ //---------------------------------------------------------------------
+ test("%e", "null", (Object)null);
+
+ //---------------------------------------------------------------------
+ // %e - float and double
+ //---------------------------------------------------------------------
+ // double PI = 3.141 592 653 589 793 238 46;
+ test("%e", "3.141593e+00", pi);
+ test("%.0e", "1e+01", ten);
+ test("%#.0e", "1.e+01", ten);
+ test("%E", "3.141593E+00", pi);
+ test("%10.3e", " 3.142e+00", pi);
+ test("%10.3e", "-3.142e+00", negate(pi));
+ test("%010.3e", "03.142e+00", pi);
+ test("%010.3e", "-3.142e+00", negate(pi));
+ test("%-12.3e", "3.142e+00 ", pi);
+ test("%-12.3e", "-3.142e+00 ", negate(pi));
+ test("%.3e", "3.142e+00", pi);
+ test("%.3e", "-3.142e+00", negate(pi));
+ test("%.3e", "3.142e+06", mult(pi, 1000000.0));
+ test("%.3e", "-3.142e+06", mult(pi, -1000000.0));
+
+ test(Locale.FRANCE, "%e", "3,141593e+00", pi);
+
+ // double PI^300
+ // = 13962455701329742638131355433930076081862072808 ... e+149
+#if[BigDecimal]
+ //---------------------------------------------------------------------
+ // %e - BigDecimal
+ //---------------------------------------------------------------------
+ test("%.3e", "1.396e+149", piToThe300);
+ test("%.3e", "-1.396e+149", piToThe300.negate());
+ test("%.3e", "1.000e-100", recip(ten.pow(100)));
+ test("%.3e", "-1.000e-100", negate(recip(ten.pow(100))));
+
+ test("%3.0e", "1e-06", new BigDecimal("0.000001"));
+ test("%3.0e", "1e-05", new BigDecimal("0.00001"));
+ test("%3.0e", "1e-04", new BigDecimal("0.0001"));
+ test("%3.0e", "1e-03", new BigDecimal("0.001"));
+ test("%3.0e", "1e-02", new BigDecimal("0.01"));
+ test("%3.0e", "1e-01", new BigDecimal("0.1"));
+ test("%3.0e", "9e-01", new BigDecimal("0.9"));
+ test("%3.1e", "9.0e-01", new BigDecimal("0.9"));
+ test("%3.0e", "1e+00", new BigDecimal("1.00"));
+ test("%3.0e", "1e+01", new BigDecimal("10.00"));
+ test("%3.0e", "1e+02", new BigDecimal("99.19"));
+ test("%3.1e", "9.9e+01", new BigDecimal("99.19"));
+ test("%3.0e", "1e+02", new BigDecimal("99.99"));
+ test("%3.0e", "1e+02", new BigDecimal("100.00"));
+ test("%#3.0e", "1.e+03", new BigDecimal("1000.00"));
+ test("%3.0e", "1e+04", new BigDecimal("10000.00"));
+ test("%3.0e", "1e+05", new BigDecimal("100000.00"));
+ test("%3.0e", "1e+06", new BigDecimal("1000000.00"));
+ test("%3.0e", "1e+07", new BigDecimal("10000000.00"));
+ test("%3.0e", "1e+08", new BigDecimal("100000000.00"));
+#end[BigDecimal]
+
+ test("%10.3e", " 1.000e+00", one);
+ test("%+.3e", "+3.142e+00", pi);
+ test("%+.3e", "-3.142e+00", negate(pi));
+ test("% .3e", " 3.142e+00", pi);
+ test("% .3e", "-3.142e+00", negate(pi));
+ test("%#.0e", "3.e+00", create(3.0));
+ test("%#.0e", "-3.e+00", create(-3.0));
+ test("%.0e", "3e+00", create(3.0));
+ test("%.0e", "-3e+00", create(-3.0));
+
+ test("%(.4e", "3.1416e+06", mult(pi, 1000000.0));
+ test("%(.4e", "(3.1416e+06)", mult(pi, -1000000.0));
+
+ //---------------------------------------------------------------------
+ // %e - boundary problems
+ //---------------------------------------------------------------------
+ test("%3.0e", "1e-06", 0.000001);
+ test("%3.0e", "1e-05", 0.00001);
+ test("%3.0e", "1e-04", 0.0001);
+ test("%3.0e", "1e-03", 0.001);
+ test("%3.0e", "1e-02", 0.01);
+ test("%3.0e", "1e-01", 0.1);
+ test("%3.0e", "9e-01", 0.9);
+ test("%3.1e", "9.0e-01", 0.9);
+ test("%3.0e", "1e+00", 1.00);
+ test("%3.0e", "1e+01", 10.00);
+ test("%3.0e", "1e+02", 99.19);
+ test("%3.1e", "9.9e+01", 99.19);
+ test("%3.0e", "1e+02", 99.99);
+ test("%3.0e", "1e+02", 100.00);
+ test("%#3.0e", "1.e+03", 1000.00);
+ test("%3.0e", "1e+04", 10000.00);
+ test("%3.0e", "1e+05", 100000.00);
+ test("%3.0e", "1e+06", 1000000.00);
+ test("%3.0e", "1e+07", 10000000.00);
+ test("%3.0e", "1e+08", 100000000.00);
+
+ //---------------------------------------------------------------------
+ // %f
+ //
+ // Floating-point conversions applicable to float, double, and
+ // BigDecimal.
+ //---------------------------------------------------------------------
+ test("%f", "null", (Object)null);
+ test("%f", "3.141593", pi);
+ test(Locale.FRANCE, "%f", "3,141593", pi);
+ test("%10.3f", " 3.142", pi);
+ test("%10.3f", " -3.142", negate(pi));
+ test("%010.3f", "000003.142", pi);
+ test("%010.3f", "-00003.142", negate(pi));
+ test("%-10.3f", "3.142 ", pi);
+ test("%-10.3f", "-3.142 ", negate(pi));
+ test("%.3f", "3.142", pi);
+ test("%.3f", "-3.142", negate(pi));
+ test("%+.3f", "+3.142", pi);
+ test("%+.3f", "-3.142", negate(pi));
+ test("% .3f", " 3.142", pi);
+ test("% .3f", "-3.142", negate(pi));
+ test("%#.0f", "3.", create(3.0));
+ test("%#.0f", "-3.", create(-3.0));
+ test("%.0f", "3", create(3.0));
+ test("%.0f", "-3", create(-3.0));
+ test("%.3f", "10.000", ten);
+ test("%.3f", "1.000", one);
+ test("%10.3f", " 1.000", one);
+
+ //---------------------------------------------------------------------
+ // %f - boundary problems
+ //---------------------------------------------------------------------
+ test("%3.0f", " 0", 0.000001);
+ test("%3.0f", " 0", 0.00001);
+ test("%3.0f", " 0", 0.0001);
+ test("%3.0f", " 0", 0.001);
+ test("%3.0f", " 0", 0.01);
+ test("%3.0f", " 0", 0.1);
+ test("%3.0f", " 1", 0.9);
+ test("%3.1f", "0.9", 0.9);
+ test("%3.0f", " 1", 1.00);
+ test("%3.0f", " 10", 10.00);
+ test("%3.0f", " 99", 99.19);
+ test("%3.1f", "99.2", 99.19);
+ test("%3.0f", "100", 99.99);
+ test("%3.0f", "100", 100.00);
+ test("%#3.0f", "1000.", 1000.00);
+ test("%3.0f", "10000", 10000.00);
+ test("%3.0f", "100000", 100000.00);
+ test("%3.0f", "1000000", 1000000.00);
+ test("%3.0f", "10000000", 10000000.00);
+ test("%3.0f", "100000000", 100000000.00);
+#if[BigDecimal]
+ //---------------------------------------------------------------------
+ // %f - BigDecimal
+ //---------------------------------------------------------------------
+ test("%4.0f", " 99", new BigDecimal("99.19"));
+ test("%4.1f", "99.2", new BigDecimal("99.19"));
+
+ BigDecimal val = new BigDecimal("99.95");
+ test("%4.0f", " 100", val);
+ test("%#4.0f", "100.", val);
+ test("%4.1f", "100.0", val);
+ test("%4.2f", "99.95", val);
+ test("%4.3f", "99.950", val);
+
+ val = new BigDecimal(".99");
+ test("%4.1f", " 1.0", val);
+ test("%4.2f", "0.99", val);
+ test("%4.3f", "0.990", val);
+
+ // #6476425
+ val = new BigDecimal("0.00001");
+ test("%.0f", "0", val);
+ test("%.1f", "0.0", val);
+ test("%.2f", "0.00", val);
+ test("%.3f", "0.000", val);
+ test("%.4f", "0.0000", val);
+ test("%.5f", "0.00001", val);
+
+ val = new BigDecimal("1.00001");
+ test("%.0f", "1", val);
+ test("%.1f", "1.0", val);
+ test("%.2f", "1.00", val);
+ test("%.3f", "1.000", val);
+ test("%.4f", "1.0000", val);
+ test("%.5f", "1.00001", val);
+
+ val = new BigDecimal("1.23456");
+ test("%.0f", "1", val);
+ test("%.1f", "1.2", val);
+ test("%.2f", "1.23", val);
+ test("%.3f", "1.235", val);
+ test("%.4f", "1.2346", val);
+ test("%.5f", "1.23456", val);
+ test("%.6f", "1.234560", val);
+
+ val = new BigDecimal("9.99999");
+ test("%.0f", "10", val);
+ test("%.1f", "10.0", val);
+ test("%.2f", "10.00", val);
+ test("%.3f", "10.000", val);
+ test("%.4f", "10.0000", val);
+ test("%.5f", "9.99999", val);
+ test("%.6f", "9.999990", val);
+
+
+ val = new BigDecimal("1.99999");
+ test("%.0f", "2", val);
+ test("%.1f", "2.0", val);
+ test("%.2f", "2.00", val);
+ test("%.3f", "2.000", val);
+ test("%.4f", "2.0000", val);
+ test("%.5f", "1.99999", val);
+ test("%.6f", "1.999990", val);
+
+#end[BigDecimal]
+
+#if[float]
+ //---------------------------------------------------------------------
+ // %f - float
+ //---------------------------------------------------------------------
+ // Float can not accurately store 1e6 * PI.
+ test("%.3f", "3141.593", mult(pi, 1000.0));
+ test("%.3f", "-3141.593", mult(pi, -1000.0));
+
+ test("%,.2f", "3,141.59", mult(pi, 1000.0));
+ test(Locale.FRANCE, "%,.2f", "3\u00a0141,59", mult(pi, 1000.0));
+ test("%,.2f", "-3,141.59", mult(pi, -1000.0));
+ test("%(.2f", "3141.59", mult(pi, 1000.0));
+ test("%(.2f", "(3141.59)", mult(pi, -1000.0));
+ test("%(,.2f", "3,141.59", mult(pi, 1000.0));
+ test("%(,.2f", "(3,141.59)", mult(pi, -1000.0));
+
+#else[float]
+#if[!Float]
+ //---------------------------------------------------------------------
+ // %f - float, double, Double, BigDecimal
+ //---------------------------------------------------------------------
+ test("%.3f", "3141592.654", mult(pi, 1000000.0));
+ test("%.3f", "-3141592.654", mult(pi, -1000000.0));
+ test("%,.4f", "3,141,592.6536", mult(pi, 1000000.0));
+ test(Locale.FRANCE, "%,.4f", "3\u00a0141\u00a0592,6536", mult(pi, 1000000.0));
+ test("%,.4f", "-3,141,592.6536", mult(pi, -1000000.0));
+ test("%(.4f", "3141592.6536", mult(pi, 1000000.0));
+ test("%(.4f", "(3141592.6536)", mult(pi, -1000000.0));
+ test("%(,.4f", "3,141,592.6536", mult(pi, 1000000.0));
+ test("%(,.4f", "(3,141,592.6536)", mult(pi, -1000000.0));
+#end[!Float]
+#end[float]
+
+
+ //---------------------------------------------------------------------
+ // %g
+ //
+ // Floating-point conversions applicable to float, double, and
+ // BigDecimal.
+ //---------------------------------------------------------------------
+ test("%g", "null", (Object)null);
+ test("%g", "3.14159", pi);
+ test(Locale.FRANCE, "%g", "3,14159", pi);
+ test("%.0g", "1e+01", ten);
+ test("%G", "3.14159", pi);
+ test("%10.3g", " 3.14", pi);
+ test("%10.3g", " -3.14", negate(pi));
+ test("%010.3g", "0000003.14", pi);
+ test("%010.3g", "-000003.14", negate(pi));
+ test("%-12.3g", "3.14 ", pi);
+ test("%-12.3g", "-3.14 ", negate(pi));
+ test("%.3g", "3.14", pi);
+ test("%.3g", "-3.14", negate(pi));
+ test("%.3g", "3.14e+08", mult(pi, 100000000.0));
+ test("%.3g", "-3.14e+08", mult(pi, -100000000.0));
+
+ test("%.3g", "1.00e-05", recip(create(100000.0)));
+ test("%.3g", "-1.00e-05", recip(create(-100000.0)));
+ test("%.0g", "-1e-05", recip(create(-100000.0)));
+ test("%.0g", "1e+05", create(100000.0));
+ test("%.3G", "1.00E-05", recip(create(100000.0)));
+ test("%.3G", "-1.00E-05", recip(create(-100000.0)));
+
+ test("%3.0g", "1e-06", 0.000001);
+ test("%3.0g", "1e-05", 0.00001);
+ test("%3.0g", "1e-05", 0.0000099);
+ test("%3.1g", "1e-05", 0.0000099);
+ test("%3.2g", "9.9e-06", 0.0000099);
+ test("%3.0g", "0.0001", 0.0001);
+ test("%3.0g", "9e-05", 0.00009);
+ test("%3.0g", "0.0001", 0.000099);
+ test("%3.1g", "0.0001", 0.000099);
+ test("%3.2g", "9.9e-05", 0.000099);
+ test("%3.0g", "0.001", 0.001);
+ test("%3.0g", "0.001", 0.00099);
+ test("%3.1g", "0.001", 0.00099);
+ test("%3.2g", "0.00099", 0.00099);
+ test("%3.3g", "0.00100", 0.001);
+ test("%3.4g", "0.001000", 0.001);
+ test("%3.0g", "0.01", 0.01);
+ test("%3.0g", "0.1", 0.1);
+ test("%3.0g", "0.9", 0.9);
+ test("%3.1g", "0.9", 0.9);
+ test("%3.0g", " 1", 1.00);
+ test("%3.2g", " 10", 10.00);
+ test("%3.0g", "1e+01", 10.00);
+ test("%3.0g", "1e+02", 99.19);
+ test("%3.1g", "1e+02", 99.19);
+ test("%3.2g", " 99", 99.19);
+ test("%3.0g", "1e+02", 99.9);
+ test("%3.1g", "1e+02", 99.9);
+ test("%3.2g", "1.0e+02", 99.9);
+ test("%3.0g", "1e+02", 99.99);
+ test("%3.0g", "1e+02", 100.00);
+ test("%3.0g", "1e+03", 999.9);
+ test("%3.1g", "1e+03", 999.9);
+ test("%3.2g", "1.0e+03", 999.9);
+ test("%3.3g", "1.00e+03", 999.9);
+ test("%3.4g", "999.9", 999.9);
+ test("%3.4g", "1000", 999.99);
+ test("%3.0g", "1e+03", 1000.00);
+ test("%3.0g", "1e+04", 10000.00);
+ test("%3.0g", "1e+05", 100000.00);
+ test("%3.0g", "1e+06", 1000000.00);
+ test("%3.0g", "1e+07", 10000000.00);
+ test("%3.9g", "100000000", 100000000.00);
+ test("%3.10g", "100000000.0", 100000000.00);
+
+ tryCatch("%#3.0g", FormatFlagsConversionMismatchException.class, 1000.00);
+
+ // double PI^300
+ // = 13962455701329742638131355433930076081862072808 ... e+149
+#if[BigDecimal]
+ //---------------------------------------------------------------------
+ // %g - BigDecimal
+ //---------------------------------------------------------------------
+ test("%.3g", "1.40e+149", piToThe300);
+ test("%.3g", "-1.40e+149", piToThe300.negate());
+ test(Locale.FRANCE, "%.3g", "-1,40e+149", piToThe300.negate());
+ test("%.3g", "1.00e-100", recip(ten.pow(100)));
+ test("%.3g", "-1.00e-100", negate(recip(ten.pow(100))));
+
+ test("%3.0g", "1e-06", new BigDecimal("0.000001"));
+ test("%3.0g", "1e-05", new BigDecimal("0.00001"));
+ test("%3.0g", "0.0001", new BigDecimal("0.0001"));
+ test("%3.0g", "0.001", new BigDecimal("0.001"));
+ test("%3.3g", "0.00100", new BigDecimal("0.001"));
+ test("%3.4g", "0.001000", new BigDecimal("0.001"));
+ test("%3.0g", "0.01", new BigDecimal("0.01"));
+ test("%3.0g", "0.1", new BigDecimal("0.1"));
+ test("%3.0g", "0.9", new BigDecimal("0.9"));
+ test("%3.1g", "0.9", new BigDecimal("0.9"));
+ test("%3.0g", " 1", new BigDecimal("1.00"));
+ test("%3.2g", " 10", new BigDecimal("10.00"));
+ test("%3.0g", "1e+01", new BigDecimal("10.00"));
+ test("%3.0g", "1e+02", new BigDecimal("99.19"));
+ test("%3.1g", "1e+02", new BigDecimal("99.19"));
+ test("%3.2g", " 99", new BigDecimal("99.19"));
+ test("%3.0g", "1e+02", new BigDecimal("99.99"));
+ test("%3.0g", "1e+02", new BigDecimal("100.00"));
+ test("%3.0g", "1e+03", new BigDecimal("1000.00"));
+ test("%3.0g", "1e+04", new BigDecimal("10000.00"));
+ test("%3.0g", "1e+05", new BigDecimal("100000.00"));
+ test("%3.0g", "1e+06", new BigDecimal("1000000.00"));
+ test("%3.0g", "1e+07", new BigDecimal("10000000.00"));
+ test("%3.9g", "100000000", new BigDecimal("100000000.00"));
+ test("%3.10g", "100000000.0", new BigDecimal("100000000.00"));
+#end[BigDecimal]
+
+ test("%.3g", "10.0", ten);
+ test("%.3g", "1.00", one);
+ test("%10.3g", " 1.00", one);
+ test("%+10.3g", " +3.14", pi);
+ test("%+10.3g", " -3.14", negate(pi));
+ test("% .3g", " 3.14", pi);
+ test("% .3g", "-3.14", negate(pi));
+ test("%.0g", "3", create(3.0));
+ test("%.0g", "-3", create(-3.0));
+
+ test("%(.4g", "3.142e+08", mult(pi, 100000000.0));
+ test("%(.4g", "(3.142e+08)", mult(pi, -100000000.0));
+
+#if[float]
+ // Float can not accurately store 1e6 * PI.
+ test("%,.6g", "3,141.59", mult(pi, 1000.0));
+ test("%(,.6g", "(3,141.59)", mult(pi, -1000.0));
+#else[float]
+#if[!Float]
+ test("%,.11g", "3,141,592.6536", mult(pi, 1000000.0));
+ test("%(,.11g", "(3,141,592.6536)", mult(pi, -1000000.0));
+#end[!Float]
+#end[float]
+
+#if[double]
+ //---------------------------------------------------------------------
+ // %a
+ //
+ // Floating-point conversions applicable to float, double, and
+ // BigDecimal.
+ //---------------------------------------------------------------------
+ test("%a", "null", (Object)null);
+ test("%.11a", "0x0.00000000000p0", 0.0);
+ test(Locale.FRANCE, "%.11a", "0x0.00000000000p0", 0.0); // no localization
+ test("%.1a", "0x0.0p0", 0.0);
+ test("%.11a", "-0x0.00000000000p0", -0.0);
+ test("%.1a", "-0x0.0p0", -0.0);
+ test("%.11a", "0x1.00000000000p0", 1.0);
+ test("%.1a", "0x1.0p0", 1.0);
+ test("%.11a", "-0x1.00000000000p0", -1.0);
+ test("%.1a", "-0x1.0p0", -1.0);
+ test("%.11a", "0x1.80000000000p1", 3.0);
+ test("%.1a", "0x1.8p1", 3.0);
+ test("%.11a", "0x1.00000000000p-1022", DoubleConsts.MIN_NORMAL);
+ test("%.1a", "0x1.0p-1022", DoubleConsts.MIN_NORMAL);
+ test("%.11a", "0x1.00000000000p-1022",
+ FpUtils.nextDown(DoubleConsts.MIN_NORMAL));
+ test("%.1a", "0x1.0p-1022",
+ FpUtils.nextDown(DoubleConsts.MIN_NORMAL));
+ test("%.11a", "0x1.ffffffffffep-1023",
+ Double.parseDouble("0x0.fffffffffffp-1022"));
+ test("%.1a", "0x1.0p-1022",
+ Double.parseDouble("0x0.fffffffffffp-1022"));
+ test("%.30a", "0x0.000000000000100000000000000000p-1022", Double.MIN_VALUE);
+ test("%.13a", "0x0.0000000000001p-1022", Double.MIN_VALUE);
+ test("%.11a", "0x1.00000000000p-1074", Double.MIN_VALUE);
+ test("%.1a", "0x1.0p-1074", Double.MIN_VALUE);
+
+ test("%.11a", "0x1.08000000000p-1069",
+ Double.MIN_VALUE + Double.MIN_VALUE*32);
+ test("%.1a", "0x1.0p-1069",
+ Double.MIN_VALUE + Double.MIN_VALUE*32);
+ test("%.30a", "0x1.fffffffffffff00000000000000000p1023", Double.MAX_VALUE);
+ test("%.13a", "0x1.fffffffffffffp1023", Double.MAX_VALUE);
+ test("%.11a", "0x1.00000000000p1024", Double.MAX_VALUE);
+ test("%.1a", "0x1.0p1024", Double.MAX_VALUE);
+ test("%.11a", "0x1.18000000000p0", Double.parseDouble("0x1.18p0"));
+ test("%.1a", "0x1.2p0", Double.parseDouble("0x1.18p0"));
+
+ test("%.11a", "0x1.18000000000p0",
+ Double.parseDouble("0x1.180000000001p0"));
+ test("%.1a", "0x1.2p0",
+ Double.parseDouble("0x1.180000000001p0"));
+ test("%.11a", "0x1.28000000000p0", Double.parseDouble("0x1.28p0"));
+ test("%.1a", "0x1.2p0", Double.parseDouble("0x1.28p0"));
+
+ test("%.11a", "0x1.28000000000p0",
+ Double.parseDouble("0x1.280000000001p0"));
+ test("%.1a", "0x1.3p0", Double.parseDouble("0x1.280000000001p0"));
+#end[double]
+
+ //---------------------------------------------------------------------
+ // %f, %e, %g, %a - Boundaries
+ //---------------------------------------------------------------------
+#if[float]
+ //---------------------------------------------------------------------
+ // %f, %e, %g, %a - NaN
+ //---------------------------------------------------------------------
+ test("%f", "NaN", Float.NaN);
+ // s
+ test("%+f", "NaN", Float.NaN);
+// test("%F", "NAN", Float.NaN);
+ test("%e", "NaN", Float.NaN);
+ test("%+e", "NaN", Float.NaN);
+ test("%E", "NAN", Float.NaN);
+ test("%g", "NaN", Float.NaN);
+ test("%+g", "NaN", Float.NaN);
+ test("%G", "NAN", Float.NaN);
+ test("%a", "NaN", Float.NaN);
+ test("%+a", "NaN", Float.NaN);
+ test("%A", "NAN", Float.NaN);
+
+ //---------------------------------------------------------------------
+ // %f, %e, %g, %a - +0.0
+ //---------------------------------------------------------------------
+ test("%f", "0.000000", +0.0);
+ test("%+f", "+0.000000", +0.0);
+ test("% f", " 0.000000", +0.0);
+// test("%F", "0.000000", +0.0);
+ test("%e", "0.000000e+00", 0e0);
+ test("%e", "0.000000e+00", +0.0);
+ test("%+e", "+0.000000e+00", +0.0);
+ test("% e", " 0.000000e+00", +0.0);
+ test("%E", "0.000000E+00", 0e0);
+ test("%E", "0.000000E+00", +0.0);
+ test("%+E", "+0.000000E+00", +0.0);
+ test("% E", " 0.000000E+00", +0.0);
+ test("%g", "0.00000", +0.0);
+ test("%+g", "+0.00000", +0.0);
+ test("% g", " 0.00000", +0.0);
+ test("%G", "0.00000", +0.0);
+ test("% G", " 0.00000", +0.0);
+ test("%a", "0x0.0p0", +0.0);
+ test("%+a", "+0x0.0p0", +0.0);
+ test("% a", " 0x0.0p0", +0.0);
+ test("%A", "0X0.0P0", +0.0);
+ test("% A", " 0X0.0P0", +0.0);
+
+ //---------------------------------------------------------------------
+ // %f, %e, %g, %a - -0.0
+ //---------------------------------------------------------------------
+ test("%f", "-0.000000", -0.0);
+ test("%+f", "-0.000000", -0.0);
+// test("%F", "-0.000000", -0.0);
+ test("%e", "-0.000000e+00", -0.0);
+ test("%+e", "-0.000000e+00", -0.0);
+ test("%E", "-0.000000E+00", -0.0);
+ test("%+E", "-0.000000E+00", -0.0);
+ test("%g", "-0.00000", -0.0);
+ test("%+g", "-0.00000", -0.0);
+ test("%G", "-0.00000", -0.0);
+ test("%a", "-0x0.0p0", -0.0);
+ test("%+a", "-0x0.0p0", -0.0);
+ test("%+A", "-0X0.0P0", -0.0);
+
+ //---------------------------------------------------------------------
+ // %f, %e, %g, %a - +Infinity
+ //---------------------------------------------------------------------
+ test("%f", "Infinity", Float.POSITIVE_INFINITY);
+ test("%+f", "+Infinity", Float.POSITIVE_INFINITY);
+ test("% f", " Infinity", Float.POSITIVE_INFINITY);
+// test("%F", "INFINITY", Float.POSITIVE_INFINITY);
+ test("%e", "Infinity", Float.POSITIVE_INFINITY);
+ test("%+e", "+Infinity", Float.POSITIVE_INFINITY);
+ test("% e", " Infinity", Float.POSITIVE_INFINITY);
+ test("%E", "INFINITY", Float.POSITIVE_INFINITY);
+ test("%+E", "+INFINITY", Float.POSITIVE_INFINITY);
+ test("% E", " INFINITY", Float.POSITIVE_INFINITY);
+ test("%g", "Infinity", Float.POSITIVE_INFINITY);
+ test("%+g", "+Infinity", Float.POSITIVE_INFINITY);
+ test("%G", "INFINITY", Float.POSITIVE_INFINITY);
+ test("% G", " INFINITY", Float.POSITIVE_INFINITY);
+ test("%+G", "+INFINITY", Float.POSITIVE_INFINITY);
+ test("%a", "Infinity", Float.POSITIVE_INFINITY);
+ test("%+a", "+Infinity", Float.POSITIVE_INFINITY);
+ test("% a", " Infinity", Float.POSITIVE_INFINITY);
+ test("%A", "INFINITY", Float.POSITIVE_INFINITY);
+ test("%+A", "+INFINITY", Float.POSITIVE_INFINITY);
+ test("% A", " INFINITY", Float.POSITIVE_INFINITY);
+
+ //---------------------------------------------------------------------
+ // %f, %e, %g, %a - -Infinity
+ //---------------------------------------------------------------------
+ test("%f", "-Infinity", Float.NEGATIVE_INFINITY);
+ test("%+f", "-Infinity", Float.NEGATIVE_INFINITY);
+ test("%(f", "(Infinity)", Float.NEGATIVE_INFINITY);
+// test("%F", "-INFINITY", Float.NEGATIVE_INFINITY);
+ test("%e", "-Infinity", Float.NEGATIVE_INFINITY);
+ test("%+e", "-Infinity", Float.NEGATIVE_INFINITY);
+ test("%E", "-INFINITY", Float.NEGATIVE_INFINITY);
+ test("%+E", "-INFINITY", Float.NEGATIVE_INFINITY);
+ test("%g", "-Infinity", Float.NEGATIVE_INFINITY);
+ test("%+g", "-Infinity", Float.NEGATIVE_INFINITY);
+ test("%G", "-INFINITY", Float.NEGATIVE_INFINITY);
+ test("%+G", "-INFINITY", Float.NEGATIVE_INFINITY);
+ test("%a", "-Infinity", Float.NEGATIVE_INFINITY);
+ test("%+a", "-Infinity", Float.NEGATIVE_INFINITY);
+ test("%A", "-INFINITY", Float.NEGATIVE_INFINITY);
+ test("%+A", "-INFINITY", Float.NEGATIVE_INFINITY);
+
+ //---------------------------------------------------------------------
+ // %f, %e, %g, %a - Float.MIN_VALUE
+ //---------------------------------------------------------------------
+ test("%f", "0.000000", Float.MIN_VALUE);
+ test("%,f", "0.000000", Float.MIN_VALUE);
+ test("%(f", "(0.000000)", -Float.MIN_VALUE);
+ test("%30.0f", " 0", Float.MIN_VALUE);
+ test("%30.5f", " 0.00000", Float.MIN_VALUE);
+ test("%30.13f", " 0.0000000000000", Float.MIN_VALUE);
+ test("%30.20f", " 0.00000000000000000000", Float.MIN_VALUE);
+ test("%e", "1.401298e-45", Float.MIN_VALUE);
+ test("%E", "1.401298E-45", Float.MIN_VALUE);
+ test("%(.1e", "1.4e-45", Float.MIN_VALUE);
+ test("%(E", "(1.401298E-45)", -Float.MIN_VALUE);
+ test("%30.5e", " 1.40130e-45", Float.MIN_VALUE);
+ test("%30.13e", " 1.4012984643248e-45", Float.MIN_VALUE);
+ test("%30.20e", " 1.40129846432481700000e-45", Float.MIN_VALUE);
+ test("%g", "1.40130e-45", Float.MIN_VALUE);
+ test("%G", "1.40130E-45", Float.MIN_VALUE);
+ test("%(g", "1.40130e-45", Float.MIN_VALUE);
+ test("%,g", "1.40130e-45", Float.MIN_VALUE);
+ test("%(G", "(1.40130E-45)", -Float.MIN_VALUE);
+ test("%30.5g", " 1.4013e-45", Float.MIN_VALUE);
+ test("%30.13g", " 1.401298464325e-45", Float.MIN_VALUE);
+ test("%30.20g", " 1.4012984643248170000e-45", Float.MIN_VALUE);
+ test("%a", "0x1.0p-149", Float.MIN_VALUE);
+ test("%A", "0X1.0P-149", Float.MIN_VALUE);
+ test("%20a", " 0x1.0p-149", Float.MIN_VALUE);
+
+ //---------------------------------------------------------------------
+ // %f, %e, %g, %a - Float.MAX_VALUE
+ //---------------------------------------------------------------------
+ test("%f", "340282346638528860000000000000000000000.000000", Float.MAX_VALUE);
+ test("%,f","340,282,346,638,528,860,000,000,000,000,000,000,000.000000",
+ Float.MAX_VALUE);
+ test("%(f", "(340282346638528860000000000000000000000.000000)", -Float.MAX_VALUE);
+ test("%60.5f", " 340282346638528860000000000000000000000.00000",
+ Float.MAX_VALUE);
+ test("%60.13f", " 340282346638528860000000000000000000000.0000000000000",
+ Float.MAX_VALUE);
+ test("%61.20f", " 340282346638528860000000000000000000000.00000000000000000000",
+ Float.MAX_VALUE);
+ test("%e", "3.402823e+38", Float.MAX_VALUE);
+ test("%E", "3.402823E+38", Float.MAX_VALUE);
+ test("%(e", "3.402823e+38", Float.MAX_VALUE);
+ test("%(e", "(3.402823e+38)", -Float.MAX_VALUE);
+ test("%30.5e", " 3.40282e+38", Float.MAX_VALUE);
+ test("%30.13e", " 3.4028234663853e+38", Float.MAX_VALUE);
+ test("%30.20e", " 3.40282346638528860000e+38", Float.MAX_VALUE);
+ test("%g", "3.40282e+38", Float.MAX_VALUE);
+ test("%G", "3.40282E+38", Float.MAX_VALUE);
+ test("%,g", "3.40282e+38", Float.MAX_VALUE);
+ test("%(g", "(3.40282e+38)", -Float.MAX_VALUE);
+ test("%30.5g", " 3.4028e+38", Float.MAX_VALUE);
+ test("%30.13g", " 3.402823466385e+38", Float.MAX_VALUE);
+ test("%30.20G", " 3.4028234663852886000E+38", Float.MAX_VALUE);
+ test("%a", "0x1.fffffep127", Float.MAX_VALUE);
+ test("%A", "0X1.FFFFFEP127", Float.MAX_VALUE);
+ test("%20a"," 0x1.fffffep127", Float.MAX_VALUE);
+
+#end[float]
+
+#if[double]
+ //---------------------------------------------------------------------
+ // %f, %e, %g, %a - Double.MIN_VALUE
+ //---------------------------------------------------------------------
+ test("%f", "0.000000", Double.MIN_VALUE);
+ test("%,f", "0.000000", Double.MIN_VALUE);
+ test("%(f", "(0.000000)", -Double.MIN_VALUE);
+ test("%30.0f", " 0", Double.MIN_VALUE);
+ test("%30.5f", " 0.00000", Double.MIN_VALUE);
+ test("%30.13f", " 0.0000000000000", Double.MIN_VALUE);
+ test("%30.20f", " 0.00000000000000000000", Double.MIN_VALUE);
+ test("%30.350f","0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000490000000000000000000000000",
+ Double.MIN_VALUE);
+ test("%e", "4.900000e-324", Double.MIN_VALUE);
+ test("%E", "4.900000E-324", Double.MIN_VALUE);
+ test("%(.1e", "4.9e-324", Double.MIN_VALUE);
+ test("%(E", "(4.900000E-324)", -Double.MIN_VALUE);
+ test("%30.5e", " 4.90000e-324", Double.MIN_VALUE);
+ test("%30.13e", " 4.9000000000000e-324", Double.MIN_VALUE);
+ test("%30.20e", " 4.90000000000000000000e-324", Double.MIN_VALUE);
+ test("%g", "4.90000e-324", Double.MIN_VALUE);
+ test("%G", "4.90000E-324", Double.MIN_VALUE);
+ test("%(g", "4.90000e-324", Double.MIN_VALUE);
+ test("%,g", "4.90000e-324", Double.MIN_VALUE);
+ test("%30.5g", " 4.9000e-324", Double.MIN_VALUE);
+ test("%30.13g", " 4.900000000000e-324", Double.MIN_VALUE);
+ test("%30.20g", " 4.9000000000000000000e-324", Double.MIN_VALUE);
+ test("%a", "0x0.0000000000001p-1022", Double.MIN_VALUE);
+ test("%A", "0X0.0000000000001P-1022", Double.MIN_VALUE);
+ test("%30a", " 0x0.0000000000001p-1022", Double.MIN_VALUE);
+
+ //---------------------------------------------------------------------
+ // %f, %e, %g, %a - Double.MAX_VALUE
+ //---------------------------------------------------------------------
+ test("%f", "179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000",
+ Double.MAX_VALUE);
+ test("%,f", "179,769,313,486,231,570,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000",
+ Double.MAX_VALUE);
+ test("%,(f", "(179,769,313,486,231,570,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000)",
+ -Double.MAX_VALUE);
+ test("%,30.5f", "179,769,313,486,231,570,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000",
+ Double.MAX_VALUE);
+ test("%30.13f", "179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000000000000",
+ Double.MAX_VALUE);
+ test("%30.20f", "179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000000",
+ Double.MAX_VALUE);
+ test("%e", "1.797693e+308", Double.MAX_VALUE);
+ test("%E", "1.797693E+308", Double.MAX_VALUE);
+ test("%(e", "1.797693e+308", Double.MAX_VALUE);
+ test("%(e", "(1.797693e+308)", -Double.MAX_VALUE);
+ test("%30.5e", " 1.79769e+308", Double.MAX_VALUE);
+ test("%30.13e", " 1.7976931348623e+308", Double.MAX_VALUE);
+ test("%30.20e", " 1.79769313486231570000e+308", Double.MAX_VALUE);
+ test("%g", "1.79769e+308", Double.MAX_VALUE);
+ test("%G", "1.79769E+308", Double.MAX_VALUE);
+ test("%,g", "1.79769e+308", Double.MAX_VALUE);
+ test("%(g", "(1.79769e+308)", -Double.MAX_VALUE);
+ test("%30.5g", " 1.7977e+308", Double.MAX_VALUE);
+ test("%30.13g", " 1.797693134862e+308", Double.MAX_VALUE);
+ test("%30.20g", " 1.7976931348623157000e+308", Double.MAX_VALUE);
+ test("%a", "0x1.fffffffffffffp1023", Double.MAX_VALUE);
+ test("%A", "0X1.FFFFFFFFFFFFFP1023", Double.MAX_VALUE);
+ test("%30a", " 0x1.fffffffffffffp1023", Double.MAX_VALUE);
+#end[double]
+
+#end[fp]
+
+ //---------------------------------------------------------------------
+ // %t
+ //
+ // Date/Time conversions applicable to Calendar, Date, and long.
+ //---------------------------------------------------------------------
+ test("%tA", "null", (Object)null);
+ test("%TA", "NULL", (Object)null);
+
+ //---------------------------------------------------------------------
+ // %t - errors
+ //---------------------------------------------------------------------
+ tryCatch("%t", UnknownFormatConversionException.class);
+ tryCatch("%T", UnknownFormatConversionException.class);
+ tryCatch("%tP", UnknownFormatConversionException.class);
+ tryCatch("%TP", UnknownFormatConversionException.class);
+ tryCatch("%.5tB", IllegalFormatPrecisionException.class);
+ tryCatch("%#tB", FormatFlagsConversionMismatchException.class);
+ tryCatch("%-tB", MissingFormatWidthException.class);
+
+#if[datetime]
+ //---------------------------------------------------------------------
+ // %t - create test Calendar
+ //---------------------------------------------------------------------
+
+ // Get the supported ids for GMT-08:00 (Pacific Standard Time)
+ String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
+ // Create a Pacific Standard Time time zone
+ SimpleTimeZone tz = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);
+ // public GregorianCalendar(TimeZone zone, Locale aLocale);
+ Calendar c0 = new GregorianCalendar(tz, Locale.US);
+ // public final void set(int year, int month, int date,
+ // int hourOfDay, int minute, int second);
+ c0.set(1995, MAY, 23, 19, 48, 34);
+ c0.set(Calendar.MILLISECOND, 584);
+
+ //---------------------------------------------------------------------
+ // %t - Minutes, {nano,milli}*seconds
+ //
+ // testDateTime() verifies the expected output for all applicable types
+ // (Calendar, Date, and long). It also verifies output for "%t" and
+ // "%T". Thus it is sufficient to invoke that method once per
+ // conversion/expected output.
+ //---------------------------------------------------------------------
+ testDateTime("%tM", "48", c0);
+ testDateTime("%tN", "584000000", c0);
+ testDateTime("%tL", "584", c0);
+// testDateTime("%tQ", "801283714584", c0);
+
+ testDateTime("%ts", String.valueOf(c0.getTimeInMillis() / 1000), c0);
+ testDateTime("%tS", "34", c0);
+ testDateTime("%tT", "19:48:34", c0);
+
+ //---------------------------------------------------------------------
+ // %t - Hours, morning/afternoon markers
+ //
+ // testHours() iterates through all twenty-four hours to verify
+ // numeric return value and morning/afternoon markers.
+ //---------------------------------------------------------------------
+ testHours();
+
+ //---------------------------------------------------------------------
+ // %t - Portions of date [ day, month, dates, weeks ]
+ //---------------------------------------------------------------------
+ testDateTime("%ta", "Tue", c0);
+ testDateTime("%tA", "Tuesday", c0);
+ testDateTime("%tb", "May", c0);
+ testDateTime("%tB", "May", c0);
+ testDateTime("%tC", "19", c0);
+ testDateTime("%td", "23", c0);
+ testDateTime("%te", "23", c0);
+ testDateTime("%th", "May", c0);
+ testDateTime("%tj", "143", c0);
+ testDateTime("%tm", "05", c0);
+ testDateTime("%ty", "95", c0);
+ testDateTime("%tY", "1995", c0);
+
+ //---------------------------------------------------------------------
+ // %t - TimeZone
+ //---------------------------------------------------------------------
+ testDateTime("%tz", "-0800", c0);
+ testDateTime("%tZ", "PST", c0);
+
+ //---------------------------------------------------------------------
+ // %tz should always adjust for DST
+ //---------------------------------------------------------------------
+ TimeZone dtz = TimeZone.getDefault();
+
+ // Artificial TimeZone based on PST with 3:15 DST always in effect
+ TimeZone atz = new SimpleTimeZone(-8 * 60 * 60 * 1000, "AlwaysDST",
+ JANUARY, 1, 0, 0, STANDARD_TIME,
+ // 24hrs - 1m = 60 * 60 * 1000 * 24 - 1
+ DECEMBER, 31, 0, 60 * 60 * 1000 * 24 - 1, STANDARD_TIME,
+ (int)(60 * 60 * 1000 * 3.25));
+ TimeZone.setDefault(atz);
+ testDateTime("%tz", "-0445", Calendar.getInstance(atz));
+
+ // Restore the TimeZone and verify
+ TimeZone.setDefault(dtz);
+ if (atz.hasSameRules(TimeZone.getDefault()))
+ throw new RuntimeException("Default TimeZone not restored");
+
+ //---------------------------------------------------------------------
+ // %t - Composites
+ //---------------------------------------------------------------------
+ testDateTime("%tr", "07:48:34 PM", c0);
+ testDateTime("%tR", "19:48", c0);
+ testDateTime("%tc", "Tue May 23 19:48:34 PST 1995", c0);
+ testDateTime("%tD", "05/23/95", c0);
+ testDateTime("%tF", "1995-05-23", c0);
+ testDateTime("%-12tF", "1995-05-23 ", c0);
+ testDateTime("%12tF", " 1995-05-23", c0);
+#end[datetime]
+
+ //---------------------------------------------------------------------
+ // %n
+ //---------------------------------------------------------------------
+ test("%n", System.getProperty("line.separator"), (Object)null);
+ test("%n", System.getProperty("line.separator"), "");
+
+ tryCatch("%,n", IllegalFormatFlagsException.class);
+ tryCatch("%.n", UnknownFormatConversionException.class);
+ tryCatch("%5.n", UnknownFormatConversionException.class);
+ tryCatch("%5n", IllegalFormatWidthException.class);
+ tryCatch("%.7n", IllegalFormatPrecisionException.class);
+ tryCatch("%<n", IllegalFormatFlagsException.class);
+
+ //---------------------------------------------------------------------
+ // %%
+ //---------------------------------------------------------------------
+ test("%%", "%", (Object)null);
+ test("%%", "%", "");
+ tryCatch("%%%", UnknownFormatConversionException.class);
+ // perhaps an IllegalFormatArgumentIndexException should be defined?
+ tryCatch("%<%", IllegalFormatFlagsException.class);
+ }
+}
--- a/jdk/test/java/util/Formatter/genBasic.sh Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/Formatter/genBasic.sh Wed Dec 16 16:25:08 2009 -0800
@@ -27,10 +27,10 @@
gen() {
# if [ $3 = "true" ]
-# then $SPP -K$1 -Dtype=$1 -DType=$2 -Kprim<Basic-X.java >Basic$2.java
-# else $SPP -K$1 -Dtype=$1 -DType=$2 -K$3 <Basic-X.java >Basic$2.java
+# then $SPP -K$1 -Dtype=$1 -DType=$2 -Kprim<Basic-X.java.template >Basic$2.java
+# else $SPP -K$1 -Dtype=$1 -DType=$2 -K$3 <Basic-X.java.template >Basic$2.java
# fi
- java build.tools.spp.Spp -K$1 -Dtype=$1 -DType=$2 -K$3 -K$4 -K$5 -K$6 <Basic-X.java >Basic$2.java
+ java build.tools.spp.Spp -K$1 -Dtype=$1 -DType=$2 -K$3 -K$4 -K$5 -K$6 <Basic-X.java.template >Basic$2.java
}
gen boolean Boolean prim "" "" ""
--- a/jdk/test/java/util/IdentityHashMap/ToString.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/IdentityHashMap/ToString.java Wed Dec 16 16:25:08 2009 -0800
@@ -26,9 +26,6 @@
* @bug 4973432
* @summary Test that toString on entrySet Iterator/Entry behaves reasonably
* @author Josh Bloch
- *
- * @compile -source 1.5 ToString.java
- * @run main ToString
*/
--- a/jdk/test/java/util/Locale/Bug4175998Test.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/Locale/Bug4175998Test.java Wed Dec 16 16:25:08 2009 -0800
@@ -23,7 +23,7 @@
/*
@test
@summary test ISO639-2 language codes
- @compile -encoding ascii -source 1.4 -target 1.4 Bug4175998Test.java
+ @compile -encoding ascii -source 5 Bug4175998Test.java
@run main Bug4175998Test
@bug 4175998
*/
--- a/jdk/test/java/util/UUID/UUIDTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/UUID/UUIDTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -23,8 +23,6 @@
/* @test
* @bug 4173528 5068772
- * @compile -source 1.4 -target 1.4 UUIDTest.java
- * @run main UUIDTest
* @summary Unit tests for java.util.UUID
*/
--- a/jdk/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 CancelledProducerConsumerLoops.java
+ * @compile CancelledProducerConsumerLoops.java
* @run main/timeout=7000 CancelledProducerConsumerLoops
* @summary Checks for responsiveness of blocking queues to cancellation.
* Runs under the assumption that ITERS computations require more than
--- a/jdk/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 MultipleProducersSingleConsumerLoops.java
+ * @compile MultipleProducersSingleConsumerLoops.java
* @run main/timeout=3600 MultipleProducersSingleConsumerLoops
* @summary multiple producers and single consumer using blocking queues
*/
--- a/jdk/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 ProducerConsumerLoops.java
+ * @compile ProducerConsumerLoops.java
* @run main/timeout=3600 ProducerConsumerLoops
* @summary multiple producers and consumers using blocking queues
*/
--- a/jdk/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 SingleProducerMultipleConsumerLoops.java
+ * @compile SingleProducerMultipleConsumerLoops.java
* @run main/timeout=600 SingleProducerMultipleConsumerLoops
* @summary check ordering for blocking queues with 1 producer and multiple consumers
*/
--- a/jdk/test/java/util/concurrent/ConcurrentHashMap/MapCheck.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/ConcurrentHashMap/MapCheck.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 MapCheck.java
+ * @compile MapCheck.java
* @run main/timeout=240 MapCheck
* @summary Times and checks basic map operations
*/
--- a/jdk/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 MapLoops.java
+ * @compile MapLoops.java
* @run main/timeout=1600 MapLoops
* @summary Exercise multithreaded maps, by default ConcurrentHashMap.
* Multithreaded hash table test. Each thread does a random walk
--- a/jdk/test/java/util/concurrent/Exchanger/ExchangeLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/Exchanger/ExchangeLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 ExchangeLoops.java
+ * @compile ExchangeLoops.java
* @run main/timeout=720 ExchangeLoops
* @summary checks to make sure a pipeline of exchangers passes data.
*/
--- a/jdk/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4965960
- * @compile -source 1.5 ExecutorCompletionServiceLoops.java
+ * @compile ExecutorCompletionServiceLoops.java
* @run main/timeout=3600 ExecutorCompletionServiceLoops
* @summary Exercise ExecutorCompletionServiceLoops
*/
--- a/jdk/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 CancelledFutureLoops.java
+ * @compile CancelledFutureLoops.java
* @run main/timeout=2000 CancelledFutureLoops
* @summary Checks for responsiveness of futures to cancellation.
* Runs under the assumption that ITERS computations require more than
--- a/jdk/test/java/util/concurrent/atomic/VMSupportsCS8.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/atomic/VMSupportsCS8.java Wed Dec 16 16:25:08 2009 -0800
@@ -24,8 +24,6 @@
/*
* @test
* @bug 4992443 4994819
- * @compile -source 1.5 VMSupportsCS8.java
- * @run main VMSupportsCS8
* @summary Checks that the value of VMSupportsCS8 matches system properties.
*/
--- a/jdk/test/java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 CancelledLockLoops.java
+ * @compile CancelledLockLoops.java
* @run main/timeout=2800 CancelledLockLoops
* @summary tests lockInterruptibly.
* Checks for responsiveness of locks to interrupts. Runs under that
--- a/jdk/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 LockOncePerThreadLoops.java
+ * @compile LockOncePerThreadLoops.java
* @run main/timeout=15000 LockOncePerThreadLoops
* @summary Checks for missed signals by locking and unlocking each of an array of locks once per thread
*/
--- a/jdk/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 SimpleReentrantLockLoops.java
+ * @compile SimpleReentrantLockLoops.java
* @run main/timeout=4500 SimpleReentrantLockLoops
* @summary multiple threads using a single lock
*/
--- a/jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,8 +34,6 @@
/*
* @test
* @bug 4486658 5031862
- * @compile -source 1.5 TimeoutLockLoops.java
- * @run main TimeoutLockLoops
* @summary Checks for responsiveness of locks to timeouts.
* Runs under the assumption that ITERS computations require more than
* TIMEOUT msecs to complete, which seems to be a safe assumption for
--- a/jdk/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java Wed Dec 16 16:25:08 2009 -0800
@@ -34,7 +34,7 @@
/*
* @test
* @bug 4486658
- * @compile -source 1.5 MapLoops.java
+ * @compile MapLoops.java
* @run main/timeout=4700 MapLoops
* @summary Exercise multithreaded maps, by default ConcurrentHashMap.
* Multithreaded hash table test. Each thread does a random walk
--- a/jdk/test/sun/management/AgentCheckTest.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/sun/management/AgentCheckTest.java Wed Dec 16 16:25:08 2009 -0800
@@ -27,9 +27,6 @@
* @summary Localize log messages from the management agents
*
* @author Tim Bell
- *
- * @run compile -source 1.5 -g AgentCheckTest.java
- * @run main AgentCheckTest
*/
import sun.management.Agent;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/jgss/spnego/NoSpnegoAsDefMech.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6770883
+ * @summary Infinite loop if SPNEGO specified as sun.security.jgss.mechanism
+ */
+
+import org.ietf.jgss.*;
+import sun.security.jgss.*;
+
+public class NoSpnegoAsDefMech {
+
+ public static void main(String[] argv) throws Exception {
+ System.setProperty("sun.security.jgss.mechanism", GSSUtil.GSS_SPNEGO_MECH_OID.toString());
+ try {
+ GSSManager.getInstance().createName("service@host", GSSName.NT_HOSTBASED_SERVICE, new Oid("1.3.6.1.5.5.2"));
+ } catch (GSSException e) {
+ // This is OK, for example, krb5.conf is missing or other problems
+ }
+ }
+}
--- a/jdk/test/sun/security/krb5/auto/Context.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/sun/security/krb5/auto/Context.java Wed Dec 16 16:25:08 2009 -0800
@@ -72,7 +72,7 @@
public class Context {
private Subject s;
- private GSSContext x;
+ private ExtendedGSSContext x;
private boolean f; // context established?
private String name;
private GSSCredential cred; // see static method delegated().
@@ -147,8 +147,8 @@
@Override
public byte[] run(Context me, byte[] dummy) throws Exception {
GSSManager m = GSSManager.getInstance();
- me.x = m.createContext(
- target.indexOf('@') < 0 ?
+ me.x = (ExtendedGSSContext)m.createContext(
+ target.indexOf('@') < 0 ?
m.createName(target, null) :
m.createName(target, GSSName.NT_HOSTBASED_SERVICE),
mech,
@@ -170,7 +170,7 @@
@Override
public byte[] run(Context me, byte[] dummy) throws Exception {
GSSManager m = GSSManager.getInstance();
- me.x = m.createContext(m.createCredential(
+ me.x = (ExtendedGSSContext)m.createContext(m.createCredential(
null,
GSSCredential.INDEFINITE_LIFETIME,
mech,
@@ -193,7 +193,7 @@
*
* @return the GSSContext object
*/
- public GSSContext x() {
+ public ExtendedGSSContext x() {
return x;
}
@@ -255,6 +255,11 @@
if (x.getSequenceDetState()) {
sb.append("seq det, ");
}
+ if (x instanceof ExtendedGSSContext) {
+ if (((ExtendedGSSContext)x).getDelegPolicyState()) {
+ sb.append("deleg policy, ");
+ }
+ }
System.out.println("Context status of " + name + ": " + sb.toString());
System.out.println(x.getSrcName() + " -> " + x.getTargName());
} catch (Exception e) {
--- a/jdk/test/sun/security/krb5/auto/KDC.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/sun/security/krb5/auto/KDC.java Wed Dec 16 16:25:08 2009 -0800
@@ -63,6 +63,14 @@
* settings after calling a KDC method, call <code>Config.refresh()</code> to
* make sure your changes are reflected in the <code>Config</code> object.
* </ol>
+ * System properties recognized:
+ * <ul>
+ * <li>test.kdc.save.ccache
+ * </ul>
+ * Support policies:
+ * <ul>
+ * <li>ok-as-delegate
+ * </ul>
* Issues and TODOs:
* <ol>
* <li> Generates krb5.conf to be used on another machine, currently the kdc is
@@ -151,7 +159,7 @@
* A standalone KDC server.
*/
public static void main(String[] args) throws Exception {
- KDC kdc = create("RABBIT.HOLE", "kdc.rabbit,hole", 0, false);
+ KDC kdc = create("RABBIT.HOLE", "kdc.rabbit.hole", 0, false);
kdc.addPrincipal("dummy", "bogus".toCharArray());
kdc.addPrincipal("foo", "bar".toCharArray());
kdc.addPrincipalRandKey("krbtgt/RABBIT.HOLE");
@@ -426,14 +434,17 @@
* @throws sun.security.krb5.KrbException when the principal is not inside
* the database.
*/
- private char[] getPassword(PrincipalName p) throws KrbException {
+ private char[] getPassword(PrincipalName p, boolean server)
+ throws KrbException {
String pn = p.toString();
if (p.getRealmString() == null) {
pn = pn + "@" + getRealm();
}
char[] pass = passwords.get(pn);
if (pass == null) {
- throw new KrbException(Krb5.KDC_ERR_C_PRINCIPAL_UNKNOWN);
+ throw new KrbException(server?
+ Krb5.KDC_ERR_S_PRINCIPAL_UNKNOWN:
+ Krb5.KDC_ERR_C_PRINCIPAL_UNKNOWN);
}
return pass;
}
@@ -457,10 +468,12 @@
* Returns the key for a given principal of the given encryption type
* @param p the principal
* @param etype the encryption type
+ * @param server looking for a server principal?
* @return the key
* @throws sun.security.krb5.KrbException for unknown/unsupported etype
*/
- private EncryptionKey keyForUser(PrincipalName p, int etype) throws KrbException {
+ private EncryptionKey keyForUser(PrincipalName p, int etype, boolean server)
+ throws KrbException {
try {
// Do not call EncryptionKey.acquireSecretKeys(), otherwise
// the krb5.conf config file would be loaded.
@@ -469,22 +482,71 @@
Integer kvno = null;
// For service whose password ending with a number, use it as kvno
if (p.toString().indexOf('/') >= 0) {
- char[] pass = getPassword(p);
+ char[] pass = getPassword(p, server);
if (Character.isDigit(pass[pass.length-1])) {
kvno = pass[pass.length-1] - '0';
}
}
return new EncryptionKey((byte[]) stringToKey.invoke(
- null, getPassword(p), getSalt(p), null, etype),
+ null, getPassword(p, server), getSalt(p), null, etype),
etype, kvno);
} catch (InvocationTargetException ex) {
KrbException ke = (KrbException)ex.getCause();
throw ke;
+ } catch (KrbException ke) {
+ throw ke;
} catch (Exception e) {
throw new RuntimeException(e); // should not happen
}
}
+ private Map<String,String> policies = new HashMap<String,String>();
+
+ public void setPolicy(String rule, String value) {
+ if (value == null) {
+ policies.remove(rule);
+ } else {
+ policies.put(rule, value);
+ }
+ }
+ /**
+ * If the provided client/server pair matches a rule
+ *
+ * A system property named test.kdc.policy.RULE will be consulted.
+ * If it's unset, returns false. If its value is "", any pair is
+ * matched. Otherwise, it should contains the server name matched.
+ *
+ * TODO: client name is not used currently.
+ *
+ * @param c client name
+ * @param s server name
+ * @param rule rule name
+ * @return if a match is found
+ */
+ private boolean configMatch(String c, String s, String rule) {
+ String policy = policies.get(rule);
+ boolean result = false;
+ if (policy == null) {
+ result = false;
+ } else if (policy.length() == 0) {
+ result = true;
+ } else {
+ String[] names = policy.split("\\s+");
+ for (String name: names) {
+ if (name.equals(s)) {
+ result = true;
+ break;
+ }
+ }
+ }
+ if (result) {
+ System.out.printf(">>>> Policy match result (%s vs %s on %s) %b\n",
+ c, s, rule, result);
+ }
+ return result;
+ }
+
+
/**
* Processes an incoming request and generates a response.
* @param in the request
@@ -530,7 +592,7 @@
tkt = apReq.ticket;
etype = tkt.encPart.getEType();
tkt.sname.setRealm(tkt.realm);
- EncryptionKey kkey = keyForUser(tkt.sname, etype);
+ EncryptionKey kkey = keyForUser(tkt.sname, etype, true);
byte[] bb = tkt.encPart.decrypt(kkey, KeyUsage.KU_TICKET);
DerInputStream derIn = new DerInputStream(bb);
DerValue der = derIn.getDerValue();
@@ -541,7 +603,7 @@
throw new KrbException(Krb5.KDC_ERR_PADATA_TYPE_NOSUPP);
}
}
- EncryptionKey skey = keyForUser(body.sname, etype);
+ EncryptionKey skey = keyForUser(body.sname, etype, true);
if (skey == null) {
throw new KrbException(Krb5.KDC_ERR_SUMTYPE_NOSUPP); // TODO
}
@@ -581,6 +643,10 @@
if (body.kdcOptions.get(KDCOptions.ALLOW_POSTDATE)) {
bFlags[Krb5.TKT_OPTS_MAY_POSTDATE] = true;
}
+
+ if (configMatch("", body.sname.getNameString(), "ok-as-delegate")) {
+ bFlags[Krb5.TKT_OPTS_DELEGATE] = true;
+ }
bFlags[Krb5.TKT_OPTS_INITIAL] = true;
TicketFlags tFlags = new TicketFlags(bFlags);
@@ -671,8 +737,8 @@
eTypes = (int[])f.get(body);
int eType = eTypes[0];
- EncryptionKey ckey = keyForUser(body.cname, eType);
- EncryptionKey skey = keyForUser(body.sname, eType);
+ EncryptionKey ckey = keyForUser(body.cname, eType, false);
+ EncryptionKey skey = keyForUser(body.sname, eType, true);
if (ckey == null) {
throw new KrbException(Krb5.KDC_ERR_ETYPE_NOSUPP);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/auto/OkAsDelegate.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import com.sun.security.jgss.ExtendedGSSContext;
+import org.ietf.jgss.GSSCredential;
+import org.ietf.jgss.GSSException;
+import org.ietf.jgss.Oid;
+import sun.security.jgss.GSSUtil;
+import sun.security.krb5.Config;
+
+public class OkAsDelegate {
+
+ public static void main(String[] args)
+ throws Exception {
+ OkAsDelegate ok = new OkAsDelegate();
+ ok.go(
+ Boolean.valueOf(args[0]), // FORWARDABLE in krb5.conf on?
+ Boolean.valueOf(args[1]), // requestDelegState
+ Boolean.valueOf(args[2]), // requestDelegPolicyState
+ Boolean.valueOf(args[3]), // DelegState in response
+ Boolean.valueOf(args[4]), // DelegPolicyState in response
+ Boolean.valueOf(args[5]) // getDelegCred OK?
+ );
+ }
+
+ void go(
+ boolean forwardable,
+ boolean requestDelegState,
+ boolean requestDelegPolicyState,
+ boolean delegState,
+ boolean delegPolicyState,
+ boolean delegated
+ ) throws Exception {
+ OneKDC kdc = new OneKDC(null);
+ kdc.setPolicy("ok-as-delegate",
+ System.getProperty("test.kdc.policy.ok-as-delegate"));
+ kdc.writeJAASConf();
+ if (!forwardable) {
+ // The default OneKDC always includes "forwardable = true"
+ // in krb5.conf, override it.
+ KDC.saveConfig(OneKDC.KRB5_CONF, kdc,
+ "default_keytab_name = " + OneKDC.KTAB);
+ Config.refresh();
+ }
+
+ Context c, s;
+ c = Context.fromJAAS("client");
+ s = Context.fromJAAS("server");
+
+ Oid mech = GSSUtil.GSS_KRB5_MECH_OID;
+ if (System.getProperty("test.spnego") != null) {
+ mech = GSSUtil.GSS_SPNEGO_MECH_OID;
+ }
+ c.startAsClient(OneKDC.SERVER, mech);
+ ExtendedGSSContext cx = (ExtendedGSSContext)c.x();
+ cx.requestCredDeleg(requestDelegState);
+ cx.requestDelegPolicy(requestDelegPolicyState);
+ s.startAsServer(mech);
+ ExtendedGSSContext sx = (ExtendedGSSContext)s.x();
+
+ Context.handshake(c, s);
+
+ if (cx.getCredDelegState() != delegState) {
+ throw new Exception("Initiator cred state error");
+ }
+ if (sx.getCredDelegState() != delegState) {
+ throw new Exception("Acceptor cred state error");
+ }
+ if (cx.getDelegPolicyState() != delegPolicyState) {
+ throw new Exception("Initiator cred policy state error");
+ }
+
+ GSSCredential cred = null;
+ try {
+ cred = s.x().getDelegCred();
+ } catch (GSSException e) {
+ // leave cred as null
+ }
+
+ if (delegated != (cred != null)) {
+ throw new Exception("get cred error");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/auto/OkAsDelegateXRealm.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import com.sun.security.jgss.ExtendedGSSContext;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.security.Security;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import org.ietf.jgss.GSSContext;
+import org.ietf.jgss.GSSCredential;
+import org.ietf.jgss.GSSException;
+import org.ietf.jgss.GSSManager;
+import org.ietf.jgss.GSSName;
+import sun.security.jgss.GSSUtil;
+import sun.security.krb5.Config;
+
+public class OkAsDelegateXRealm implements CallbackHandler {
+
+ /**
+ * @param args boolean if the program should succeed
+ */
+ public static void main(String[] args)
+ throws Exception {
+
+ // Create and start the KDCs. Here we have 3 realms: R1, R2 and R3.
+ // R1 is trusted by R2, and R2 trusted by R3.
+ KDC kdc1 = KDC.create("R1");
+ kdc1.setPolicy("ok-as-delegate",
+ System.getProperty("test.kdc.policy.ok-as-delegate"));
+ kdc1.addPrincipal("dummy", "bogus".toCharArray());
+ kdc1.addPrincipalRandKey("krbtgt/R1");
+ kdc1.addPrincipal("krbtgt/R2@R1", "r1->r2".toCharArray());
+
+ KDC kdc2 = KDC.create("R2");
+ kdc2.setPolicy("ok-as-delegate",
+ System.getProperty("test.kdc.policy.ok-as-delegate"));
+ kdc2.addPrincipalRandKey("krbtgt/R2");
+ kdc2.addPrincipal("krbtgt/R2@R1", "r1->r2".toCharArray());
+ kdc2.addPrincipal("krbtgt/R3@R2", "r2->r3".toCharArray());
+
+ KDC kdc3 = KDC.create("R3");
+ kdc3.setPolicy("ok-as-delegate",
+ System.getProperty("test.kdc.policy.ok-as-delegate"));
+ kdc3.addPrincipalRandKey("krbtgt/R3");
+ kdc3.addPrincipal("krbtgt/R3@R2", "r2->r3".toCharArray());
+ kdc3.addPrincipalRandKey("host/host.r3.local");
+
+ KDC.saveConfig("krb5-localkdc.conf", kdc1, kdc2, kdc3,
+ "forwardable=true",
+ "[capaths]",
+ "R1 = {",
+ " R2 = .",
+ " R3 = R2",
+ "}",
+ "[domain_realm]",
+ ".r3.local=R3"
+ );
+
+ System.setProperty("java.security.krb5.conf", "krb5-localkdc.conf");
+ kdc3.writeKtab("localkdc.ktab");
+
+ FileOutputStream fos = new FileOutputStream("jaas-localkdc.conf");
+
+ // Defines the client and server on R1 and R3 respectively.
+ fos.write(("com.sun.security.jgss.krb5.initiate {\n" +
+ " com.sun.security.auth.module.Krb5LoginModule\n" +
+ " required\n" +
+ " principal=dummy\n" +
+ " doNotPrompt=false\n" +
+ " useTicketCache=false\n" +
+ " ;\n};\n" +
+ "com.sun.security.jgss.krb5.accept {\n" +
+ " com.sun.security.auth.module.Krb5LoginModule required\n" +
+ " principal=\"host/host.r3.local@R3\"\n" +
+ " useKeyTab=true\n" +
+ " keyTab=localkdc.ktab\n" +
+ " isInitiator=false\n" +
+ " storeKey=true;\n};\n" +
+ "\n").getBytes());
+ fos.close();
+
+ Security.setProperty("auth.login.defaultCallbackHandler",
+ "OkAsDelegateXRealm");
+
+ System.setProperty("java.security.auth.login.config", "jaas-localkdc.conf");
+
+ new File("krb5-localkdc.conf").deleteOnExit();
+ new File("localkdc.ktab").deleteOnExit();
+ new File("jaas-localkdc.conf").deleteOnExit();
+ Config.refresh();
+
+ Context c = Context.fromJAAS("com.sun.security.jgss.krb5.initiate");
+ Context s = Context.fromJAAS("com.sun.security.jgss.krb5.accept");
+
+ // Test twice. The frist time the whole cross realm process is tried,
+ // the second time the cached service ticket is used. This is to make sure
+ // the behaviors are the same, especailly for the case when one of the
+ // cross-realm TGTs does not have OK-AS-DELEGATE on.
+
+ for (int i=0; i<2; i++) {
+ c.startAsClient("host@host.r3.local", GSSUtil.GSS_KRB5_MECH_OID);
+ s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID);
+ c.x().requestDelegPolicy(true);
+
+ Context.handshake(c, s);
+ boolean succeed = true;
+ try {
+ s.x().getDelegCred();
+ } catch (GSSException gsse) {
+ succeed = false;
+ }
+ if (succeed != Boolean.parseBoolean(args[0])) {
+ throw new Exception("Test fail at round #" + i);
+ }
+ }
+ }
+
+ @Override
+ public void handle(Callback[] callbacks)
+ throws IOException, UnsupportedCallbackException {
+ for (Callback callback : callbacks) {
+ if (callback instanceof NameCallback) {
+ ((NameCallback) callback).setName("dummy");
+ }
+ if (callback instanceof PasswordCallback) {
+ ((PasswordCallback) callback).setPassword("bogus".toCharArray());
+ }
+ }
+ }
+}
+
--- a/jdk/test/sun/security/krb5/auto/SSL.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/sun/security/krb5/auto/SSL.java Wed Dec 16 16:25:08 2009 -0800
@@ -36,33 +36,32 @@
public class SSL {
private static final String KRB5_CIPHER = "TLS_KRB5_WITH_3DES_EDE_CBC_SHA";
- private static final int PORT = 4569;
private static final int LOOP_LIMIT = 1;
private static final char[] PASS = "secret".toCharArray();
private static int loopCount = 0;
-
- private static String SERVER;
+ private static volatile String server;
+ private static volatile int port;
public static void main(String[] args) throws Exception {
KDC kdc = KDC.create(OneKDC.REALM);
// Run this after KDC, so our own DNS service can be started
try {
- SERVER = InetAddress.getLocalHost().getHostName();
+ server = InetAddress.getLocalHost().getHostName().toLowerCase();
} catch (java.net.UnknownHostException e) {
- SERVER = "localhost";
+ server = "localhost";
}
kdc.addPrincipal(OneKDC.USER, OneKDC.PASS);
kdc.addPrincipalRandKey("krbtgt/" + OneKDC.REALM);
- kdc.addPrincipal("host/" + SERVER, PASS);
+ kdc.addPrincipal("host/" + server, PASS);
KDC.saveConfig(OneKDC.KRB5_CONF, kdc);
System.setProperty("java.security.krb5.conf", OneKDC.KRB5_CONF);
final Context c = Context.fromUserPass(OneKDC.USER, OneKDC.PASS, false);
- final Context s = Context.fromUserPass("host/" + SERVER, PASS, true);
+ final Context s = Context.fromUserPass("host/" + server, PASS, true);
- c.startAsClient("host/" + SERVER, GSSUtil.GSS_KRB5_MECH_OID);
+ c.startAsClient("host/" + server, GSSUtil.GSS_KRB5_MECH_OID);
s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID);
new Thread(new Runnable() {
@@ -87,7 +86,7 @@
public byte[] run(Context s, byte[] input) throws Exception {
SSLSocketFactory sslsf =
(SSLSocketFactory) SSLSocketFactory.getDefault();
- SSLSocket sslSocket = (SSLSocket) sslsf.createSocket(SERVER, PORT);
+ SSLSocket sslSocket = (SSLSocket) sslsf.createSocket(server, port);
// Enable only a KRB5 cipher suite.
String enabledSuites[] = {KRB5_CIPHER};
@@ -124,7 +123,8 @@
SSLServerSocketFactory sslssf =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslServerSocket =
- (SSLServerSocket) sslssf.createServerSocket(PORT);
+ (SSLServerSocket) sslssf.createServerSocket(0); // any port
+ port = sslServerSocket.getLocalPort();
// Enable only a KRB5 cipher suite.
String enabledSuites[] = {KRB5_CIPHER};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/auto/ok-as-delegate-xrealm.sh Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,79 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6853328
+# @summary Support OK-AS-DELEGATE flag
+# @run shell/timeout=600 ok-as-delegate-xrealm.sh
+#
+
+if [ "${TESTSRC}" = "" ] ; then
+ TESTSRC=`dirname $0`
+fi
+
+if [ "${TESTJAVA}" = "" ] ; then
+ JAVAC_CMD=`which javac`
+ TESTJAVA=`dirname $JAVAC_CMD`/..
+fi
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+ Windows_* )
+ FS="\\"
+ SEP=";"
+ ;;
+ CYGWIN* )
+ FS="/"
+ SEP=";"
+ ;;
+ * )
+ FS="/"
+ SEP=":"
+ ;;
+esac
+
+${TESTJAVA}${FS}bin${FS}javac -XDignore.symbol.file -d . \
+ ${TESTSRC}${FS}OkAsDelegateXRealm.java \
+ ${TESTSRC}${FS}KDC.java \
+ ${TESTSRC}${FS}OneKDC.java \
+ ${TESTSRC}${FS}Action.java \
+ ${TESTSRC}${FS}Context.java \
+ || exit 10
+
+# Add $TESTSRC to classpath so that customized nameservice can be used
+J="${TESTJAVA}${FS}bin${FS}java -cp $TESTSRC${SEP}."
+
+# KDC no OK-AS-DELEGATE, fail
+$J OkAsDelegateXRealm false || exit 1
+
+# KDC set OK-AS-DELEGATE for all, succeed
+$J -Dtest.kdc.policy.ok-as-delegate OkAsDelegateXRealm true || exit 2
+
+# KDC set OK-AS-DELEGATE for host/host.r3.local only, fail
+$J -Dtest.kdc.policy.ok-as-delegate=host/host.r3.local OkAsDelegateXRealm false || exit 3
+
+# KDC set OK-AS-DELEGATE for all, succeed
+$J "-Dtest.kdc.policy.ok-as-delegate=host/host.r3.local krbtgt/R2 krbtgt/R3" OkAsDelegateXRealm true || exit 4
+
+exit 0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/auto/ok-as-delegate.sh Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,118 @@
+#
+# Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 6853328
+# @summary Support OK-AS-DELEGATE flag
+# @run shell/timeout=600 ok-as-delegate.sh
+#
+
+if [ "${TESTSRC}" = "" ] ; then
+ TESTSRC=`dirname $0`
+fi
+
+if [ "${TESTJAVA}" = "" ] ; then
+ JAVAC_CMD=`which javac`
+ TESTJAVA=`dirname $JAVAC_CMD`/..
+fi
+
+# set platform-dependent variables
+OS=`uname -s`
+case "$OS" in
+ Windows_* )
+ FS="\\"
+ SEP=";"
+ ;;
+ CYGWIN* )
+ FS="/"
+ SEP=";"
+ ;;
+ * )
+ FS="/"
+ SEP=":"
+ ;;
+esac
+
+${TESTJAVA}${FS}bin${FS}javac -XDignore.symbol.file -d . \
+ ${TESTSRC}${FS}OkAsDelegate.java \
+ ${TESTSRC}${FS}KDC.java \
+ ${TESTSRC}${FS}OneKDC.java \
+ ${TESTSRC}${FS}Action.java \
+ ${TESTSRC}${FS}Context.java \
+ || exit 10
+
+# Testing Kerberos 5
+
+# Add $TESTSRC to classpath so that customized nameservice can be used
+J="${TESTJAVA}${FS}bin${FS}java -cp $TESTSRC${SEP}. OkAsDelegate"
+JOK="${TESTJAVA}${FS}bin${FS}java -cp $TESTSRC${SEP}. -Dtest.kdc.policy.ok-as-delegate OkAsDelegate"
+
+# FORWARDABLE ticket not allowed, always fail
+$J false true true false false false || exit 1
+
+# Service ticket no OK-AS-DELEGATE
+
+# Request nothing, gain nothing
+$J true false false false false false || exit 2
+# Request deleg policy, gain nothing
+$J true false true false false false || exit 3
+# Request deleg, granted
+$J true true false true false true || exit 4
+# Request deleg and deleg policy, granted, with info not by policy
+$J true true true true false true || exit 5
+
+# Service ticket has OK-AS-DELEGATE
+
+# Request deleg policy, granted
+$JOK true false true true true true || exit 6
+# Request deleg and deleg policy, granted, with info by policy
+$JOK true true true true true true || exit 7
+
+# Testing SPNEGO
+
+# Add $TESTSRC to classpath so that customized nameservice can be used
+J="${TESTJAVA}${FS}bin${FS}java -cp $TESTSRC${SEP}. -Dtest.spnego OkAsDelegate"
+JOK="${TESTJAVA}${FS}bin${FS}java -cp $TESTSRC${SEP}. -Dtest.spnego -Dtest.kdc.policy.ok-as-delegate OkAsDelegate"
+
+# FORWARDABLE ticket not allowed, always fail
+$J false true true false false false || exit 11
+
+# Service ticket no OK-AS-DELEGATE
+
+# Request nothing, gain nothing
+$J true false false false false false || exit 12
+# Request deleg policy, gain nothing
+$J true false true false false false || exit 13
+# Request deleg, granted
+$J true true false true false true || exit 14
+# Request deleg and deleg policy, granted, with info not by policy
+$J true true true true false true || exit 15
+
+# Service ticket has OK-AS-DELEGATE
+
+# Request deleg policy, granted
+$JOK true false true true true true || exit 16
+# Request deleg and deleg policy, granted, with info by policy
+$JOK true true true true true true || exit 17
+
+exit 0
--- a/jdk/test/sun/security/util/Oid/S11N.sh Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/sun/security/util/Oid/S11N.sh Wed Dec 16 16:25:08 2009 -0800
@@ -99,7 +99,7 @@
# the test code
-${TESTJAVA}${FS}bin${FS}javac -source 1.3 -target 1.3 -d . ${TESTSRC}${FS}SerialTest.java || exit 10
+${TESTJAVA}${FS}bin${FS}javac -d . ${TESTSRC}${FS}SerialTest.java || exit 10
OLDJAVA="
/java/re/j2se/1.6.0/latest/binaries/${PF}
--- a/jdk/test/sun/tools/jconsole/ResourceCheckTest.sh Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/sun/tools/jconsole/ResourceCheckTest.sh Wed Dec 16 16:25:08 2009 -0800
@@ -98,7 +98,7 @@
set -vx
#
#Compile. jconsole.jar is required on the classpath.
-${TESTJAVA}/bin/javac -source 1.5 -d "${TESTCLASSES}" ${CP} -g \
+${TESTJAVA}/bin/javac -d "${TESTCLASSES}" ${CP} -g \
"${TESTSRC}"/"${TARGETCLASS}".java
#
#Run the test class, again with the classpath we need:
--- a/jdk/test/sun/tools/jhat/HatRun.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/sun/tools/jhat/HatRun.java Wed Dec 16 16:25:08 2009 -0800
@@ -186,11 +186,13 @@
*/
int nvm_options = 0;
if ( vm_options != null ) nvm_options = vm_options.length;
- String cmd[] = new String[1 + (d64?1:0) + 5 + nvm_options];
+ String cmd[] = new String[1 + (d64?1:0) + 7 + nvm_options];
int i,j;
i = 0;
cmd[i++] = java;
+ cmd[i++] = "-cp";
+ cmd[i++] = cdir;
cmd[i++] = "-Dtest.classes=" + cdir;
if ( d64 ) {
cmd[i++] = "-d64";
--- a/jdk/test/sun/tools/native2ascii/NativeErrors.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/sun/tools/native2ascii/NativeErrors.java Wed Dec 16 16:25:08 2009 -0800
@@ -59,15 +59,28 @@
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
checkResult(in, "err.bad.arg");
- command = getComString("test123");
+ File f0 = new File(System.getProperty("test.src", "."), "test123");
+ String path0 = f0.getPath();
+ if ( f0.exists() ) {
+ throw new Error("Input file should not exist: " + path0);
+ }
+
+ command = getComString(path0);
p = Runtime.getRuntime().exec(command);
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
checkResult(in, "err.cannot.read");
File f1 = new File(System.getProperty("test.src", "."), "test1");
- File f2 = new File(System.getProperty("test.src", "."), "test2");
+ File f2 = File.createTempFile("test2", ".tmp");
String path1 = f1.getPath();
String path2 = f2.getPath();
+ if ( !f1.exists() ) {
+ throw new Error("Missing input file: " + path1);
+ }
+ if ( !f2.setWritable(false) ) {
+ throw new Error("Output file cannot be made read only: " + path2);
+ }
+ f2.deleteOnExit();
command = getComString(path1, path2);
p = Runtime.getRuntime().exec(command);
@@ -80,7 +93,9 @@
throws Exception {
String errorReceived;
errorReceived = in.readLine();
+ assert errorReceived != null : "First readline cannot be null";
errorExpected = rsrc.getString(errorExpected);
+ assert errorExpected != null : "Expected message cannot be null";
StringBuffer error = new StringBuffer(errorExpected);
int start = errorExpected.indexOf("{0}");
if (start >= 0) {
@@ -128,6 +143,7 @@
f = new File(path);
if (!f.exists())
throw new RuntimeException("Cannot find native2ascii at "+path);
+ System.out.println("Using native2ascii at "+path);
}
return path;
}
--- a/jdk/test/sun/tools/native2ascii/test2 Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-This file exists as a non-writable placeholder for NativeErrors.java
--- a/jdk/test/tools/launcher/Arrrghs.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/tools/launcher/Arrrghs.java Wed Dec 16 16:25:08 2009 -0800
@@ -25,7 +25,7 @@
* @test
* @bug 5030233 6214916 6356475 6571029 6684582 6742159 4459600 6758881
* @summary Argument parsing validation.
- * @compile Arrrghs.java TestHelper.java
+ * @compile -XDignore.symbol.file Arrrghs.java TestHelper.java
* @run main Arrrghs
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/ExecutionEnvironment.java Wed Dec 16 16:25:08 2009 -0800
@@ -0,0 +1,358 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4780570 4731671 6354700 6367077 6670965 4882974
+ * @summary Checks for LD_LIBRARY_PATH and execution on *nixes
+ * @compile -XDignore.symbol.file ExecutionEnvironment.java TestHelper.java
+ * @run main ExecutionEnvironment
+ */
+
+/*
+ * This test tests for various things as follows:
+ * Ensures that:
+ * 1. uneccessary execs do not occur
+ * 2. the environment is pristine, users environment variable wrt.
+ * LD_LIBRARY_PATH if set are not modified in any way.
+ * 3. the correct vm is chosen with -server and -client options
+ * 4. the VM on Solaris correctly interprets the LD_LIBRARY_PATH32
+ * and LD_LIBRARY_PATH64 variables if set by the user, ie.
+ * i. on 32 bit systems:
+ * a. if LD_LIBRARY_PATH32 is set it will override LD_LIBRARY_PATH
+ * b. LD_LIBRARY_PATH64 is ignored if set
+ * ii. on 64 bit systems:
+ * a. if LD_LIBRARY_PATH64 is set it will override LD_LIBRARY_PATH
+ * b. LD_LIBRARY_PATH32 is ignored if set
+ * 5. no extra symlink exists on Solaris ie.
+ * jre/lib/$arch/libjvm.so -> client/libjvm.so
+ * TODO:
+ * a. perhaps we need to add a test to audit all environment variables are
+ * in pristine condition after the launch, there may be a few that the
+ * launcher may add as implementation details.
+ * b. add a pldd for solaris to ensure only one libjvm.so is linked
+ */
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class ExecutionEnvironment {
+ static final String LD_LIBRARY_PATH = "LD_LIBRARY_PATH";
+ static final String LD_LIBRARY_PATH_32 = LD_LIBRARY_PATH + "_32";
+ static final String LD_LIBRARY_PATH_64 = LD_LIBRARY_PATH + "_64";
+
+ // Note: these paths need not exist on the filesytem
+ static final String LD_LIBRARY_PATH_VALUE = "/Bridge/On/The/River/Kwai";
+ static final String LD_LIBRARY_PATH_32_VALUE = "/Lawrence/Of/Arabia";
+ static final String LD_LIBRARY_PATH_64_VALUE = "/A/Passage/To/India";
+
+ static final String JLDEBUG_KEY = "_JAVA_LAUNCHER_DEBUG";
+ static final String EXPECTED_MARKER = "TRACER_MARKER:About to EXEC";
+
+ static final String[] LD_PATH_STRINGS = {
+ LD_LIBRARY_PATH + "=" + LD_LIBRARY_PATH_VALUE,
+ LD_LIBRARY_PATH_32 + "=" + LD_LIBRARY_PATH_32_VALUE,
+ LD_LIBRARY_PATH_64 + "=" + LD_LIBRARY_PATH_64_VALUE
+ };
+
+ static final File testJarFile = new File("EcoFriendly.jar");
+
+ static int errors = 0;
+ static int passes = 0;
+
+ private static void createTestJar() {
+ try {
+ List<String> codeList = new ArrayList<String>();
+ codeList.add("static void printValue(String name, boolean property) {\n");
+ codeList.add(" String value = (property) ? System.getProperty(name) : System.getenv(name);\n");
+ codeList.add(" System.out.println(name + \"=\" + value);\n");
+ codeList.add("}\n");
+ codeList.add("public static void main(String... args) {\n");
+ codeList.add(" System.out.println(\"Execute test:\");\n");
+ codeList.add(" printValue(\"os.name\", true);\n");
+ codeList.add(" printValue(\"os.arch\", true);\n");
+ codeList.add(" printValue(\"os.version\", true);\n");
+ codeList.add(" printValue(\"sun.arch.data.model\", true);\n");
+ codeList.add(" printValue(\"java.library.path\", true);\n");
+ codeList.add(" printValue(\"" + LD_LIBRARY_PATH + "\", false);\n");
+ codeList.add(" printValue(\"" + LD_LIBRARY_PATH_32 + "\", false);\n");
+ codeList.add(" printValue(\"" + LD_LIBRARY_PATH_64 + "\", false);\n");
+ codeList.add("}\n");
+ String[] clist = new String[codeList.size()];
+ TestHelper.createJar(testJarFile, codeList.toArray(clist));
+ } catch (FileNotFoundException fnfe) {
+ throw new RuntimeException(fnfe);
+ }
+ }
+
+ /*
+ * tests if the launcher pollutes the LD_LIBRARY_PATH variables ie. there
+ * should not be any new variables or pollution/mutations of any kind, the
+ * environment should be pristine.
+ */
+ private static void ensureEcoFriendly() {
+ TestHelper.TestResult tr = null;
+
+ Map<String, String> env = new HashMap<String, String>();
+ for (String x : LD_PATH_STRINGS) {
+ String pairs[] = x.split("=");
+ env.put(pairs[0], pairs[1]);
+ }
+
+ tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar",
+ testJarFile.getAbsolutePath());
+
+ if (!tr.isNotZeroOutput()) {
+ throw new RuntimeException("Error: No output at all. Did the test execute ?");
+ }
+
+ for (String x : LD_PATH_STRINGS) {
+ if (!tr.contains(x)) {
+ System.out.println("FAIL: did not get <" + x + ">");
+ System.out.println(tr);
+ errors++;
+ } else {
+ passes++;
+ }
+ }
+ }
+
+ /*
+ * ensures that there are no execs as long as we are in the same
+ * data model
+ */
+ static void ensureNoExec() {
+ Map<String, String> env = new HashMap<String, String>();
+ env.put(JLDEBUG_KEY, "true");
+ TestHelper.TestResult tr =
+ TestHelper.doExec(env, TestHelper.javaCmd, "-version");
+ if (tr.testOutput.contains(EXPECTED_MARKER)) {
+ System.out.println("FAIL: EnsureNoExecs: found expected warning <" +
+ EXPECTED_MARKER +
+ "> the process execing ?");
+ errors++;
+ } else {
+ passes++;
+ }
+ return;
+ }
+
+ /*
+ * This test ensures that LD_LIBRARY_PATH* values are interpreted by the VM
+ * and the expected java.library.path behaviour.
+ * For Generic platforms (All *nixes):
+ * * All LD_LIBRARY_PATH variable should be on java.library.path
+ * For Solaris 32-bit
+ * * The LD_LIBRARY_PATH_32 should override LD_LIBRARY_PATH if specified
+ * For Solaris 64-bit
+ * * The LD_LIBRARY_PATH_64 should override LD_LIBRARY_PATH if specified
+ */
+
+ static void verifyJavaLibraryPath() {
+ TestHelper.TestResult tr = null;
+
+ Map<String, String> env = new HashMap<String, String>();
+
+
+ if (TestHelper.isLinux) {
+ for (String x : LD_PATH_STRINGS) {
+ String pairs[] = x.split("=");
+ env.put(pairs[0], pairs[1]);
+ }
+
+ tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar",
+ testJarFile.getAbsolutePath());
+ verifyJavaLibraryPathGeneric(tr);
+ } else {
+ // no override
+ env.clear();
+ env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE);
+ tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar",
+ testJarFile.getAbsolutePath());
+ verifyJavaLibraryPathGeneric(tr);
+
+ env.clear();
+ for (String x : LD_PATH_STRINGS) {
+ String pairs[] = x.split("=");
+ env.put(pairs[0], pairs[1]);
+ }
+
+ // verify the override occurs, since we know the invocation always
+ // uses by default is 32-bit, therefore we also set the test
+ // expectation to be the same.
+ tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar",
+ testJarFile.getAbsolutePath());
+ verifyJavaLibraryPathOverride(tr, true);
+
+ // try changing the model from 32 to 64 bit
+ if (TestHelper.java64Cmd != null && TestHelper.is32Bit) {
+ // verify the override occurs
+ env.clear();
+ for (String x : LD_PATH_STRINGS) {
+ String pairs[] = x.split("=");
+ env.put(pairs[0], pairs[1]);
+ }
+ tr = TestHelper.doExec(env, TestHelper.javaCmd, "-d64", "-jar",
+ testJarFile.getAbsolutePath());
+ verifyJavaLibraryPathOverride(tr, false);
+
+ // no override
+ env.clear();
+ env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE);
+ tr = TestHelper.doExec(env, TestHelper.javaCmd, "-jar",
+ testJarFile.getAbsolutePath());
+ verifyJavaLibraryPathGeneric(tr);
+ }
+
+ // try changing the model from 64 to 32 bit
+ if (TestHelper.java64Cmd != null && TestHelper.is64Bit) {
+ // verify the override occurs
+ env.clear();
+ for (String x : LD_PATH_STRINGS) {
+ String pairs[] = x.split("=");
+ env.put(pairs[0], pairs[1]);
+ }
+ tr = TestHelper.doExec(env, TestHelper.java64Cmd, "-d32", "-jar",
+ testJarFile.getAbsolutePath());
+ verifyJavaLibraryPathOverride(tr, true);
+
+ // no override
+ env.clear();
+ env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE);
+ tr = TestHelper.doExec(env, TestHelper.java64Cmd, "-d32", "-jar",
+ testJarFile.getAbsolutePath());
+ verifyJavaLibraryPathGeneric(tr);
+ }
+ }
+ }
+
+ private static void verifyJavaLibraryPathGeneric(TestHelper.TestResult tr) {
+ if (!tr.matches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) {
+ System.out.print("FAIL: verifyJavaLibraryPath: ");
+ System.out.println(" java.library.path does not contain " +
+ LD_LIBRARY_PATH_VALUE);
+ System.out.println(tr);
+ errors++;
+ } else {
+ passes++;
+ }
+ }
+
+ private static void verifyJavaLibraryPathOverride(TestHelper.TestResult tr,
+ boolean is32Bit) {
+ // make sure the 32/64 bit value exists
+ if (!tr.matches("java.library.path=.*" +
+ (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE) + ".*")) {
+ System.out.print("FAIL: verifyJavaLibraryPathOverride: ");
+ System.out.println(" java.library.path does not contain " +
+ (is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE));
+ System.out.println(tr);
+ errors++;
+ } else {
+ passes++;
+ }
+ // make sure the generic value is absent
+ if (tr.matches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) {
+ System.out.print("FAIL: verifyJavaLibraryPathOverride: ");
+ System.out.println(" java.library.path contains " +
+ LD_LIBRARY_PATH_VALUE);
+ System.out.println(tr);
+ errors++;
+ } else {
+ passes++;
+ }
+ }
+
+ /*
+ * ensures we have indeed exec'ed the correct vm of choice, all VMs support
+ * -server, however 32-bit VMs support -client and -server.
+ */
+ static void verifyVmSelection() {
+
+ TestHelper.TestResult tr = null;
+
+ if (TestHelper.is32Bit) {
+ tr = TestHelper.doExec(TestHelper.javaCmd, "-client", "-version");
+ if (!tr.matches("Java.*Client VM.*")) {
+ System.out.println("FAIL: the expected vm -client did launch");
+ System.out.println(tr);
+ errors++;
+ } else {
+ passes++;
+ }
+ }
+ tr = TestHelper.doExec(TestHelper.javaCmd, "-server", "-version");
+ if (!tr.matches("Java.*Server VM.*")) {
+ System.out.println("FAIL: the expected vm -server did launch");
+ System.out.println(tr);
+ errors++;
+ } else {
+ passes++;
+ }
+ }
+
+ /*
+ * checks to see there is no extra libjvm.so than needed
+ */
+ static void verifyNoSymLink() {
+ if (TestHelper.is64Bit) {
+ return;
+ }
+
+ File symLink = null;
+ String libPathPrefix = TestHelper.isSDK ? "jre/lib" : "/lib";
+ symLink = new File(TestHelper.JAVAHOME, libPathPrefix +
+ TestHelper.getJreArch() + "/libjvm.so");
+ if (symLink.exists()) {
+ System.out.println("FAIL: The symlink exists " +
+ symLink.getAbsolutePath());
+ errors++;
+ } else {
+ passes++;
+ }
+ }
+
+ public static void main(String... args) throws Exception {
+ if (TestHelper.isWindows) {
+ System.out.println("Warning: noop on windows");
+ return;
+ }
+ // create our test jar first
+ createTestJar();
+ ensureNoExec();
+ verifyVmSelection();
+ ensureEcoFriendly();
+ verifyJavaLibraryPath();
+ verifyNoSymLink();
+ if (errors > 0) {
+ throw new Exception("ExecutionEnvironment: FAIL: with " +
+ errors + " errors and passes " + passes );
+ } else {
+ System.out.println("ExecutionEnvironment: PASS " + passes);
+ }
+ }
+}
--- a/jdk/test/tools/launcher/SolarisDataModel.sh Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,219 +0,0 @@
-# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-
-# @test
-# @bug 4780570
-# @run shell SolarisDataModel.sh
-# @summary Verify Solaris SPARC -d32 and -d64 options work with preset LD_LIBRARY_PATH
-# @author Joseph D. Darcy
-
-# Test to see if presetting LD_LIBRARY_PATH affects the treatment of
-# -d32 and -d64 options; also checks that -d<n> options result in the
-# desired data model.
-
-# If the test is not being run on a Solaris SPARC box SPARC the test
-# succeeds immediately.
-
-OS=`uname -s`;
-
-case "$OS" in
- SunOS )
- # ARCH should be sparc or i386
- ARCH=`uname -p`
- case "$ARCH" in
- sparc)
- PATHSEP=":"
- ;;
-
- * )
- echo "Non-SPARC Solaris environment; test vacuously succeeds."
- exit 0
- esac
- ;;
-
- * )
- echo "Not a Solaris SPARC environment; test vacuously succeeds."
- exit 0;
- ;;
-esac
-
-
-# Verify directory context variables are set
-if [ "${TESTJAVA}" = "" ]
-then
- echo "TESTJAVA not set. Test cannot execute. Failed."
- exit 1
-fi
-
-if [ "${TESTSRC}" = "" ]
-then
- echo "TESTSRC not set. Test cannot execute. Failed."
- exit 1
-fi
-
-
-if [ "${TESTCLASSES}" = "" ]
-then
- echo "TESTCLASSES not set. Test cannot execute. Failed."
- exit 1
-fi
-
-
-JAVAC="$TESTJAVA/bin/javac"
-
-# Create our little Java tests on the fly
-( printf "public class GetDataModel {"
- printf " public static void main(String argv[]) {"
- printf " System.out.println(System.getProperty(\"sun.arch.data.model\", \"none\"));"
- printf " }"
- printf "}"
-) > GetDataModel.java
-
-$JAVAC GetDataModel.java
-
-( printf "public class GetLdLibraryPath {"
- printf " public static void main(String argv[]) {"
- printf " System.out.println(System.getProperty(\"java.library.path\"));"
- printf " }"
- printf "}"
-) > GetLdLibraryPath.java
-
-$JAVAC GetLdLibraryPath.java
-
-
-
-# All preconditions are met; run the tests
-
-
-# Construct path to 32-bit Java executable
-JAVA="$TESTJAVA/bin/java -classpath $TESTCLASSES${PATHSEP}."
-
-
-# Construct path to 64-bit Java executable, might not exist
-JAVA64="$TESTJAVA/bin/sparcv9/java -classpath $TESTCLASSES${PATHSEP}."
-JAVA64FILE="$TESTJAVA/bin/sparcv9/java"
-
-
-# java -d32 tests
-
-LD_LIBRARY_PATH=""
-export LD_LIBRARY_PATH
-
-DM=`$JAVA -d32 GetDataModel`
-case "$DM" in
- 32 )
- ;;
-
- * )
- echo "The combination \"java -d32\" failed."
- echo $DM
- exit 1
-esac
-
-# Rerun test with LD_LIBRARY_PATH preset
-LD_LIBRARY_PATH=`$JAVA GetLdLibraryPath`;
-DM=`$JAVA -d32 GetDataModel`
-case "$DM" in
- 32 )
- ;;
-
- * )
- echo "The combination \"java -d32\" failed with preset LD_LIBRARY_PATH."
- echo $DM
- exit 1
-esac
-
-# Reset LD_LIBRARY_PATH
-LD_LIBRARY_PATH=
-
-
-# Test for 64-bit executable
-
-if [ -f $JAVA64FILE ]; then
-
- DM=`$JAVA -d64 GetDataModel`
- case "$DM" in
- 64 )
- ;;
-
- * )
- echo "The combination \"java -d64\" failed."
- exit 1
- esac
-
- DM=`$JAVA64 -d32 GetDataModel`
- case "$DM" in
- 32 )
- ;;
-
- * )
- echo "The combination \"sparcv9/java -d32\" failed."
- exit 1
- esac
-
- DM=`$JAVA64 -d64 GetDataModel`
- case "$DM" in
- 64 )
- ;;
-
- * )
- echo "The combination \"sparcv9/java -d64\" failed."
- exit 1
- esac
-
- # Rerun tests with LD_LIBRARY_PATH preset
- LD_LIBRARY_PATH=`$JAVA GetLdLibraryPath`;
- echo "Presetting LD_LIBRARY_PATH"
-
- DM=`$JAVA -d64 GetDataModel`
- case "$DM" in
- 64 )
- ;;
-
- * )
- echo "The combination \"java -d64\" failed with preset LD_LIBRARY_PATH."
- exit 1
- esac
-
- DM=`$JAVA64 -d32 GetDataModel`
- case "$DM" in
- 32 )
- ;;
-
- * )
- echo "The combination \"sparcv9/java -d32\" failed with preset LD_LIBRARY_PATH."
- exit 1
- esac
-
- DM=`$JAVA64 -d64 GetDataModel`
- case "$DM" in
- 64 )
- ;;
-
- * )
- echo "The combination \"sparcv9/java -d64\" failed with preset LD_LIBRARY_PATH."
- exit 1
- esac
-
-else
- echo "Warning: no 64-bit components found; only java -d32 tests have been run."
-fi
-exit 0;
--- a/jdk/test/tools/launcher/SolarisRunpath.sh Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,221 +0,0 @@
-# Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
-# CA 95054 USA or visit www.sun.com if you need additional information or
-# have any questions.
-
-
-# @test
-# @bug 4731671
-# @build libraryCaller
-# @run shell SolarisRunpath.sh
-# @summary Verify that Solaris LD_LIBRARY_PATH rules are followed
-# @author Joseph D. Darcy
-
-# The launcher has been updated to properly take account of Solaris
-# LD_LIBRARY_PATH rules when constructing the runpath for the Java
-# executable. That is, data model dependent LD_LIBRARY_PATH variables
-# are tested for and override LD_LIBRARY_PATH if present. The current
-# launcher design relies on LD_LIBRARY_PATH settings to ensure the
-# proper jre/jdk libraries are opening during program execution. In
-# the future, this dependence might be removed by having the vm
-# explicitly dlopen the needed files. If that change occurs, this
-# test will be harmless but no long relevant.
-
-# A more robust test for Solaris SPARC would set the different
-# LD_LIBRARY_PATH variables while also varying the -d[32|64] options
-# to make sure the LD_LIBRARY_PATH of the *target* data model were
-# being respected. That is "java -d64" should use the 64-bit
-# LD_LIBRARY_PATH while "java -d32" should use the 32-bit
-# LD_LIBRARY_PATH regardless of the data model of the "java" binary.
-# However, by default builds do not contain both 32 and 64 bit
-# components so such a test would often not be applicable.
-
-
-# If the test is not being run on a Solaris box, SPARC or x86, the
-# test succeeds immediately.
-
-OS=`uname -s`;
-
-case "$OS" in
- SunOS )
- PATHSEP=":"
- ;;
-
- * )
- echo "Not a Solaris environment; test vacuously succeeds."
- exit 0;
- ;;
-esac
-
-# Verify directory context variables are set
-if [ "${TESTJAVA}" = "" ]
-then
- echo "TESTJAVA not set. Test cannot execute. Failed."
- exit 1
-fi
-
-if [ "${TESTSRC}" = "" ]
-then
- echo "TESTSRC not set. Test cannot execute. Failed."
- exit 1
-fi
-
-
-if [ "${TESTCLASSES}" = "" ]
-then
- echo "TESTCLASSES not set. Test cannot execute. Failed."
- exit 1
-fi
-
-# Construct paths to default Java executables
-JAVAC="$TESTJAVA/bin/javac"
-
-
-# Create our little Java test on the fly
-( printf "public class GetDataModel {"
- printf " public static void main(String argv[]) {"
- printf " System.out.println(System.getProperty(\"sun.arch.data.model\", \"none\"));"
- printf " }"
- printf "}"
-) > GetDataModel.java
-
-$JAVAC GetDataModel.java
-
-
-# ARCH should be sparc or i386
-ARCH=`uname -p`
-case "$ARCH" in
- sparc | i386 )
- ;;
-
- * )
- echo "Unrecognized architecture; test fails."
- exit 1
-esac
-
-# The following construction may not work as desired in a
-# 64-bit build.
-JAVA="$TESTJAVA/bin/java -classpath $TESTCLASSES${PATHSEP}."
-
-# Determine data model
-DM=`$JAVA GetDataModel`
-
-# verify DM is 32 or 64
-case "$DM" in
- 32 )
- ODM=64;
- ;;
-
- 64 )
- ODM=32;
- ;;
-
- * )
- echo "Unknown data model \"$DM\"; test fails."
- exit 1
-esac
-
-# -------------------- Test 1 --------------------
-
-LD_LIBRARY_PATH=$TESTSRC/lib/$ARCH/lib$DM
-export LD_LIBRARY_PATH
-unset LD_LIBRARY_PATH_32
-unset LD_LIBRARY_PATH_64
-
-# With plain LD_LIBRARY_PATH, result should always be 0
-RESULT=`$JAVA libraryCaller`
-if [ "${RESULT}" != "0" ];
-then
- echo "Not using LD_LIBRARY_PATH; test fails."
- exit 1
-fi
-
-# The following two tests sets both data model dependent
-# LD_LIBRARY_PATH variables individually.
-
-# -------------------- Test 2 --------------------
-
-# Set opposite data model variable; should return same result
-# as plain LD_LIBRARY_PATH.
-
-if [ "${DM}" = "32" ]; then
- LD_LIBRARY_PATH_64=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
- export LD_LIBRARY_PATH_64
-else
- LD_LIBRARY_PATH_32=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
- export LD_LIBRARY_PATH_32
-fi
-
-RESULT=`$JAVA libraryCaller`
-if [ "${RESULT}" != "0" ];
-then
- echo "Using LD_LIBRARY_PATH_$ODM for $DM binary;"
- echo "test fails."
- exit 1
-fi
-
-unset LD_LIBRARY_PATH_32
-unset LD_LIBRARY_PATH_64
-
-# -------------------- Test 3 --------------------
-
-# Set appropriate data model variable; result should match
-# data model.
-if [ "${DM}" = "32" ]; then
- LD_LIBRARY_PATH_32=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
- export LD_LIBRARY_PATH_32
-else
- LD_LIBRARY_PATH_64=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
- export LD_LIBRARY_PATH_64
-fi
-
-RESULT=`$JAVA libraryCaller`
-if [ "${RESULT}" != "$DM" ];
-then
- echo "Data model dependent LD_LIBRARY_PATH_$DM"
- echo "not overriding LD_LIBRARY_PATH; test fails."
- exit 1
-fi
-
-unset LD_LIBRARY_PATH
-unset LD_LIBRARY_PATH_32
-unset LD_LIBRARY_PATH_64
-
-# -------------------- Test 4 --------------------
-
-# Have only data model dependent LD_LIBRARY_PATH set; result
-# should match data model.
-
-if [ "${DM}" = "32" ]; then
- LD_LIBRARY_PATH_32=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
- export LD_LIBRARY_PATH_32
-else
- LD_LIBRARY_PATH_64=$TESTSRC/lib/$ARCH/lib$DM/lib$DM
- export LD_LIBRARY_PATH_64
-fi
-
-RESULT=`$JAVA libraryCaller`
-if [ "${RESULT}" != "$DM" ];
-then
- echo "Not using data-model dependent LD_LIBRARY_PATH; test fails."
- exit 1
-fi
-
-# All tests have passed
-exit 0
--- a/jdk/test/tools/launcher/TestHelper.java Tue Dec 15 14:50:01 2009 +0900
+++ b/jdk/test/tools/launcher/TestHelper.java Wed Dec 16 16:25:08 2009 -0800
@@ -39,18 +39,36 @@
*/
public enum TestHelper {
INSTANCE;
- static final String JAVAHOME = System.getProperty("java.home", ".");
+ static final String JAVAHOME = System.getProperty("java.home");
static final boolean isSDK = JAVAHOME.endsWith("jre");
static final String javaCmd;
+ static final String java64Cmd;
static final String javacCmd;
static final JavaCompiler compiler;
- static final boolean debug = Boolean.getBoolean("Arrrghs.Debug");
+ static final boolean debug = Boolean.getBoolean("TestHelper.Debug");
static final boolean isWindows =
System.getProperty("os.name", "unknown").startsWith("Windows");
+ static final boolean is64Bit =
+ System.getProperty("sun.arch.data.model").equals("64");
+ static final boolean is32Bit =
+ System.getProperty("sun.arch.data.model").equals("32");
+ static final boolean isSolaris =
+ System.getProperty("os.name", "unknown").startsWith("SunOS");
+ static final boolean isLinux =
+ System.getProperty("os.name", "unknown").startsWith("Linux");
+ static final boolean isDualMode = isSolaris;
+ static final boolean isSparc = System.getProperty("os.arch").startsWith("sparc");
+
static int testExitValue = 0;
static {
+ if (is64Bit && is32Bit) {
+ throw new RuntimeException("arch model cannot be both 32 and 64 bit");
+ }
+ if (!is64Bit && !is32Bit) {
+ throw new RuntimeException("arch model is not 32 or 64 bit ?");
+ }
compiler = ToolProvider.getSystemJavaCompiler();
File binDir = (isSDK) ? new File((new File(JAVAHOME)).getParentFile(), "bin")
: new File(JAVAHOME, "bin");
@@ -69,6 +87,33 @@
if (!javacCmdFile.canExecute()) {
throw new RuntimeException("java <" + javacCmd + "> must exist");
}
+ if (isSolaris) {
+ File sparc64BinDir = new File(binDir,isSparc ? "sparcv9" : "amd64");
+ File java64CmdFile= new File(sparc64BinDir, "java");
+ if (java64CmdFile.exists() && java64CmdFile.canExecute()) {
+ java64Cmd = java64CmdFile.getAbsolutePath();
+ } else {
+ java64Cmd = null;
+ }
+ } else {
+ java64Cmd = null;
+ }
+ }
+
+ /*
+ * usually the jre/lib/arch-name is the same as os.arch, except for x86.
+ */
+ static String getJreArch() {
+ String arch = System.getProperty("os.arch");
+ return arch.equals("x86") ? "i386" : arch;
+ }
+
+ /*
+ * A convenience method to create a jar with jar file name and defs
+ */
+ static void createJar(File jarName, String... mainDefs)
+ throws FileNotFoundException{
+ createJar(null, jarName, new File("Foo"), mainDefs);
}
/*
@@ -123,16 +168,23 @@
}
}
+ static TestResult doExec(String...cmds) {
+ return doExec(null, cmds);
+ }
+
/*
* A method which executes a java cmd and returns the results in a container
*/
- static TestResult doExec(String...cmds) {
+ static TestResult doExec(Map<String, String> envToSet, String...cmds) {
String cmdStr = "";
for (String x : cmds) {
cmdStr = cmdStr.concat(x + " ");
}
ProcessBuilder pb = new ProcessBuilder(cmds);
Map<String, String> env = pb.environment();
+ if (envToSet != null) {
+ env.putAll(envToSet);
+ }
BufferedReader rdr = null;
try {
List<String> outputList = new ArrayList<String>();
@@ -163,21 +215,25 @@
List<String> testOutput;
public TestResult(String str, int rv, List<String> oList) {
- status = new StringBuilder(str);
+ status = new StringBuilder("Executed command: " + str + "\n");
exitValue = rv;
testOutput = oList;
}
+ void appendStatus(String x) {
+ status = status.append(" " + x + "\n");
+ }
+
void checkNegative() {
if (exitValue == 0) {
- status = status.append(" Error: test must not return 0 exit value");
+ appendStatus("Error: test must not return 0 exit value");
testExitValue++;
}
}
void checkPositive() {
if (exitValue != 0) {
- status = status.append(" Error: test did not return 0 exit value");
+ appendStatus("Error: test did not return 0 exit value");
testExitValue++;
}
}
@@ -188,7 +244,7 @@
boolean isZeroOutput() {
if (!testOutput.isEmpty()) {
- status = status.append(" Error: No message from cmd please");
+ appendStatus("Error: No message from cmd please");
testExitValue++;
return false;
}
@@ -197,19 +253,20 @@
boolean isNotZeroOutput() {
if (testOutput.isEmpty()) {
- status = status.append(" Error: Missing message");
+ appendStatus("Error: Missing message");
testExitValue++;
return false;
}
return true;
}
+ @Override
public String toString() {
- if (debug) {
- for (String x : testOutput) {
- status = status.append(x + "\n");
- }
+ status = status.append("++++Test Output Begin++++\n");
+ for (String x : testOutput) {
+ appendStatus(x);
}
+ status = status.append("++++Test Output End++++\n");
return status.toString();
}
@@ -219,7 +276,18 @@
return true;
}
}
- status = status.append(" Error: string <" + str + "> not found ");
+ appendStatus("Error: string <" + str + "> not found");
+ testExitValue++;
+ return false;
+ }
+
+ boolean matches(String stringToMatch) {
+ for (String x : testOutput) {
+ if (x.matches(stringToMatch)) {
+ return true;
+ }
+ }
+ appendStatus("Error: string <" + stringToMatch + "> not found");
testExitValue++;
return false;
}
--- a/jdk/test/tools/launcher/libraryCaller.c Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-/*
- *
- *
- * Indictly used by SolarisRunpath.sh; this file is used to generate
- * the shared objects:
- *
- * ./lib/sparc/lib32/liblibrary.so
- * ./lib/sparc/lib32/lib32/liblibrary.so
- *
- * ./lib/sparc/lib64/liblibrary.so
- * ./lib/sparc/lib64/lib64/liblibrary.so
- *
- * ./lib/i386/lib32/liblibrary.so
- * ./lib/i386/lib32/lib32/liblibrary.so
- *
- * The function defined below returns either 0 or the size of an
- * integer in the data model used to compile the file (32 for ILP; 64
- * for LP). The libraries in ./lib/$ARCH/lib$DM return 0; those in
- * ./lib/$ARCH/lib$DM/lib$DM return 32 or 64.
- */
-
-
-#include <jni.h>
-#include "libraryCaller.h"
-
-#ifndef RETURN_VALUE
-#define RETURN_VALUE 0
-#endif
-
-JNIEXPORT jint JNICALL Java_libraryCaller_number
-(JNIEnv *je, jclass jc) {
- return RETURN_VALUE;
-}
--- a/jdk/test/tools/launcher/libraryCaller.h Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-
-/*
- * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-/* DO NOT EDIT THIS FILE - it is machine generated */
-
-#include <jni.h>
-/* Header for class libraryCaller */
-
-#ifndef _Included_libraryCaller
-#define _Included_libraryCaller
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class: libraryCaller
- * Method: number
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_libraryCaller_number
- (JNIEnv *, jclass);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
--- a/jdk/test/tools/launcher/libraryCaller.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/*
- * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-
-/*
- *
- *
- * Used by SolarisRunpath.sh to help test if the launcher fully
- * respects Solaris LD_LIBRARY_PATH semantics. The ./lib directory is
- * structured so that the results of the dynamically linked number
- * method varies depending on the value the data model dependent
- * LD_LIBRARY_PATH variable.
- */
-
-
-
-class libraryCaller {
- static {
- System.loadLibrary("library");
- }
- static native int number();
-
- public static void main(String argv[]) {
- System.out.println(number());
- }
-}
--- a/langtools/.hgtags Tue Dec 15 14:50:01 2009 +0900
+++ b/langtools/.hgtags Wed Dec 16 16:25:08 2009 -0800
@@ -50,3 +50,4 @@
9596dff460935f09684c11d156ce591f92584f0d jdk7-b73
1a66b08deed0459054b5b1bea3dfbead30d258fa jdk7-b74
2485f5641ed0829205aaaeb31ad711c2c2ef0de3 jdk7-b75
+8fb9b4be3cb1574302acde90549a4d333ef51e93 jdk7-b76
--- a/langtools/src/share/classes/com/sun/tools/classfile/Attribute.java Tue Dec 15 14:50:01 2009 +0900
+++ b/langtools/src/share/classes/com/sun/tools/classfile/Attribute.java Wed Dec 16 16:25:08 2009 -0800
@@ -64,11 +64,6 @@
public static final String StackMapTable = "StackMapTable";
public static final String Synthetic = "Synthetic";
- // JSR 277/294
- public static final String Module = "Module";
- public static final String ModuleExportTable = "ModuleExportTable";
- public static final String ModuleMemberTable = "ModuleMemberTable";
-
public static class Factory {
public Factory() {
// defer init of standardAttributeClasses until after options set up
@@ -78,10 +73,6 @@
this.compat = compat;
}
- public void setJSR277(boolean jsr277) {
- this.jsr277 = jsr277;
- }
-
public Attribute createAttribute(ClassReader cr, int name_index, byte[] data)
throws IOException {
if (standardAttributes == null)
@@ -121,12 +112,6 @@
standardAttributes.put(LocalVariableTable, LocalVariableTable_attribute.class);
standardAttributes.put(LocalVariableTypeTable, LocalVariableTypeTable_attribute.class);
- if (jsr277) {
- standardAttributes.put(Module, Module_attribute.class);
- standardAttributes.put(ModuleExportTable, ModuleExportTable_attribute.class);
- standardAttributes.put(ModuleMemberTable, ModuleMemberTable_attribute.class);
- }
-
if (!compat) { // old javap does not recognize recent attributes
standardAttributes.put(CompilationID, CompilationID_attribute.class);
standardAttributes.put(RuntimeInvisibleAnnotations, RuntimeInvisibleAnnotations_attribute.class);
@@ -148,7 +133,6 @@
private Map<String,Class<? extends Attribute>> standardAttributes;
private boolean compat; // don't support recent attrs in compatibility mode
- private boolean jsr277; // support new jsr277 attrs
}
public static Attribute read(ClassReader cr) throws IOException {
@@ -201,9 +185,5 @@
R visitStackMap(StackMap_attribute attr, P p);
R visitStackMapTable(StackMapTable_attribute attr, P p);
R visitSynthetic(Synthetic_attribute attr, P p);
-
- R visitModule(Module_attribute attr, P p);
- R visitModuleExportTable(ModuleExportTable_attribute attr, P p);
- R visitModuleMemberTable(ModuleMemberTable_attribute attr, P p);
}
}
--- a/langtools/src/share/classes/com/sun/tools/classfile/ClassWriter.java Tue Dec 15 14:50:01 2009 +0900
+++ b/langtools/src/share/classes/com/sun/tools/classfile/ClassWriter.java Wed Dec 16 16:25:08 2009 -0800
@@ -449,25 +449,6 @@
out.writeShort(entry.index);
}
- public Void visitModule(Module_attribute attr, ClassOutputStream out) {
- out.writeShort(attr.module_name);
- return null;
- }
-
- public Void visitModuleExportTable(ModuleExportTable_attribute attr, ClassOutputStream out) {
- out.writeShort(attr.export_type_table.length);
- for (int i: attr.export_type_table)
- out.writeShort(i);
- return null;
- }
-
- public Void visitModuleMemberTable(ModuleMemberTable_attribute attr, ClassOutputStream out) {
- out.writeShort(attr.package_member_table.length);
- for (int i: attr.package_member_table)
- out.writeShort(i);
- return null;
- }
-
public Void visitRuntimeVisibleAnnotations(RuntimeVisibleAnnotations_attribute attr, ClassOutputStream out) {
annotationWriter.write(attr.annotations, out);
return null;
--- a/langtools/src/share/classes/com/sun/tools/classfile/ModuleExportTable_attribute.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/*
- * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.classfile;
-
-import java.io.IOException;
-
-/**
- * See JSR 277.
- *
- * <p><b>This is NOT part of any API supported by Sun Microsystems. If
- * you write code that depends on this, you do so at your own risk.
- * This code and its internal interfaces are subject to change or
- * deletion without notice.</b>
- */
-public class ModuleExportTable_attribute extends Attribute {
- ModuleExportTable_attribute(ClassReader cr, int name_index, int length) throws IOException {
- super(name_index, length);
- int export_type_length = cr.readUnsignedShort();
- export_type_table = new int[export_type_length];
- for (int i = 0; i < export_type_table.length; i++)
- export_type_table[i] = cr.readUnsignedShort();
- }
-
- public ModuleExportTable_attribute(ConstantPool cp, int[] export_type_table)
- throws ConstantPoolException {
- this(cp.getUTF8Index(Attribute.ModuleExportTable), export_type_table);
- }
-
- public ModuleExportTable_attribute(int name_index, int[] export_type_table) {
- super(name_index, 2 + 2 * export_type_table.length);
- this.export_type_table = export_type_table;
- }
-
- public int getExportTypeCount() {
- return export_type_table.length;
- }
-
- public String getExportTypeName(int index, ConstantPool constant_pool) throws ConstantPoolException {
- return constant_pool.getUTF8Value(export_type_table[index]);
- }
-
- public <R, P> R accept(Visitor<R, P> visitor, P p) {
- return visitor.visitModuleExportTable(this, p);
- }
-
- public final int[] export_type_table;
-}
--- a/langtools/src/share/classes/com/sun/tools/classfile/ModuleMemberTable_attribute.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/*
- * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-package com.sun.tools.classfile;
-
-import java.io.IOException;
-
-/**
- * See JSR 277.
- *
- * <p><b>This is NOT part of any API supported by Sun Microsystems. If
- * you write code that depends on this, you do so at your own risk.
- * This code and its internal interfaces are subject to change or
- * deletion without notice.</b>
- */
-public class ModuleMemberTable_attribute extends Attribute {
- ModuleMemberTable_attribute(ClassReader cr, int name_index, int length) throws IOException {
- super(name_index, length);
- int package_member_length = cr.readUnsignedShort();
- package_member_table = new int[package_member_length];
- for (int i = 0; i < package_member_table.length; i++)
- package_member_table[i] = cr.readUnsignedShort();
- }
-
- public ModuleMemberTable_attribute(ConstantPool cp, int[] package_member_table)
- throws ConstantPoolException {
- this(cp.getUTF8Index(Attribute.ModuleMemberTable), package_member_table);
- }
-
- public ModuleMemberTable_attribute(int name_index, int[] package_member_table) {
- super(name_index, 2 + 2 * package_member_table.length);
- this.package_member_table = package_member_table;
- }
-
- public int getPackageMemberCount() {
- return package_member_table.length;
- }
-
- public String getPackageMemberName(int index, ConstantPool constant_pool) throws ConstantPoolException {
- return constant_pool.getUTF8Value(package_member_table[index]);
- }
-
- public <R, P> R accept(Visitor<R, P> visitor, P p) {
- return visitor.visitModuleMemberTable(this, p);
- }
-
- public final int[] package_member_table;
-}
--- a/langtools/src/share/classes/com/sun/tools/classfile/Module_attribute.java Tue Dec 15 14:50:01 2009 +0900
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*
- * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package com.sun.tools.classfile;
-
-import java.io.IOException;
-
-/**
- * See JSR 277.
- *
- * <p><b>This is NOT part of any API supported by Sun Microsystems. If
- * you write code that depends on this, you do so at your own risk.
- * This code and its internal interfaces are subject to change or
- * deletion without notice.</b>
- */
-public class Module_attribute extends Attribute {
- Module_attribute(ClassReader cr, int name_index, int length) throws IOException {
- super(name_index, length);
- module_name = cr.readUnsignedShort();
- }
-
- public Module_attribute(ConstantPool constant_pool, int module_name)
- throws ConstantPoolException {
- this(constant_pool.getUTF8Index(Attribute.Module), module_name);
- }
-
- public Module_attribute(int name_index, int module_name) {
- super(name_index, 2);
- this.module_name = module_name;
- }
-
- public String getModuleName(ConstantPool constant_pool) throws ConstantPoolException {
- return constant_pool.getUTF8Value(module_name);
- }
-
- public <R, D> R accept(Visitor<R, D> visitor, D data) {
- return visitor.visitModule(this, data);
- }
-
- public final int module_name;
-
-}
--- a/langtools/src/share/classes/com/sun/tools/javap/AttributeWriter.java Tue Dec 15 14:50:01 2009 +0900
+++ b/langtools/src/share/classes/com/sun/tools/javap/AttributeWriter.java Wed Dec 16 16:25:08 2009 -0800
@@ -45,9 +45,6 @@
import com.sun.tools.classfile.LineNumberTable_attribute;
import com.sun.tools.classfile.LocalVariableTable_attribute;
import com.sun.tools.classfile.LocalVariableTypeTable_attribute;
-import com.sun.tools.classfile.ModuleExportTable_attribute;
-import com.sun.tools.classfile.ModuleMemberTable_attribute;
-import com.sun.tools.classfile.Module_attribute;
import com.sun.tools.classfile.RuntimeInvisibleAnnotations_attribute;
import com.sun.tools.classfile.RuntimeInvisibleParameterAnnotations_attribute;
import com.sun.tools.classfile.RuntimeInvisibleTypeAnnotations_attribute;
@@ -372,63 +369,6 @@
return null;
}
- public Void visitModule(Module_attribute attr, Void ignore) {
- print("Module: #" + attr.module_name);
- tab();
- println("// " + getModuleName(attr));
- return null;
- }
-
- String getModuleName(Module_attribute attr) {
- try {
- return attr.getModuleName(constant_pool);
- } catch (ConstantPoolException e) {
- return report(e);
- }
- }
-
- public Void visitModuleExportTable(ModuleExportTable_attribute attr, Void ignore) {
- println("ModuleExportTable:");
- indent(+1);
- println("Types: (" + attr.export_type_table.length + ")");
- for (int i = 0; i < attr.export_type_table.length; i++) {
- print("#" + attr.export_type_table[i]);
- tab();
- println("// " + getExportTypeName(attr, i));
- }
- indent(-1);
- return null;
- }
-
- String getExportTypeName(ModuleExportTable_attribute attr, int index) {
- try {
- return attr.getExportTypeName(index, constant_pool);
- } catch (ConstantPoolException e) {
- return report(e);
- }
- }
-
- public Void visitModuleMemberTable(ModuleMemberTable_attribute attr, Void ignore) {
- println("ModuleMemberTable:");
- indent(+1);
- println("Packages: (" + attr.package_member_table.length + ")");
- for (int i = 0; i < attr.package_member_table.length; i++) {
- print("#" + attr.package_member_table[i]);
- tab();
- println("// " + getPackageMemberName(attr, i));
- }
- indent(-1);
- return null;
- }
-
- String getPackageMemberName(ModuleMemberTable_attribute attr, int index) {
- try {
- return attr.getPackageMemberName(index, constant_pool);
- } catch (ConstantPoolException e) {
- return report(e);
- }
- }
-
public Void visitRuntimeVisibleAnnotations(RuntimeVisibleAnnotations_attribute attr, Void ignore) {
println("RuntimeVisibleAnnotations:");
indent(+1);
--- a/langtools/src/share/classes/com/sun/tools/javap/JavapTask.java Tue Dec 15 14:50:01 2009 +0900
+++ b/langtools/src/share/classes/com/sun/tools/javap/JavapTask.java Wed Dec 16 16:25:08 2009 -0800
@@ -236,12 +236,6 @@
}
},
- new Option(false, "-XDjsr277") {
- void process(JavapTask task, String opt, String arg) {
- task.options.jsr277 = true;
- }
- },
-
new Option(false, "-XDdetails") {
void process(JavapTask task, String opt, String arg) {
task.options.details = EnumSet.allOf(InstructionDetailWriter.Kind.class);
@@ -586,7 +580,6 @@
sourceWriter.setFileManager(fileManager);
attributeFactory.setCompat(options.compat);
- attributeFactory.setJSR277(options.jsr277);
boolean ok = true;
--- a/langtools/src/share/classes/com/sun/tools/javap/Options.java Tue Dec 15 14:50:01 2009 +0900
+++ b/langtools/src/share/classes/com/sun/tools/javap/Options.java Wed Dec 16 16:25:08 2009 -0800
@@ -90,5 +90,4 @@
public int tabColumn = 40; // column number for comments
public boolean compat; // bug-for-bug compatibility mode with old javap
- public boolean jsr277;
}