# HG changeset patch # User duke # Date 1499267066 -7200 # Node ID ade55a65b0f253ca594ca0fc1a4e402f31deedbd # Parent fcbbd4d495815eef3653c9d953436273eeea17a4# Parent 80dcc8ac5696a351335c69852f895d052c61073b Merge diff -r fcbbd4d49581 -r ade55a65b0f2 .hgignore --- a/.hgignore Wed Dec 16 23:39:39 2009 -0800 +++ b/.hgignore Wed Jul 05 17:04:26 2017 +0200 @@ -1,3 +1,3 @@ ^build/ ^dist/ -^nbproject/private/ +/nbproject/private/ diff -r fcbbd4d49581 -r ade55a65b0f2 .hgtags-top-repo --- a/.hgtags-top-repo Wed Dec 16 23:39:39 2009 -0800 +++ b/.hgtags-top-repo Wed Jul 05 17:04:26 2017 +0200 @@ -51,3 +51,4 @@ 2c88089b6e1c053597418099a14232182c387edc jdk7-b74 d1516b9f23954b29b8e76e6f4efc467c08c78133 jdk7-b75 c8b63075403d53a208104a8a6ea5072c1cb66aab jdk7-b76 +1f17ca8353babb13f4908c1f87d11508232518c8 jdk7-b77 diff -r fcbbd4d49581 -r ade55a65b0f2 Makefile --- a/Makefile Wed Dec 16 23:39:39 2009 -0800 +++ b/Makefile Wed Jul 05 17:04:26 2017 +0200 @@ -51,7 +51,7 @@ # For start and finish echo lines TITLE_TEXT = Control $(PLATFORM) $(ARCH) $(RELEASE) -DAYE_STAMP = `$(DATE) '+%y-%m-%d %H:%M'` +DATE_STAMP = `$(DATE) '+%y-%m-%d %H:%M'` START_ECHO = echo "$(TITLE_TEXT) $@ build started: $(DATE_STAMP)" FINISH_ECHO = echo "$(TITLE_TEXT) $@ build finished: $(DATE_STAMP)" @@ -188,7 +188,7 @@ create_fresh_product_bootdir: FRC @$(START_ECHO) $(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \ - NO_DOCS=true \ + GENERATE_DOCS=false \ BOOT_CYCLE_SETTINGS= \ build_product_image @$(FINISH_ECHO) @@ -196,7 +196,7 @@ create_fresh_debug_bootdir: FRC @$(START_ECHO) $(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \ - NO_DOCS=true \ + GENERATE_DOCS=false \ BOOT_CYCLE_DEBUG_SETTINGS= \ build_debug_image @$(FINISH_ECHO) @@ -204,7 +204,7 @@ create_fresh_fastdebug_bootdir: FRC @$(START_ECHO) $(MAKE) ALT_OUTPUTDIR=$(ABS_BOOTDIR_OUTPUTDIR) \ - NO_DOCS=true \ + GENERATE_DOCS=false \ BOOT_CYCLE_DEBUG_SETTINGS= \ build_fastdebug_image @$(FINISH_ECHO) @@ -253,7 +253,7 @@ $(MAKE) \ ALT_OUTPUTDIR=$(ABS_OUTPUTDIR)-$(DEBUG_NAME) \ DEBUG_NAME=$(DEBUG_NAME) \ - NO_DOCS=true \ + GENERATE_DOCS=false \ $(BOOT_CYCLE_DEBUG_SETTINGS) \ generic_build_repo_series @$(FINISH_ECHO) @@ -323,7 +323,7 @@ $(MKDIR) -p $(OPENJDK_OUTPUTDIR) ($(CD) $(OPENJDK_BUILDDIR) && $(MAKE) \ OPENJDK=true \ - NO_DOCS=true \ + GENERATE_DOCS=false \ ALT_JDK_DEVTOOLS_DIR=$(JDK_DEVTOOLS_DIR) \ ALT_OUTPUTDIR=$(OPENJDK_OUTPUTDIR) \ ALT_BINARY_PLUGS_PATH=$(OPENJDK_PLUGS) \ diff -r fcbbd4d49581 -r ade55a65b0f2 corba/.hgignore --- a/corba/.hgignore Wed Dec 16 23:39:39 2009 -0800 +++ b/corba/.hgignore Wed Jul 05 17:04:26 2017 +0200 @@ -1,3 +1,3 @@ ^build/ ^dist/ -^nbproject/private/ +/nbproject/private/ diff -r fcbbd4d49581 -r ade55a65b0f2 corba/.hgtags --- a/corba/.hgtags Wed Dec 16 23:39:39 2009 -0800 +++ b/corba/.hgtags Wed Jul 05 17:04:26 2017 +0200 @@ -51,3 +51,4 @@ 5d0cf59a3203b9f57aceebc33ae656b884987955 jdk7-b74 0fb137085952c8e47878e240d1cb40f14de463c4 jdk7-b75 937144222e2219939101b0129d26a872a7956b13 jdk7-b76 +6881f0383f623394b5ec73f27a5f329ff55d0467 jdk7-b77 diff -r fcbbd4d49581 -r ade55a65b0f2 hotspot/.hgignore --- a/hotspot/.hgignore Wed Dec 16 23:39:39 2009 -0800 +++ b/hotspot/.hgignore Wed Jul 05 17:04:26 2017 +0200 @@ -1,6 +1,6 @@ ^build/ ^dist/ -^nbproject/private/ +/nbproject/private/ ^src/share/tools/hsdis/build/ ^src/share/tools/IdealGraphVisualizer/[a-zA-Z0-9]*/build/ ^src/share/tools/IdealGraphVisualizer/build/ diff -r fcbbd4d49581 -r ade55a65b0f2 hotspot/.hgtags --- a/hotspot/.hgtags Wed Dec 16 23:39:39 2009 -0800 +++ b/hotspot/.hgtags Wed Jul 05 17:04:26 2017 +0200 @@ -51,3 +51,4 @@ f4b900403d6e4b0af51447bd13bbe23fe3a1dac7 jdk7-b74 d8dd291a362acb656026a9c0a9da48501505a1e7 jdk7-b75 9174bb32e934965288121f75394874eeb1fcb649 jdk7-b76 +455105fc81d941482f8f8056afaa7aa0949c9300 jdk7-b77 diff -r fcbbd4d49581 -r ade55a65b0f2 jaxp/.hgignore --- a/jaxp/.hgignore Wed Dec 16 23:39:39 2009 -0800 +++ b/jaxp/.hgignore Wed Jul 05 17:04:26 2017 +0200 @@ -3,4 +3,4 @@ ^drop/ ^drop_included/ ^webrev/ -^nbproject/private/ +/nbproject/private/ diff -r fcbbd4d49581 -r ade55a65b0f2 jaxp/.hgtags --- a/jaxp/.hgtags Wed Dec 16 23:39:39 2009 -0800 +++ b/jaxp/.hgtags Wed Jul 05 17:04:26 2017 +0200 @@ -51,3 +51,4 @@ ea7b88c676dd8b269bc858a4a17c14dc96c8aed1 jdk7-b74 555fb78ee4cebed082ca7ddabff46d2e5b4c9026 jdk7-b75 233a4871d3364ec305efd4a58cfd676620a03a90 jdk7-b76 +bfadab8c7b1bf806a49d3e1bc19ec919717f057a jdk7-b77 diff -r fcbbd4d49581 -r ade55a65b0f2 jaxws/.hgignore --- a/jaxws/.hgignore Wed Dec 16 23:39:39 2009 -0800 +++ b/jaxws/.hgignore Wed Jul 05 17:04:26 2017 +0200 @@ -3,4 +3,4 @@ ^drop/ ^drop_included/ ^webrev/ -^nbproject/private/ +/nbproject/private/ diff -r fcbbd4d49581 -r ade55a65b0f2 jaxws/.hgtags --- a/jaxws/.hgtags Wed Dec 16 23:39:39 2009 -0800 +++ b/jaxws/.hgtags Wed Jul 05 17:04:26 2017 +0200 @@ -51,3 +51,4 @@ f4466e1b608088c90e11beaa4b600f102608c6a1 jdk7-b74 fcf2b8b5d606641659419f247fcee4b284c45e6e jdk7-b75 765d2077d1e652e234d27fe85ba58a986b488503 jdk7-b76 +5b4968c110476085225d3a71c4210fad2c1116c1 jdk7-b77 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/.hgignore --- a/jdk/.hgignore Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/.hgignore Wed Jul 05 17:04:26 2017 +0200 @@ -1,6 +1,5 @@ ^build/ ^dist/ -^nbproject/private/ -^make/netbeans/.*/nbproject/private/ +/nbproject/private/ ^make/netbeans/.*/build/ ^make/netbeans/.*/dist/ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/.hgtags --- a/jdk/.hgtags Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/.hgtags Wed Jul 05 17:04:26 2017 +0200 @@ -51,3 +51,4 @@ eacb36e30327e7ae33baa068e82ddccbd91eaae2 jdk7-b74 8885b22565077236a927e824ef450742e434a230 jdk7-b75 8fb602395be0f7d5af4e7e93b7df2d960faf9d17 jdk7-b76 +e6a5d095c356a547cf5b3c8885885aca5e91e09b jdk7-b77 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/java/java/Makefile --- a/jdk/make/java/java/Makefile Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/java/java/Makefile Wed Jul 05 17:04:26 2017 +0200 @@ -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)" \ $< $@ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/java/java/genlocales.gmk --- a/jdk/make/java/java/genlocales.gmk Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/java/java/genlocales.gmk Wed Jul 05 17:04:26 2017 +0200 @@ -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" diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/java/java/localegen.sh --- a/jdk/make/java/java/localegen.sh Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/java/java/localegen.sh Wed Jul 05 17:04:26 2017 +0200 @@ -27,7 +27,7 @@ # # This script is to generate the supported locale list string and replace the -# LocaleDataMetaInfo-XLocales.java in /src/share/classes/sun/util +# LocaleDataMetaInfo-XLocales.java.template in /src/share/classes/sun/util # # SORT, NAWK & SED is passed in as environment variables. # diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/java/jli/Makefile --- a/jdk/make/java/jli/Makefile Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/java/jli/Makefile Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/java/main/java/Makefile --- a/jdk/make/java/main/java/Makefile Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/java/main/java/Makefile Wed Jul 05 17:04:26 2017 +0200 @@ -61,8 +61,5 @@ ifeq ($(PLATFORM), solaris) LDFLAGS += -R$(OPENWIN_LIB) -endif - -ifeq ($(PLATFORM), solaris) LDFLAGS += -M mapfile-$(ARCH) endif diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/java/nio/Makefile --- a/jdk/make/java/nio/Makefile Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/java/nio/Makefile Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/java/redist/Makefile --- a/jdk/make/java/redist/Makefile Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/java/redist/Makefile Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/javax/sound/Makefile --- a/jdk/make/javax/sound/Makefile Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/javax/sound/Makefile Wed Jul 05 17:04:26 2017 +0200 @@ -108,22 +108,14 @@ endif # PLATFORM linux ifeq ($(PLATFORM), solaris) - ifneq ($(ARCH), amd64) - # build with ports and direct audio - CPPFLAGS += -DUSE_PORTS=TRUE \ - -DUSE_DAUDIO=TRUE + # build with ports and direct audio + CPPFLAGS += -DUSE_PORTS=TRUE \ + -DUSE_DAUDIO=TRUE - INCLUDE_PORTS = TRUE - INCLUDE_DAUDIO = TRUE - INCLUDE_MIDI = TRUE - else - # build with empty MIDI i/o - INCLUDE_MIDI = TRUE - # build with empty ports - INCLUDE_PORTS = TRUE - # build with empty direct audio - INCLUDE_DAUDIO = TRUE - endif + INCLUDE_PORTS = TRUE + INCLUDE_DAUDIO = TRUE + # build with empty MIDI i/o + INCLUDE_MIDI = TRUE endif # PLATFORM solaris # for dynamic inclusion of extra sound libs: these diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/netbeans/README --- a/jdk/make/netbeans/README Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/netbeans/README Wed Jul 05 17:04:26 2017 +0200 @@ -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/ \ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/sun/nio/Makefile --- a/jdk/make/sun/nio/Makefile Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/sun/nio/Makefile Wed Jul 05 17:04:26 2017 +0200 @@ -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) diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/sun/xawt/mapfile-vers --- a/jdk/make/sun/xawt/mapfile-vers Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/sun/xawt/mapfile-vers Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/tools/CharsetMapping/DoubleByte-X.java --- a/jdk/make/tools/CharsetMapping/DoubleByte-X.java Wed Dec 16 23:39:39 2009 -0800 +++ /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; - } - } -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/tools/CharsetMapping/DoubleByte-X.java.template --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/make/tools/CharsetMapping/DoubleByte-X.java.template Wed Jul 05 17:04:26 2017 +0200 @@ -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; + } + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/tools/CharsetMapping/SingleByte-X.java --- a/jdk/make/tools/CharsetMapping/SingleByte-X.java Wed Dec 16 23:39:39 2009 -0800 +++ /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); - } -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/tools/CharsetMapping/SingleByte-X.java.template --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/make/tools/CharsetMapping/SingleByte-X.java.template Wed Jul 05 17:04:26 2017 +0200 @@ -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); + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/tools/src/build/tools/charsetmapping/GenerateDBCS.java --- a/jdk/make/tools/src/build/tools/charsetmapping/GenerateDBCS.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/tools/src/build/tools/charsetmapping/GenerateDBCS.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/make/tools/src/build/tools/charsetmapping/GenerateSBCS.java --- a/jdk/make/tools/src/build/tools/charsetmapping/GenerateSBCS.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/make/tools/src/build/tools/charsetmapping/GenerateSBCS.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/bin/java.c --- a/jdk/src/share/bin/java.c Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/bin/java.c Wed Jul 05 17:04:26 2017 +0200 @@ -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 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 - * 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 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 flags. If the data models do not match + * the CreateExecutionEnviroment will remove the -d 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 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 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) diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/beans/WeakCache.java --- a/jdk/src/share/classes/com/sun/beans/WeakCache.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/beans/WeakCache.java Wed Jul 05 17:04:26 2017 +0200 @@ -81,4 +81,11 @@ this.map.remove(key); } } + + /** + * Removes all of the mappings from this cache. + */ + public void clear() { + this.map.clear(); + } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/crypto/provider/HmacCore.java --- a/jdk/src/share/classes/com/sun/crypto/provider/HmacCore.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/crypto/provider/HmacCore.java Wed Jul 05 17:04:26 2017 +0200 @@ -36,7 +36,7 @@ /** * This class constitutes the core of HMAC- algorithms, where - * can be SHA1 or MD5, etc. + * 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"); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java --- a/jdk/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java Wed Jul 05 17:04:26 2017 +0200 @@ -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()); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java Wed Jul 05 17:04:26 2017 +0200 @@ -24,7 +24,6 @@ */ package com.sun.java.swing.plaf.gtk; -import sun.swing.plaf.synth.SynthUI; import sun.awt.UNIXToolkit; import javax.swing.plaf.synth.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java Wed Jul 05 17:04:26 2017 +0200 @@ -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,SoftReference>> cache = + Collections.synchronizedMap( + new WeakHashMap,SoftReference>> ()); + + /** + * Returns the list of methods cached for the given class, or {@code null} + * if not cached. + */ + private static List getCachedMethods(Class clazz) { + // return cached methods if possible + SoftReference> ref = cache.get(clazz); + if (ref != null) { + List 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 getReadMethods(Class clazz) { + // return cached result if available + List 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 methods = + StandardMBeanIntrospector.getInstance().getMethods(clazz); + methods = MBeanAnalyzer.eliminateCovariantMethods(methods); + + // filter out the non-getter methods + List result = new LinkedList(); + 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>(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); + } + } + } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java --- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MBeanIntrospector.java Wed Jul 05 17:04:26 2017 +0200 @@ -175,7 +175,7 @@ /** * Get the methods to be analyzed to build the MBean interface. */ - List getMethods(final Class mbeanType) throws Exception { + List getMethods(final Class mbeanType) { return Arrays.asList(mbeanType.getMethods()); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/media/sound/MidiDeviceReceiver.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/com/sun/media/sound/MidiDeviceReceiver.java Wed Jul 05 17:04:26 2017 +0200 @@ -0,0 +1,41 @@ +/* + * 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. + */ +package com.sun.media.sound; + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.Receiver; + +/** + * A Receiver with reference to it's MidiDevice object. + * + * @author Karl Helgason + */ +public interface MidiDeviceReceiver extends Receiver { + + /** Obtains the MidiDevice object associated with this Receiver. + */ + public MidiDevice getMidiDevice(); + +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java --- a/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java Wed Jul 05 17:04:26 2017 +0200 @@ -48,6 +48,30 @@ converter = AudioFloatConverter.getConverter(format); } + public void swap(SoftAudioBuffer swap) + { + int bak_size = size; + float[] bak_buffer = buffer; + boolean bak_empty = empty; + AudioFormat bak_format = format; + AudioFloatConverter bak_converter = converter; + byte[] bak_converter_buffer = converter_buffer; + + size = swap.size; + buffer = swap.buffer; + empty = swap.empty; + format = swap.format; + converter = swap.converter; + converter_buffer = swap.converter_buffer; + + swap.size = bak_size; + swap.buffer = bak_buffer; + swap.empty = bak_empty; + swap.format = bak_format; + swap.converter = bak_converter; + swap.converter_buffer = bak_converter_buffer; + } + public AudioFormat getFormat() { return format; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/media/sound/SoftChannel.java --- a/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java Wed Jul 05 17:04:26 2017 +0200 @@ -218,6 +218,15 @@ } private int findFreeVoice(int x) { + if(x == -1) + { + // x = -1 means that there where no available voice + // last time we called findFreeVoice + // and it hasn't changed because no audio has been + // rendered in the meantime. + // Therefore we have to return -1. + return -1; + } for (int i = x; i < voices.length; i++) if (!voices[i].active) return i; @@ -328,7 +337,7 @@ } protected void initVoice(SoftVoice voice, SoftPerformer p, int voiceID, - int noteNumber, int velocity, ModelConnectionBlock[] connectionBlocks, + int noteNumber, int velocity, int delay, ModelConnectionBlock[] connectionBlocks, ModelChannelMixer channelmixer, boolean releaseTriggered) { if (voice.active) { // Voice is active , we must steal the voice @@ -363,7 +372,7 @@ voice.objects.put("midi_cc", co_midi_cc); voice.objects.put("midi_rpn", co_midi_rpn); voice.objects.put("midi_nrpn", co_midi_nrpn); - voice.noteOn(noteNumber, velocity); + voice.noteOn(noteNumber, velocity, delay); voice.setMute(mute); voice.setSoloMute(solomute); if (releaseTriggered) @@ -399,14 +408,21 @@ } public void noteOn(int noteNumber, int velocity) { + noteOn(noteNumber, velocity, 0); + } + + /* A special noteOn with delay parameter, which is used to + * start note within control buffers. + */ + protected void noteOn(int noteNumber, int velocity, int delay) { noteNumber = restrict7Bit(noteNumber); velocity = restrict7Bit(velocity); - noteOn_internal(noteNumber, velocity); + noteOn_internal(noteNumber, velocity, delay); if (current_mixer != null) current_mixer.noteOn(noteNumber, velocity); } - private void noteOn_internal(int noteNumber, int velocity) { + private void noteOn_internal(int noteNumber, int velocity, int delay) { if (velocity == 0) { noteOff_internal(noteNumber, 64); @@ -490,6 +506,7 @@ int tunedKey = (int)(Math.round(tuning.getTuning()[noteNumber]/100.0)); play_noteNumber = noteNumber; play_velocity = velocity; + play_delay = delay; play_releasetriggered = false; lastVelocity[noteNumber] = velocity; current_director.noteOn(tunedKey, velocity); @@ -594,6 +611,7 @@ play_noteNumber = noteNumber; play_velocity = lastVelocity[noteNumber]; play_releasetriggered = true; + play_delay = 0; current_director.noteOff(tunedKey, velocity); } @@ -604,12 +622,14 @@ private int voiceNo = 0; private int play_noteNumber = 0; private int play_velocity = 0; + private int play_delay = 0; private boolean play_releasetriggered = false; public void play(int performerIndex, ModelConnectionBlock[] connectionBlocks) { int noteNumber = play_noteNumber; int velocity = play_velocity; + int delay = play_delay; boolean releasetriggered = play_releasetriggered; SoftPerformer p = current_instrument.getPerformers()[performerIndex]; @@ -633,7 +653,7 @@ if (voiceNo == -1) return; - initVoice(voices[voiceNo], p, prevVoiceID, noteNumber, velocity, + initVoice(voices[voiceNo], p, prevVoiceID, noteNumber, velocity, delay, connectionBlocks, current_mixer, releasetriggered); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java --- a/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java Wed Jul 05 17:04:26 2017 +0200 @@ -79,7 +79,7 @@ if (silentcounter > 60) { if (!mix) { bufferLout.clear(); - bufferRout.clear(); + if (bufferRout != null) bufferRout.clear(); } return; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java --- a/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java Wed Jul 05 17:04:26 2017 +0200 @@ -26,7 +26,6 @@ import java.io.IOException; import java.io.InputStream; -import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.Set; @@ -46,28 +45,37 @@ */ public class SoftMainMixer { + // A private class thats contains a ModelChannelMixer and it's private buffers. + // This becomes necessary when we want to have separate delay buffers for each channel mixer. + private class SoftChannelMixerContainer + { + ModelChannelMixer mixer; + SoftAudioBuffer[] buffers; + } + public final static int CHANNEL_LEFT = 0; public final static int CHANNEL_RIGHT = 1; public final static int CHANNEL_MONO = 2; - public final static int CHANNEL_EFFECT1 = 3; - public final static int CHANNEL_EFFECT2 = 4; - public final static int CHANNEL_EFFECT3 = 5; - public final static int CHANNEL_EFFECT4 = 6; + public final static int CHANNEL_DELAY_LEFT = 3; + public final static int CHANNEL_DELAY_RIGHT = 4; + public final static int CHANNEL_DELAY_MONO = 5; + public final static int CHANNEL_EFFECT1 = 6; + public final static int CHANNEL_EFFECT2 = 7; + public final static int CHANNEL_DELAY_EFFECT1 = 8; + public final static int CHANNEL_DELAY_EFFECT2 = 9; public final static int CHANNEL_LEFT_DRY = 10; public final static int CHANNEL_RIGHT_DRY = 11; public final static int CHANNEL_SCRATCH1 = 12; public final static int CHANNEL_SCRATCH2 = 13; - public final static int CHANNEL_CHANNELMIXER_LEFT = 14; - public final static int CHANNEL_CHANNELMIXER_RIGHT = 15; - public final static int CHANNEL_CHANNELMIXER_MONO = 16; protected boolean active_sensing_on = false; private long msec_last_activity = -1; private boolean pusher_silent = false; private int pusher_silent_count = 0; - private long msec_pos = 0; + private long sample_pos = 0; protected boolean readfully = true; private Object control_mutex; private SoftSynthesizer synth; + private float samplerate = 44100; private int nrofchannels = 2; private SoftVoice[] voicestatus = null; private SoftAudioBuffer[] buffers; @@ -75,7 +83,10 @@ private SoftAudioProcessor chorus; private SoftAudioProcessor agc; private long msec_buffer_len = 0; + private int buffer_len = 0; protected TreeMap midimessages = new TreeMap(); + private int delay_midievent = 0; + private int max_delay_midievent = 0; double last_volume_left = 1.0; double last_volume_right = 1.0; private double[] co_master_balance = new double[1]; @@ -83,9 +94,9 @@ private double[] co_master_coarse_tuning = new double[1]; private double[] co_master_fine_tuning = new double[1]; private AudioInputStream ais; - private Set registeredMixers = null; + private Set registeredMixers = null; private Set stoppedMixers = null; - private ModelChannelMixer[] cur_registeredMixers = null; + private SoftChannelMixerContainer[] cur_registeredMixers = null; protected SoftControl co_master = new SoftControl() { double[] balance = co_master_balance; @@ -413,26 +424,68 @@ Iterator> iter = midimessages.entrySet().iterator(); while (iter.hasNext()) { Entry entry = iter.next(); - if (entry.getKey() > (timeStamp + 100)) + if (entry.getKey() >= (timeStamp + msec_buffer_len)) return; + long msec_delay = entry.getKey() - timeStamp; + delay_midievent = (int)(msec_delay * (samplerate / 1000000.0) + 0.5); + if(delay_midievent > max_delay_midievent) + delay_midievent = max_delay_midievent; + if(delay_midievent < 0) + delay_midievent = 0; processMessage(entry.getValue()); iter.remove(); } + delay_midievent = 0; } protected void processAudioBuffers() { + + if(synth.weakstream != null && synth.weakstream.silent_samples != 0) + { + sample_pos += synth.weakstream.silent_samples; + synth.weakstream.silent_samples = 0; + } + for (int i = 0; i < buffers.length; i++) { - buffers[i].clear(); + if(i != CHANNEL_DELAY_LEFT && + i != CHANNEL_DELAY_RIGHT && + i != CHANNEL_DELAY_MONO && + i != CHANNEL_DELAY_EFFECT1 && + i != CHANNEL_DELAY_EFFECT2) + buffers[i].clear(); + } + + if(!buffers[CHANNEL_DELAY_LEFT].isSilent()) + { + buffers[CHANNEL_LEFT].swap(buffers[CHANNEL_DELAY_LEFT]); + } + if(!buffers[CHANNEL_DELAY_RIGHT].isSilent()) + { + buffers[CHANNEL_RIGHT].swap(buffers[CHANNEL_DELAY_RIGHT]); + } + if(!buffers[CHANNEL_DELAY_MONO].isSilent()) + { + buffers[CHANNEL_MONO].swap(buffers[CHANNEL_DELAY_MONO]); + } + if(!buffers[CHANNEL_DELAY_EFFECT1].isSilent()) + { + buffers[CHANNEL_EFFECT1].swap(buffers[CHANNEL_DELAY_EFFECT1]); + } + if(!buffers[CHANNEL_DELAY_EFFECT2].isSilent()) + { + buffers[CHANNEL_EFFECT2].swap(buffers[CHANNEL_DELAY_EFFECT2]); } double volume_left; double volume_right; - ModelChannelMixer[] act_registeredMixers; + SoftChannelMixerContainer[] act_registeredMixers; // perform control logic synchronized (control_mutex) { + long msec_pos = (long)(sample_pos * (1000000.0 / samplerate)); + processMessages(msec_pos); if (active_sensing_on) { @@ -450,7 +503,7 @@ for (int i = 0; i < voicestatus.length; i++) if (voicestatus[i].active) voicestatus[i].processControlLogic(); - msec_pos += msec_buffer_len; + sample_pos += buffer_len; double volume = co_master_volume[0]; volume_left = volume; @@ -469,7 +522,7 @@ if (cur_registeredMixers == null) { if (registeredMixers != null) { cur_registeredMixers = - new ModelChannelMixer[registeredMixers.size()]; + new SoftChannelMixerContainer[registeredMixers.size()]; registeredMixers.toArray(cur_registeredMixers); } } @@ -483,44 +536,61 @@ if (act_registeredMixers != null) { - // Reroute default left,right output - // to channelmixer left,right input/output + // Make backup of left,right,mono channels SoftAudioBuffer leftbak = buffers[CHANNEL_LEFT]; SoftAudioBuffer rightbak = buffers[CHANNEL_RIGHT]; SoftAudioBuffer monobak = buffers[CHANNEL_MONO]; - buffers[CHANNEL_LEFT] = buffers[CHANNEL_CHANNELMIXER_LEFT]; - buffers[CHANNEL_RIGHT] = buffers[CHANNEL_CHANNELMIXER_RIGHT]; - buffers[CHANNEL_MONO] = buffers[CHANNEL_CHANNELMIXER_MONO]; + SoftAudioBuffer delayleftbak = buffers[CHANNEL_DELAY_LEFT]; + SoftAudioBuffer delayrightbak = buffers[CHANNEL_DELAY_RIGHT]; + SoftAudioBuffer delaymonobak = buffers[CHANNEL_DELAY_MONO]; int bufferlen = buffers[CHANNEL_LEFT].getSize(); float[][] cbuffer = new float[nrofchannels][]; - cbuffer[0] = buffers[CHANNEL_LEFT].array(); - if (nrofchannels != 1) - cbuffer[1] = buffers[CHANNEL_RIGHT].array(); - float[][] obuffer = new float[nrofchannels][]; obuffer[0] = leftbak.array(); if (nrofchannels != 1) obuffer[1] = rightbak.array(); - for (ModelChannelMixer cmixer : act_registeredMixers) { - for (int i = 0; i < cbuffer.length; i++) - Arrays.fill(cbuffer[i], 0); + for (SoftChannelMixerContainer cmixer : act_registeredMixers) { + + // Reroute default left,right output + // to channelmixer left,right input/output + buffers[CHANNEL_LEFT] = cmixer.buffers[CHANNEL_LEFT]; + buffers[CHANNEL_RIGHT] = cmixer.buffers[CHANNEL_RIGHT]; + buffers[CHANNEL_MONO] = cmixer.buffers[CHANNEL_MONO]; + buffers[CHANNEL_DELAY_LEFT] = cmixer.buffers[CHANNEL_DELAY_LEFT]; + buffers[CHANNEL_DELAY_RIGHT] = cmixer.buffers[CHANNEL_DELAY_RIGHT]; + buffers[CHANNEL_DELAY_MONO] = cmixer.buffers[CHANNEL_DELAY_MONO]; + + buffers[CHANNEL_LEFT].clear(); + buffers[CHANNEL_RIGHT].clear(); buffers[CHANNEL_MONO].clear(); + + if(!buffers[CHANNEL_DELAY_LEFT].isSilent()) + { + buffers[CHANNEL_LEFT].swap(buffers[CHANNEL_DELAY_LEFT]); + } + if(!buffers[CHANNEL_DELAY_RIGHT].isSilent()) + { + buffers[CHANNEL_RIGHT].swap(buffers[CHANNEL_DELAY_RIGHT]); + } + if(!buffers[CHANNEL_DELAY_MONO].isSilent()) + { + buffers[CHANNEL_MONO].swap(buffers[CHANNEL_DELAY_MONO]); + } + + cbuffer[0] = buffers[CHANNEL_LEFT].array(); + if (nrofchannels != 1) + cbuffer[1] = buffers[CHANNEL_RIGHT].array(); + boolean hasactivevoices = false; for (int i = 0; i < voicestatus.length; i++) if (voicestatus[i].active) - if (voicestatus[i].channelmixer == cmixer) { + if (voicestatus[i].channelmixer == cmixer.mixer) { voicestatus[i].processAudioLogic(buffers); hasactivevoices = true; } - if (!cmixer.process(cbuffer, 0, bufferlen)) { - synchronized (control_mutex) { - registeredMixers.remove(cmixer); - cur_registeredMixers = null; - } - } if(!buffers[CHANNEL_MONO].isSilent()) { @@ -542,6 +612,13 @@ } } + if (!cmixer.mixer.process(cbuffer, 0, bufferlen)) { + synchronized (control_mutex) { + registeredMixers.remove(cmixer); + cur_registeredMixers = null; + } + } + for (int i = 0; i < cbuffer.length; i++) { float[] cbuff = cbuffer[i]; float[] obuff = obuffer[i]; @@ -554,7 +631,7 @@ if (stoppedMixers != null) { if (stoppedMixers.contains(cmixer)) { stoppedMixers.remove(cmixer); - cmixer.stop(); + cmixer.mixer.stop(); } } } @@ -565,6 +642,9 @@ buffers[CHANNEL_LEFT] = leftbak; buffers[CHANNEL_RIGHT] = rightbak; buffers[CHANNEL_MONO] = monobak; + buffers[CHANNEL_DELAY_LEFT] = delayleftbak; + buffers[CHANNEL_DELAY_RIGHT] = delayrightbak; + buffers[CHANNEL_DELAY_MONO] = delaymonobak; } @@ -650,14 +730,23 @@ if(buffers[CHANNEL_LEFT].isSilent() && buffers[CHANNEL_RIGHT].isSilent()) { - pusher_silent_count++; - if(pusher_silent_count > 5) + + int midimessages_size; + synchronized (control_mutex) { + midimessages_size = midimessages.size(); + } + + if(midimessages_size == 0) { - pusher_silent_count = 0; - synchronized (control_mutex) { - pusher_silent = true; - if(synth.weakstream != null) - synth.weakstream.setInputStream(null); + pusher_silent_count++; + if(pusher_silent_count > 5) + { + pusher_silent_count = 0; + synchronized (control_mutex) { + pusher_silent = true; + if(synth.weakstream != null) + synth.weakstream.setInputStream(null); + } } } } @@ -672,13 +761,18 @@ // Must only we called within control_mutex synchronization public void activity() { - msec_last_activity = msec_pos; + long silent_samples = 0; if(pusher_silent) { pusher_silent = false; if(synth.weakstream != null) + { synth.weakstream.setInputStream(ais); + silent_samples = synth.weakstream.silent_samples; + } } + msec_last_activity = (long)((sample_pos + silent_samples) + * (1000000.0 / samplerate)); } public void stopMixer(ModelChannelMixer mixer) { @@ -689,15 +783,22 @@ public void registerMixer(ModelChannelMixer mixer) { if (registeredMixers == null) - registeredMixers = new HashSet(); - registeredMixers.add(mixer); + registeredMixers = new HashSet(); + SoftChannelMixerContainer mixercontainer = new SoftChannelMixerContainer(); + mixercontainer.buffers = new SoftAudioBuffer[6]; + for (int i = 0; i < mixercontainer.buffers.length; i++) { + mixercontainer.buffers[i] = + new SoftAudioBuffer(buffer_len, synth.getFormat()); + } + mixercontainer.mixer = mixer; + registeredMixers.add(mixercontainer); cur_registeredMixers = null; } public SoftMainMixer(SoftSynthesizer synth) { this.synth = synth; - msec_pos = 0; + sample_pos = 0; co_master_balance[0] = 0.5; co_master_volume[0] = 1; @@ -705,14 +806,18 @@ co_master_fine_tuning[0] = 0.5; msec_buffer_len = (long) (1000000.0 / synth.getControlRate()); - + samplerate = synth.getFormat().getSampleRate(); nrofchannels = synth.getFormat().getChannels(); int buffersize = (int) (synth.getFormat().getSampleRate() / synth.getControlRate()); + buffer_len = buffersize; + + max_delay_midievent = buffersize; + control_mutex = synth.control_mutex; - buffers = new SoftAudioBuffer[17]; + buffers = new SoftAudioBuffer[14]; for (int i = 0; i < buffers.length; i++) { buffers[i] = new SoftAudioBuffer(buffersize, synth.getFormat()); } @@ -994,7 +1099,10 @@ switch (cmd) { case ShortMessage.NOTE_ON: - softchannel.noteOn(data1, data2); + if(delay_midievent != 0) + softchannel.noteOn(data1, data2, delay_midievent); + else + softchannel.noteOn(data1, data2); break; case ShortMessage.NOTE_OFF: softchannel.noteOff(data1, data2); @@ -1021,7 +1129,15 @@ } public long getMicrosecondPosition() { - return msec_pos; + if(pusher_silent) + { + if(synth.weakstream != null) + { + return (long)((sample_pos + synth.weakstream.silent_samples) + * (1000000.0 / samplerate)); + } + } + return (long)(sample_pos * (1000000.0 / samplerate)); } public void close() { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java --- a/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java Wed Jul 05 17:04:26 2017 +0200 @@ -26,8 +26,8 @@ import java.util.TreeMap; +import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiMessage; -import javax.sound.midi.Receiver; import javax.sound.midi.ShortMessage; /** @@ -35,7 +35,7 @@ * * @author Karl Helgason */ -public class SoftReceiver implements Receiver { +public class SoftReceiver implements MidiDeviceReceiver { protected boolean open = true; private Object control_mutex; @@ -51,6 +51,10 @@ this.midimessages = mainmixer.midimessages; } + public MidiDevice getMidiDevice() { + return synth; + } + public void send(MidiMessage message, long timeStamp) { synchronized (control_mutex) { @@ -60,6 +64,7 @@ if (timeStamp != -1) { synchronized (control_mutex) { + mainmixer.activity(); while (midimessages.get(timeStamp) != null) timeStamp++; if (message instanceof ShortMessage diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java --- a/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java Wed Jul 05 17:04:26 2017 +0200 @@ -66,6 +66,8 @@ public SoftAudioPusher pusher = null; public AudioInputStream jitter_stream = null; public SourceDataLine sourceDataLine = null; + public volatile long silent_samples = 0; + private int framesize = 0; private WeakReference weak_stream_link; private AudioFloatConverter converter; private float[] silentbuffer = null; @@ -101,6 +103,8 @@ silentbuffer = new float[flen]; converter.toByteArray(silentbuffer, flen, b, off); + silent_samples += (long)((len / framesize)); + if(pusher != null) if(weak_stream_link.get() == null) { @@ -136,6 +140,7 @@ weak_stream_link = new WeakReference(stream); converter = AudioFloatConverter.getConverter(stream.getFormat()); samplesize = stream.getFormat().getFrameSize() / stream.getFormat().getChannels(); + framesize = stream.getFormat().getFrameSize(); } public AudioInputStream getAudioInputStream() diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/media/sound/SoftVoice.java --- a/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java Wed Jul 05 17:04:26 2017 +0200 @@ -43,6 +43,7 @@ private int noteOn_noteNumber = 0; private int noteOn_velocity = 0; private int noteOff_velocity = 0; + private int delay = 0; protected ModelChannelMixer channelmixer = null; protected double tunedKey = 0; protected SoftTuning tuning = null; @@ -294,7 +295,7 @@ tunedKey = tuning.getTuning(noteNumber) / 100.0; } - protected void noteOn(int noteNumber, int velocity) { + protected void noteOn(int noteNumber, int velocity, int delay) { sustain = false; sostenuto = false; @@ -308,6 +309,7 @@ noteOn_noteNumber = noteNumber; noteOn_velocity = velocity; + this.delay = delay; lastMuteValue = 0; lastSoloMuteValue = 0; @@ -562,7 +564,7 @@ if (stealer_channel != null) { stealer_channel.initVoice(this, stealer_performer, - stealer_voiceID, stealer_noteNumber, stealer_velocity, + stealer_voiceID, stealer_noteNumber, stealer_velocity, 0, stealer_extendedConnectionBlocks, stealer_channelmixer, stealer_releaseTriggered); stealer_releaseTriggered = false; @@ -733,23 +735,55 @@ } protected void mixAudioStream(SoftAudioBuffer in, SoftAudioBuffer out, + SoftAudioBuffer dout, float amp_from, float amp_to) { int bufferlen = in.getSize(); if (amp_from < 0.000000001 && amp_to < 0.000000001) return; - if (amp_from == amp_to) { - float[] fout = out.array(); - float[] fin = in.array(); - for (int i = 0; i < bufferlen; i++) - fout[i] += fin[i] * amp_to; - } else { - float amp = amp_from; - float amp_delta = (amp_to - amp_from) / bufferlen; - float[] fout = out.array(); - float[] fin = in.array(); - for (int i = 0; i < bufferlen; i++) { - amp += amp_delta; - fout[i] += fin[i] * amp; + if(dout != null && delay != 0) + { + if (amp_from == amp_to) { + float[] fout = out.array(); + float[] fin = in.array(); + int j = 0; + for (int i = delay; i < bufferlen; i++) + fout[i] += fin[j++] * amp_to; + fout = dout.array(); + for (int i = 0; i < delay; i++) + fout[i] += fin[j++] * amp_to; + } else { + float amp = amp_from; + float amp_delta = (amp_to - amp_from) / bufferlen; + float[] fout = out.array(); + float[] fin = in.array(); + int j = 0; + for (int i = delay; i < bufferlen; i++) { + amp += amp_delta; + fout[i] += fin[j++] * amp; + } + fout = dout.array(); + for (int i = 0; i < delay; i++) { + amp += amp_delta; + fout[i] += fin[j++] * amp; + } + } + } + else + { + if (amp_from == amp_to) { + float[] fout = out.array(); + float[] fin = in.array(); + for (int i = 0; i < bufferlen; i++) + fout[i] += fin[i] * amp_to; + } else { + float amp = amp_from; + float amp_delta = (amp_to - amp_from) / bufferlen; + float[] fout = out.array(); + float[] fin = in.array(); + for (int i = 0; i < bufferlen; i++) { + amp += amp_delta; + fout[i] += fin[i] * amp; + } } } @@ -785,6 +819,13 @@ SoftAudioBuffer mono = buffer[SoftMainMixer.CHANNEL_MONO]; SoftAudioBuffer eff1 = buffer[SoftMainMixer.CHANNEL_EFFECT1]; SoftAudioBuffer eff2 = buffer[SoftMainMixer.CHANNEL_EFFECT2]; + + SoftAudioBuffer dleft = buffer[SoftMainMixer.CHANNEL_DELAY_LEFT]; + SoftAudioBuffer dright = buffer[SoftMainMixer.CHANNEL_DELAY_RIGHT]; + SoftAudioBuffer dmono = buffer[SoftMainMixer.CHANNEL_DELAY_MONO]; + SoftAudioBuffer deff1 = buffer[SoftMainMixer.CHANNEL_DELAY_EFFECT1]; + SoftAudioBuffer deff2 = buffer[SoftMainMixer.CHANNEL_DELAY_EFFECT2]; + SoftAudioBuffer leftdry = buffer[SoftMainMixer.CHANNEL_LEFT_DRY]; SoftAudioBuffer rightdry = buffer[SoftMainMixer.CHANNEL_RIGHT_DRY]; @@ -799,42 +840,42 @@ if (nrofchannels == 1) { out_mixer_left = (out_mixer_left + out_mixer_right) / 2; - mixAudioStream(leftdry, left, last_out_mixer_left, out_mixer_left); + mixAudioStream(leftdry, left, dleft, last_out_mixer_left, out_mixer_left); if (rightdry != null) - mixAudioStream(rightdry, left, last_out_mixer_left, + mixAudioStream(rightdry, left, dleft, last_out_mixer_left, out_mixer_left); } else { if(rightdry == null && last_out_mixer_left == last_out_mixer_right && out_mixer_left == out_mixer_right) { - mixAudioStream(leftdry, mono, last_out_mixer_left, out_mixer_left); + mixAudioStream(leftdry, mono, dmono, last_out_mixer_left, out_mixer_left); } else { - mixAudioStream(leftdry, left, last_out_mixer_left, out_mixer_left); + mixAudioStream(leftdry, left, dleft, last_out_mixer_left, out_mixer_left); if (rightdry != null) - mixAudioStream(rightdry, right, last_out_mixer_right, + mixAudioStream(rightdry, right, dright, last_out_mixer_right, out_mixer_right); else - mixAudioStream(leftdry, right, last_out_mixer_right, + mixAudioStream(leftdry, right, dright, last_out_mixer_right, out_mixer_right); } } if (rightdry == null) { - mixAudioStream(leftdry, eff1, last_out_mixer_effect1, + mixAudioStream(leftdry, eff1, deff1, last_out_mixer_effect1, out_mixer_effect1); - mixAudioStream(leftdry, eff2, last_out_mixer_effect2, + mixAudioStream(leftdry, eff2, deff2, last_out_mixer_effect2, out_mixer_effect2); } else { - mixAudioStream(leftdry, eff1, last_out_mixer_effect1 * 0.5f, + mixAudioStream(leftdry, eff1, deff1, last_out_mixer_effect1 * 0.5f, out_mixer_effect1 * 0.5f); - mixAudioStream(leftdry, eff2, last_out_mixer_effect2 * 0.5f, + mixAudioStream(leftdry, eff2, deff2, last_out_mixer_effect2 * 0.5f, out_mixer_effect2 * 0.5f); - mixAudioStream(rightdry, eff1, last_out_mixer_effect1 * 0.5f, + mixAudioStream(rightdry, eff1, deff1, last_out_mixer_effect1 * 0.5f, out_mixer_effect1 * 0.5f); - mixAudioStream(rightdry, eff2, last_out_mixer_effect2 * 0.5f, + mixAudioStream(rightdry, eff2, deff2, last_out_mixer_effect2 * 0.5f, out_mixer_effect2 * 0.5f); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/security/auth/PolicyFile.java --- a/jdk/src/share/classes/com/sun/security/auth/PolicyFile.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/security/auth/PolicyFile.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java --- a/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 initSecContext. + *

+ * When this flag is false, delegation will only be tried when the + * {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag} + * is true. + *

+ * 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. + *

+ * 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. + *

+ * 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. + *

+ * 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, requestDelegPolicy + * should return silently without throwing an exception. + *

+ * 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(); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java --- a/jdk/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/tools/hat/internal/model/JavaStatic.java Wed Jul 05 17:04:26 2017 +0200 @@ -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(); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/com/sun/tracing/ProviderFactory.java --- a/jdk/src/share/classes/com/sun/tracing/ProviderFactory.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/com/sun/tracing/ProviderFactory.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 factories = new HashSet(); // 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 ., where is // a fully specified class name, and is a static member // in that class. The 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() { + 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; } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/awt/Component.java --- a/jdk/src/share/classes/java/awt/Component.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/awt/Component.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/awt/EventDispatchThread.java --- a/jdk/src/share/classes/java/awt/EventDispatchThread.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/awt/EventDispatchThread.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/awt/EventQueue.java --- a/jdk/src/share/classes/java/awt/EventQueue.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/awt/EventQueue.java Wed Jul 05 17:04:26 2017 +0200 @@ -45,6 +45,9 @@ import sun.awt.EventQueueItem; import sun.awt.AWTAccessor; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; + /** * EventQueue 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 null * 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 newEventQueue is null * @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(); } } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/awt/KeyboardFocusManager.java --- a/jdk/src/share/classes/java/awt/KeyboardFocusManager.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/awt/KeyboardFocusManager.java Wed Jul 05 17:04:26 2017 +0200 @@ -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"); } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/awt/Window.java --- a/jdk/src/share/classes/java/awt/Window.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/awt/Window.java Wed Jul 05 17:04:26 2017 +0200 @@ -148,6 +148,51 @@ public class Window extends Container implements Accessible { /** + * Enumeration of available window types. + * + * 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. + *

+ * 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 normal 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 utility 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 popup 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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java --- a/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java Wed Jul 05 17:04:26 2017 +0200 @@ -313,11 +313,14 @@ } /** - * Gets the Class object of the indexed properties' type. - * The returned Class may describe a primitive type such as int. + * Returns the Java type info for the indexed property. + * Note that the {@code Class} object may describe + * primitive Java types such as {@code int}. + * This type is returned by the indexed read method + * or is used as the parameter type of the indexed write method. * - * @return The Class for the indexed properties' type; may return null - * if the type cannot be determined. + * @return the {@code Class} object that represents the Java type info, + * or {@code null} if the type cannot be determined */ public synchronized Class getIndexedPropertyType() { Class type = getIndexedPropertyType0(); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/beans/Introspector.java --- a/jdk/src/share/classes/java/beans/Introspector.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/beans/Introspector.java Wed Jul 05 17:04:26 2017 +0200 @@ -25,26 +25,19 @@ package java.beans; +import com.sun.beans.WeakCache; import com.sun.beans.finder.BeanInfoFinder; import com.sun.beans.finder.ClassFinder; -import java.lang.ref.Reference; -import java.lang.ref.SoftReference; - import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.security.AccessController; -import java.security.PrivilegedAction; - -import java.util.Collections; import java.util.Map; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.EventListener; import java.util.List; -import java.util.WeakHashMap; import java.util.TreeMap; import sun.awt.AppContext; @@ -85,20 +78,7 @@ * patterns to identify property accessors, event sources, or public * methods. We then proceed to analyze the class's superclass and add * in the information from it (and possibly on up the superclass chain). - * *

- * Because the Introspector caches BeanInfo classes for better performance, - * take care if you use it in an application that uses - * multiple class loaders. - * In general, when you destroy a ClassLoader - * that has been used to introspect classes, - * you should use the - * {@link #flushCaches Introspector.flushCaches} - * or - * {@link #flushFromCaches Introspector.flushFromCaches} method - * to flush all of the introspected classes out of the cache. - * - *

* For more information about introspection and design patterns, please * consult the * JavaBeans specification. @@ -112,8 +92,8 @@ public final static int IGNORE_ALL_BEANINFO = 3; // Static Caches to speed up introspection. - private static Map declaredMethodCache = - Collections.synchronizedMap(new WeakHashMap()); + private static WeakCache, Method[]> declaredMethodCache = + new WeakCache, Method[]>(); private static final Object BEANINFO_CACHE = new Object(); @@ -174,20 +154,21 @@ if (!ReflectUtil.isPackageAccessible(beanClass)) { return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); } - Map, BeanInfo> map; synchronized (BEANINFO_CACHE) { - map = (Map, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE); - if (map == null) { - map = Collections.synchronizedMap(new WeakHashMap, BeanInfo>()); - AppContext.getAppContext().put(BEANINFO_CACHE, map); + WeakCache, BeanInfo> beanInfoCache = + (WeakCache, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE); + + if (beanInfoCache == null) { + beanInfoCache = new WeakCache, BeanInfo>(); + AppContext.getAppContext().put(BEANINFO_CACHE, beanInfoCache); } + BeanInfo beanInfo = beanInfoCache.get(beanClass); + if (beanInfo == null) { + beanInfo = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); + beanInfoCache.put(beanClass, beanInfo); + } + return beanInfo; } - BeanInfo bi = map.get(beanClass); - if (bi == null) { - bi = (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); - map.put(beanClass, bi); - } - return bi; } /** @@ -359,11 +340,13 @@ */ public static void flushCaches() { - Map map = (Map) AppContext.getAppContext().get(BEANINFO_CACHE); - if (map != null) { - map.clear(); + synchronized (BEANINFO_CACHE) { + WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE); + if (beanInfoCache != null) { + beanInfoCache.clear(); + } + declaredMethodCache.clear(); } - declaredMethodCache.clear(); } /** @@ -385,11 +368,13 @@ if (clz == null) { throw new NullPointerException(); } - Map map = (Map) AppContext.getAppContext().get(BEANINFO_CACHE); - if (map != null) { - map.remove(clz); + synchronized (BEANINFO_CACHE) { + WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE); + if (beanInfoCache != null) { + beanInfoCache.put(clz, null); + } + declaredMethodCache.put(clz, null); } - declaredMethodCache.remove(clz); } //====================================================================== @@ -1272,41 +1257,26 @@ /* * Internal method to return *public* methods within a class. */ - private static synchronized Method[] getPublicDeclaredMethods(Class clz) { + private static Method[] getPublicDeclaredMethods(Class clz) { // Looking up Class.getDeclaredMethods is relatively expensive, // so we cache the results. - Method[] result = null; if (!ReflectUtil.isPackageAccessible(clz)) { return new Method[0]; } - final Class fclz = clz; - Reference ref = (Reference)declaredMethodCache.get(fclz); - if (ref != null) { - result = (Method[])ref.get(); - if (result != null) { - return result; - } - } - - // We have to raise privilege for getDeclaredMethods - result = (Method[]) AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return fclz.getDeclaredMethods(); + synchronized (BEANINFO_CACHE) { + Method[] result = declaredMethodCache.get(clz); + if (result == null) { + result = clz.getMethods(); + for (int i = 0; i < result.length; i++) { + Method method = result[i]; + if (!method.getDeclaringClass().equals(clz)) { + result[i] = null; + } } - }); - - - // Null out any non-public methods. - for (int i = 0; i < result.length; i++) { - Method method = result[i]; - int mods = method.getModifiers(); - if (!Modifier.isPublic(mods)) { - result[i] = null; + declaredMethodCache.put(clz, result); } + return result; } - // Add it to the cache. - declaredMethodCache.put(fclz, new SoftReference(result)); - return result; } //====================================================================== diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/beans/PropertyDescriptor.java --- a/jdk/src/share/classes/java/beans/PropertyDescriptor.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/beans/PropertyDescriptor.java Wed Jul 05 17:04:26 2017 +0200 @@ -164,14 +164,16 @@ } /** - * Gets the Class object for the property. + * Returns the Java type info for the property. + * Note that the {@code Class} object may describe + * primitive Java types such as {@code int}. + * This type is returned by the read method + * or is used as the parameter type of the write method. + * Returns {@code null} if the type is an indexed property + * that does not support non-indexed access. * - * @return The Java type info for the property. Note that - * the "Class" object may describe a built-in Java type such as "int". - * The result may be "null" if this is an indexed property that - * does not support non-indexed access. - *

- * This is the type that will be returned by the ReadMethod. + * @return the {@code Class} object that represents the Java type info, + * or {@code null} if the type cannot be determined */ public synchronized Class getPropertyType() { Class type = getPropertyType0(); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/lang/ClassLoader.java --- a/jdk/src/share/classes/java/lang/ClassLoader.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/lang/ClassLoader.java Wed Jul 05 17:04:26 2017 +0200 @@ -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> parallelLoaders - = Collections.newSetFromMap(Collections.synchronizedMap - (new WeakHashMap, 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> loaderTypes = + Collections.newSetFromMap( + new WeakHashMap, 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 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 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(); package2certs = new ConcurrentHashMap(); domains = @@ -1194,24 +1233,7 @@ * @since 1.7 */ protected static boolean registerAsParallelCapable() { - Class 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; } } - diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/lang/System.java --- a/jdk/src/share/classes/java/lang/System.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/lang/System.java Wed Jul 05 17:04:26 2017 +0200 @@ -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}. + * + *

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 Properties * argument. *

@@ -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); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/net/CookieManager.java --- a/jdk/src/share/classes/java/net/CookieManager.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/net/CookieManager.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 cookies = HttpCookie.parse(headerValue); + List 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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/net/HttpCookie.java --- a/jdk/src/share/classes/java/net/HttpCookie.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/net/HttpCookie.java Wed Jul 05 17:04:26 2017 +0200 @@ -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) { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/nio/channels/Selector.java --- a/jdk/src/share/classes/java/nio/channels/Selector.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/nio/channels/Selector.java Wed Jul 05 17:04:26 2017 +0200 @@ -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. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/util/DualPivotQuicksort.java --- a/jdk/src/share/classes/java/util/DualPivotQuicksort.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/util/DualPivotQuicksort.java Wed Jul 05 17:04:26 2017 +0200 @@ -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). * *

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). * *

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++; } } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/util/Formatter.java --- a/jdk/src/share/classes/java/util/Formatter.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/util/Formatter.java Wed Jul 05 17:04:26 2017 +0200 @@ -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('%'); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/util/zip/Deflater.java --- a/jdk/src/share/classes/java/util/zip/Deflater.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/util/zip/Deflater.java Wed Jul 05 17:04:26 2017 +0200 @@ -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. * *

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. * *

This method uses {@link #NO_FLUSH} as its compression flush mode. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/java/util/zip/DeflaterOutputStream.java --- a/jdk/src/share/classes/java/util/zip/DeflaterOutputStream.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/java/util/zip/DeflaterOutputStream.java Wed Jul 05 17:04:26 2017 +0200 @@ -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}. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/naming/InitialContext.java --- a/jdk/src/share/classes/javax/naming/InitialContext.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/naming/InitialContext.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 @@ * *

This constructor will not modify environment * or save a reference to it, but may save a clone. + * Caller should not modify mutable keys and values in + * environment after it has been passed to the constructor. * * @param environment * environment used to create the initial context. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/naming/directory/InitialDirContext.java --- a/jdk/src/share/classes/javax/naming/directory/InitialDirContext.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/naming/directory/InitialDirContext.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 @@ * *

This constructor will not modify environment * or save a reference to it, but may save a clone. + * Caller should not modify mutable keys and values in + * environment after it has been passed to the constructor. * * @param environment * environment used to create the initial DirContext. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/naming/ldap/InitialLdapContext.java --- a/jdk/src/share/classes/javax/naming/ldap/InitialLdapContext.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/naming/ldap/InitialLdapContext.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 @@ * *

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 + * environment after it has been passed to the constructor. * *

connCtls is used as the underlying context instance's * connection request controls. See the class description diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/security/auth/Subject.java --- a/jdk/src/share/classes/javax/security/auth/Subject.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/security/auth/Subject.java Wed Jul 05 17:04:26 2017 +0200 @@ -40,7 +40,6 @@ import java.security.PrivilegedActionException; import java.security.ProtectionDomain; import sun.security.util.ResourcesMgr; -import sun.security.util.SecurityConstants; /** *

A Subject 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"); + } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/AbstractListModel.java --- a/jdk/src/share/classes/javax/swing/AbstractListModel.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/AbstractListModel.java Wed Jul 05 17:04:26 2017 +0200 @@ -42,9 +42,11 @@ * has been added to the java.beans package. * Please see {@link java.beans.XMLEncoder}. * + * @param the type of the elements of this model + * * @author Hans Muller */ -public abstract class AbstractListModel implements ListModel, Serializable +public abstract class AbstractListModel implements ListModel, Serializable { protected EventListenerList listenerList = new EventListenerList(); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/DefaultListCellRenderer.java --- a/jdk/src/share/classes/javax/swing/DefaultListCellRenderer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/DefaultListCellRenderer.java Wed Jul 05 17:04:26 2017 +0200 @@ -71,7 +71,7 @@ * @author Hans Muller */ public class DefaultListCellRenderer extends JLabel - implements ListCellRenderer, Serializable + implements ListCellRenderer, Serializable { /** @@ -111,7 +111,7 @@ } public Component getListCellRendererComponent( - JList list, + JList list, Object value, int index, boolean isSelected, diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/DefaultListModel.java --- a/jdk/src/share/classes/javax/swing/DefaultListModel.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/DefaultListModel.java Wed Jul 05 17:04:26 2017 +0200 @@ -48,11 +48,13 @@ * has been added to the java.beans package. * Please see {@link java.beans.XMLEncoder}. * + * @param the type of the elements of this model + * * @author Hans Muller */ -public class DefaultListModel extends AbstractListModel +public class DefaultListModel extends AbstractListModel { - private Vector delegate = new Vector(); + private Vector delegate = new Vector(); /** * Returns the number of components in this list. @@ -83,7 +85,7 @@ * list * @see #get(int) */ - public Object getElementAt(int index) { + public E getElementAt(int index) { return delegate.elementAt(index); } @@ -175,7 +177,7 @@ * @return an enumeration of the components of this list * @see Vector#elements() */ - public Enumeration elements() { + public Enumeration elements() { return delegate.elements(); } @@ -260,7 +262,7 @@ * @see #get(int) * @see Vector#elementAt(int) */ - public Object elementAt(int index) { + public E elementAt(int index) { return delegate.elementAt(index); } @@ -271,7 +273,7 @@ * @return the first component of this list * @see Vector#firstElement() */ - public Object firstElement() { + public E firstElement() { return delegate.firstElement(); } @@ -283,13 +285,13 @@ * @return the last component of the list * @see Vector#lastElement() */ - public Object lastElement() { + public E lastElement() { return delegate.lastElement(); } /** * Sets the component at the specified index of this - * list to be the specified object. The previous component at that + * list to be the specified element. The previous component at that * position is discarded. *

* Throws an ArrayIndexOutOfBoundsException if the index @@ -300,13 +302,13 @@ * List interface defined in the 1.2 Collections framework. * * - * @param obj what the component is to be set to + * @param element what the component is to be set to * @param index the specified index * @see #set(int,Object) * @see Vector#setElementAt(Object,int) */ - public void setElementAt(Object obj, int index) { - delegate.setElementAt(obj, index); + public void setElementAt(E element, int index) { + delegate.setElementAt(element, index); fireContentsChanged(this, index, index); } @@ -331,7 +333,7 @@ } /** - * Inserts the specified object as a component in this list at the + * Inserts the specified element as a component in this list at the * specified index. *

* Throws an ArrayIndexOutOfBoundsException if the index @@ -342,26 +344,26 @@ * List interface defined in the 1.2 Collections framework. * * - * @param obj the component to insert + * @param element the component to insert * @param index where to insert the new component * @exception ArrayIndexOutOfBoundsException if the index was invalid * @see #add(int,Object) * @see Vector#insertElementAt(Object,int) */ - public void insertElementAt(Object obj, int index) { - delegate.insertElementAt(obj, index); + public void insertElementAt(E element, int index) { + delegate.insertElementAt(element, index); fireIntervalAdded(this, index, index); } /** * Adds the specified component to the end of this list. * - * @param obj the component to be added + * @param element the component to be added * @see Vector#addElement(Object) */ - public void addElement(Object obj) { + public void addElement(E element) { int index = delegate.size(); - delegate.addElement(obj); + delegate.addElement(element); fireIntervalAdded(this, index, index); } @@ -441,7 +443,7 @@ * * @param index index of element to return */ - public Object get(int index) { + public E get(int index) { return delegate.elementAt(index); } @@ -457,8 +459,8 @@ * @param element element to be stored at the specified position * @return the element previously at the specified position */ - public Object set(int index, Object element) { - Object rv = delegate.elementAt(index); + public E set(int index, E element) { + E rv = delegate.elementAt(index); delegate.setElementAt(element, index); fireContentsChanged(this, index, index); return rv; @@ -474,7 +476,7 @@ * @param index index at which the specified element is to be inserted * @param element element to be inserted */ - public void add(int index, Object element) { + public void add(int index, E element) { delegate.insertElementAt(element, index); fireIntervalAdded(this, index, index); } @@ -488,9 +490,10 @@ * (index < 0 || index >= size()). * * @param index the index of the element to removed + * @return the element previously at the specified position */ - public Object remove(int index) { - Object rv = delegate.elementAt(index); + public E remove(int index) { + E rv = delegate.elementAt(index); delegate.removeElementAt(index); fireIntervalRemoved(this, index, index); return rv; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/JList.java --- a/jdk/src/share/classes/javax/swing/JList.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/JList.java Wed Jul 05 17:04:26 2017 +0200 @@ -25,11 +25,24 @@ package javax.swing; +import java.awt.Color; +import java.awt.Component; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.GraphicsEnvironment; +import java.awt.HeadlessException; +import java.awt.Insets; +import java.awt.Point; +import java.awt.Rectangle; import java.awt.event.*; -import java.awt.*; import java.util.Vector; import java.util.Locale; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -59,28 +72,30 @@ * constructor that automatically builds a read-only {@code ListModel} instance * for you: *

+ * {@code
  * // Create a JList that displays strings from an array
  *
  * String[] data = {"one", "two", "three", "four"};
- * JList myList = new JList(data);
+ * JList myList = new JList(data);
  *
  * // Create a JList that displays the superclasses of JList.class, by
  * // creating it with a Vector populated with this data
  *
- * Vector superClasses = new Vector();
- * Class rootClass = javax.swing.JList.class;
- * for(Class cls = rootClass; cls != null; cls = cls.getSuperclass()) {
+ * Vector> superClasses = new Vector>();
+ * Class rootClass = javax.swing.JList.class;
+ * for(Class cls = rootClass; cls != null; cls = cls.getSuperclass()) {
  *     superClasses.addElement(cls);
  * }
- * JList myList = new JList(superClasses);
+ * JList> myList = new JList>(superClasses);
  *
  * // The automatically created model is stored in JList's "model"
  * // property, which you can retrieve
  *
- * ListModel model = myList.getModel();
+ * ListModel> model = myList.getModel();
  * for(int i = 0; i < model.getSize(); i++) {
  *     System.out.println(model.getElementAt(i));
  * }
+ * }
  * 
*

* A {@code ListModel} can be supplied directly to a {@code JList} by way of a @@ -103,12 +118,14 @@ * notifying listeners. For example, a read-only implementation of * {@code AbstractListModel}: *

+ * {@code
  * // This list model has about 2^16 elements.  Enjoy scrolling.
  *
- * ListModel bigData = new AbstractListModel() {
+ * ListModel bigData = new AbstractListModel() {
  *     public int getSize() { return Short.MAX_VALUE; }
- *     public Object getElementAt(int index) { return "Index " + index; }
+ *     public String getElementAt(int index) { return "Index " + index; }
  * };
+ * }
  * 
*

* The selection state of a {@code JList} is managed by another separate @@ -150,9 +167,10 @@ * component to render, is installed by the lists's {@code ListUI}. You can * substitute your own renderer using code like this: *

+ * {@code
  *  // Display an icon and a string for each object in the list.
  *
- * class MyCellRenderer extends JLabel implements ListCellRenderer {
+ * class MyCellRenderer extends JLabel implements ListCellRenderer {
  *     final static ImageIcon longIcon = new ImageIcon("long.gif");
  *     final static ImageIcon shortIcon = new ImageIcon("short.gif");
  *
@@ -160,7 +178,7 @@
  *     // We just reconfigure the JLabel each time we're called.
  *
  *     public Component getListCellRendererComponent(
- *       JList list,              // the list
+ *       JList list,           // the list
  *       Object value,            // value to display
  *       int index,               // cell index
  *       boolean isSelected,      // is the cell selected
@@ -184,6 +202,7 @@
  * }
  *
  * myList.setCellRenderer(new MyCellRenderer());
+ * }
  * 
  * 

* Another job for the cell renderer is in helping to determine sizing @@ -195,7 +214,8 @@ * automatically based on a single prototype value: * *

- * JList bigDataList = new JList(bigData);
+ * {@code
+ * JList bigDataList = new JList(bigData);
  *
  * // We don't want the JList implementation to compute the width
  * // or height of all of the list cells, so we give it a string
@@ -204,6 +224,7 @@
  * // properties.
  *
  * bigDataList.setPrototypeCellValue("Index 1234567890");
+ * }
  * 
*

* {@code JList} doesn't implement scrolling directly. To create a list that @@ -260,13 +281,15 @@ * @see ListCellRenderer * @see DefaultListCellRenderer * + * @param the type of the elements of this list + * * @beaninfo * attribute: isContainer false * description: A component which allows for the selection of one or more objects from a list. * * @author Hans Muller */ -public class JList extends JComponent implements Scrollable, Accessible +public class JList extends JComponent implements Scrollable, Accessible { /** * @see #getUIClassID @@ -301,15 +324,15 @@ private int fixedCellWidth = -1; private int fixedCellHeight = -1; private int horizontalScrollIncrement = -1; - private Object prototypeCellValue; + private E prototypeCellValue; private int visibleRowCount = 8; private Color selectionForeground; private Color selectionBackground; private boolean dragEnabled; private ListSelectionModel selectionModel; - private ListModel dataModel; - private ListCellRenderer cellRenderer; + private ListModel dataModel; + private ListCellRenderer cellRenderer; private ListSelectionListener selectionListener; /** @@ -402,7 +425,7 @@ * @param dataModel the model for the list * @exception IllegalArgumentException if the model is {@code null} */ - public JList(ListModel dataModel) + public JList(ListModel dataModel) { if (dataModel == null) { throw new IllegalArgumentException("dataModel must be non null"); @@ -437,12 +460,12 @@ * @param listData the array of Objects to be loaded into the data model, * {@code non-null} */ - public JList(final Object[] listData) + public JList(final E[] listData) { this ( - new AbstractListModel() { + new AbstractListModel() { public int getSize() { return listData.length; } - public Object getElementAt(int i) { return listData[i]; } + public E getElementAt(int i) { return listData[i]; } } ); } @@ -462,11 +485,11 @@ * @param listData the Vector to be loaded into the * data model, {@code non-null} */ - public JList(final Vector listData) { + public JList(final Vector listData) { this ( - new AbstractListModel() { + new AbstractListModel() { public int getSize() { return listData.size(); } - public Object getElementAt(int i) { return listData.elementAt(i); } + public E getElementAt(int i) { return listData.elementAt(i); } } ); } @@ -477,9 +500,9 @@ */ public JList() { this ( - new AbstractListModel() { + new AbstractListModel() { public int getSize() { return 0; } - public Object getElementAt(int i) { return "No Data Model"; } + public E getElementAt(int i) { throw new IndexOutOfBoundsException("No Data Model"); } } ); } @@ -526,7 +549,7 @@ public void updateUI() { setUI((ListUI)UIManager.getUI(this)); - ListCellRenderer renderer = getCellRenderer(); + ListCellRenderer renderer = getCellRenderer(); if (renderer instanceof Component) { SwingUtilities.updateComponentTreeUI((Component)renderer); } @@ -560,8 +583,8 @@ */ private void updateFixedCellSize() { - ListCellRenderer cr = getCellRenderer(); - Object value = getPrototypeCellValue(); + ListCellRenderer cr = getCellRenderer(); + E value = getPrototypeCellValue(); if ((cr != null) && (value != null)) { Component c = cr.getListCellRendererComponent(this, value, 0, false, false); @@ -592,7 +615,7 @@ * @return the value of the {@code prototypeCellValue} property * @see #setPrototypeCellValue */ - public Object getPrototypeCellValue() { + public E getPrototypeCellValue() { return prototypeCellValue; } @@ -632,8 +655,8 @@ * attribute: visualUpdate true * description: The cell prototype value, used to compute cell width and height. */ - public void setPrototypeCellValue(Object prototypeCellValue) { - Object oldValue = this.prototypeCellValue; + public void setPrototypeCellValue(E prototypeCellValue) { + E oldValue = this.prototypeCellValue; this.prototypeCellValue = prototypeCellValue; /* If the prototypeCellValue has changed and is non-null, @@ -727,7 +750,7 @@ * @see #setCellRenderer */ @Transient - public ListCellRenderer getCellRenderer() { + public ListCellRenderer getCellRenderer() { return cellRenderer; } @@ -755,8 +778,8 @@ * attribute: visualUpdate true * description: The component used to draw the cells. */ - public void setCellRenderer(ListCellRenderer cellRenderer) { - ListCellRenderer oldValue = this.cellRenderer; + public void setCellRenderer(ListCellRenderer cellRenderer) { + ListCellRenderer oldValue = this.cellRenderer; this.cellRenderer = cellRenderer; /* If the cellRenderer has changed and prototypeCellValue @@ -1455,7 +1478,7 @@ * @since 1.4 */ public int getNextMatch(String prefix, int startIndex, Position.Bias bias) { - ListModel model = getModel(); + ListModel model = getModel(); int max = model.getSize(); if (prefix == null) { throw new IllegalArgumentException(); @@ -1469,16 +1492,16 @@ int increment = (bias == Position.Bias.Forward) ? 1 : -1; int index = startIndex; do { - Object o = model.getElementAt(index); - - if (o != null) { + E element = model.getElementAt(index); + + if (element != null) { String string; - if (o instanceof String) { - string = ((String)o).toUpperCase(); + if (element instanceof String) { + string = ((String)element).toUpperCase(); } else { - string = o.toString(); + string = element.toString(); if (string != null) { string = string.toUpperCase(); } @@ -1516,7 +1539,7 @@ if(event != null) { Point p = event.getPoint(); int index = locationToIndex(p); - ListCellRenderer r = getCellRenderer(); + ListCellRenderer r = getCellRenderer(); Rectangle cellBounds; if (index != -1 && r != null && (cellBounds = @@ -1634,7 +1657,7 @@ * list of items * @see #setModel */ - public ListModel getModel() { + public ListModel getModel() { return dataModel; } @@ -1656,11 +1679,11 @@ * attribute: visualUpdate true * description: The object that contains the data to be drawn by this JList. */ - public void setModel(ListModel model) { + public void setModel(ListModel model) { if (model == null) { throw new IllegalArgumentException("model must be non null"); } - ListModel oldValue = dataModel; + ListModel oldValue = dataModel; dataModel = model; firePropertyChange("model", oldValue, dataModel); clearSelection(); @@ -1668,7 +1691,7 @@ /** - * Constructs a read-only ListModel from an array of objects, + * Constructs a read-only ListModel from an array of items, * and calls {@code setModel} with this model. *

* Attempts to pass a {@code null} value to this method results in @@ -1676,15 +1699,15 @@ * references the given array directly. Attempts to modify the array * after invoking this method results in undefined behavior. * - * @param listData an array of {@code Objects} containing the items to + * @param listData an array of {@code E} containing the items to * display in the list * @see #setModel */ - public void setListData(final Object[] listData) { + public void setListData(final E[] listData) { setModel ( - new AbstractListModel() { + new AbstractListModel() { public int getSize() { return listData.length; } - public Object getElementAt(int i) { return listData[i]; } + public E getElementAt(int i) { return listData[i]; } } ); } @@ -1703,11 +1726,11 @@ * display in the list * @see #setModel */ - public void setListData(final Vector listData) { + public void setListData(final Vector listData) { setModel ( - new AbstractListModel() { + new AbstractListModel() { public int getSize() { return listData.size(); } - public Object getElementAt(int i) { return listData.elementAt(i); } + public E getElementAt(int i) { return listData.elementAt(i); } } ); } @@ -2235,10 +2258,13 @@ * @see #isSelectedIndex * @see #getModel * @see #addListSelectionListener + * + * @deprecated As of JDK 1.7, replaced by {@link #getSelectedValuesList()} */ + @Deprecated public Object[] getSelectedValues() { ListSelectionModel sm = getSelectionModel(); - ListModel dm = getModel(); + ListModel dm = getModel(); int iMin = sm.getMinSelectionIndex(); int iMax = sm.getMaxSelectionIndex(); @@ -2259,6 +2285,37 @@ return rv; } + /** + * Returns a list of all the selected items, in increasing order based + * on their indices in the list. + * + * @return the selected items, or an empty list if nothing is selected + * @see #isSelectedIndex + * @see #getModel + * @see #addListSelectionListener + * + * @since 1.7 + */ + public List getSelectedValuesList() { + ListSelectionModel sm = getSelectionModel(); + ListModel dm = getModel(); + + int iMin = sm.getMinSelectionIndex(); + int iMax = sm.getMaxSelectionIndex(); + + if ((iMin < 0) || (iMax < 0)) { + return Collections.emptyList(); + } + + List selectedItems = new ArrayList(); + for(int i = iMin; i <= iMax; i++) { + if (sm.isSelectedIndex(i)) { + selectedItems.add(dm.getElementAt(i)); + } + } + return selectedItems; + } + /** * Returns the smallest selected cell index; the selection when only @@ -2291,7 +2348,7 @@ * @see #getModel * @see #addListSelectionListener */ - public Object getSelectedValue() { + public E getSelectedValue() { int i = getMinSelectionIndex(); return (i == -1) ? null : getModel().getElementAt(i); } @@ -2309,7 +2366,7 @@ setSelectedIndex(-1); else if(!anObject.equals(getSelectedValue())) { int i,c; - ListModel dm = getModel(); + ListModel dm = getModel(); for(i=0,c=dm.getSize();i parent = null; private int indexInParent; private Component component = null; private AccessibleContext accessibleContext = null; - private ListModel listModel; - private ListCellRenderer cellRenderer = null; - - public AccessibleJListChild(JList parent, int indexInParent) { + private ListModel listModel; + private ListCellRenderer cellRenderer = null; + + public AccessibleJListChild(JList parent, int indexInParent) { this.parent = parent; this.setAccessibleParent(parent); this.indexInParent = indexInParent; @@ -3175,7 +3232,7 @@ if ((parent != null) && (listModel != null) && cellRenderer != null) { - Object value = listModel.getElementAt(index); + E value = listModel.getElementAt(index); boolean isSelected = parent.isSelectedIndex(index); boolean isFocussed = parent.isFocusOwner() && (index == parent.getLeadSelectionIndex()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/JTable.java --- a/jdk/src/share/classes/javax/swing/JTable.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/JTable.java Wed Jul 05 17:04:26 2017 +0200 @@ -1337,7 +1337,11 @@ return (TableCellRenderer)renderer; } else { - return getDefaultRenderer(columnClass.getSuperclass()); + Class c = columnClass.getSuperclass(); + if (c == null && columnClass != Object.class) { + c = Object.class; + } + return getDefaultRenderer(c); } } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/ListCellRenderer.java --- a/jdk/src/share/classes/javax/swing/ListCellRenderer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/ListCellRenderer.java Wed Jul 05 17:04:26 2017 +0200 @@ -33,12 +33,13 @@ * the cells in a JList. For example, to use a JLabel as a * ListCellRenderer, you would write something like this: *

- * class MyCellRenderer extends JLabel implements ListCellRenderer {
+ * {@code
+ * class MyCellRenderer extends JLabel implements ListCellRenderer {
  *     public MyCellRenderer() {
  *         setOpaque(true);
  *     }
  *
- *     public Component getListCellRendererComponent(JList list,
+ *     public Component getListCellRendererComponent(JList list,
  *                                                   Object value,
  *                                                   int index,
  *                                                   boolean isSelected,
@@ -75,14 +76,17 @@
  *         return this;
  *     }
  * }
+ * }
  * 
  *
+ * @param  the type of values this renderer can be used for
+ *
  * @see JList
  * @see DefaultListCellRenderer
  *
  * @author Hans Muller
  */
-public interface ListCellRenderer
+public interface ListCellRenderer
 {
     /**
      * Return a component that has been configured to display the specified
@@ -104,8 +108,8 @@
      * @see ListModel
      */
     Component getListCellRendererComponent(
-        JList list,
-        Object value,
+        JList list,
+        E value,
         int index,
         boolean isSelected,
         boolean cellHasFocus);
diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/ListModel.java
--- a/jdk/src/share/classes/javax/swing/ListModel.java	Wed Dec 16 23:39:39 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/ListModel.java	Wed Jul 05 17:04:26 2017 +0200
@@ -35,10 +35,12 @@
  * length of the data model must be reported to all of the
  * ListDataListeners.
  *
+ * @param  the type of the elements of this model
+ *
  * @author Hans Muller
  * @see JList
  */
-public interface ListModel
+public interface ListModel
 {
   /**
    * Returns the length of the list.
@@ -51,7 +53,7 @@
    * @param index the requested index
    * @return the value at index
    */
-  Object getElementAt(int index);
+  E getElementAt(int index);
 
   /**
    * Adds a listener to the list that's notified each time a change
diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/Popup.java
--- a/jdk/src/share/classes/javax/swing/Popup.java	Wed Dec 16 23:39:39 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/Popup.java	Wed Jul 05 17:04:26 2017 +0200
@@ -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);
diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/ComponentUI.java
--- a/jdk/src/share/classes/javax/swing/plaf/ComponentUI.java	Wed Dec 16 23:39:39 2009 -0800
+++ b/jdk/src/share/classes/javax/swing/plaf/ComponentUI.java	Wed Jul 05 17:04:26 2017 +0200
@@ -60,13 +60,13 @@
     }
 
     /**
-     * Configures the specified component appropriate for the look and feel.
+     * Configures the specified component appropriately for the look and feel.
      * This method is invoked when the ComponentUI instance is being installed
      * as the UI delegate on the specified component.  This method should
      * completely configure the component for the look and feel,
      * including the following:
      * 
    - *
  1. Install any default property values for color, fonts, borders, + *
  2. Install default property values for color, fonts, borders, * icons, opacity, etc. on the component. Whenever possible, * property values initialized by the client program should not * be overridden. @@ -116,7 +116,7 @@ } /** - * Paints the specified component appropriate for the look and feel. + * Paints the specified component appropriately for the look and feel. * This method is invoked from the ComponentUI.update method when * the specified component is being painted. Subclasses should override * this method and use the specified Graphics object to @@ -134,15 +134,15 @@ } /** - * Notifies this UI delegate that it's time to paint the specified + * Notifies this UI delegate that it is time to paint the specified * component. This method is invoked by JComponent * when the specified component is being painted. - * By default this method will fill the specified component with - * its background color (if its opaque property is - * true) and then immediately call paint. - * In general this method need not be overridden by subclasses; - * all look-and-feel rendering code should reside in the paint - * method. + * + *

    By default this method fills the specified component with + * its background color if its {@code opaque} property is {@code true}, + * and then immediately calls {@code paint}. In general this method need + * not be overridden by subclasses; all look-and-feel rendering code should + * reside in the {@code paint} method. * * @param g the Graphics context in which to paint * @param c the component being painted; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxEditor.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxEditor.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxEditor.java Wed Jul 05 17:04:26 2017 +0200 @@ -24,14 +24,10 @@ */ package javax.swing.plaf.basic; -import javax.swing.*; +import javax.swing.ComboBoxEditor; +import javax.swing.JTextField; import javax.swing.border.Border; - -import javax.swing.text.AttributeSet; -import javax.swing.text.BadLocationException; -import javax.swing.text.PlainDocument; - -import java.awt.*; +import java.awt.Component; import java.awt.event.*; import java.lang.reflect.Method; @@ -73,12 +69,17 @@ * @param anObject the displayed value of the editor */ public void setItem(Object anObject) { + String text; + if ( anObject != null ) { - editor.setText(anObject.toString()); - + text = anObject.toString(); oldValue = anObject; } else { - editor.setText(""); + text = ""; + } + // workaround for 4530952 + if (! text.equals(editor.getText())) { + editor.setText(text); } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -30,7 +30,6 @@ import javax.swing.*; import javax.accessibility.*; import javax.swing.plaf.*; -import javax.swing.border.*; import javax.swing.text.*; import javax.swing.event.*; import java.beans.PropertyChangeListener; @@ -189,19 +188,20 @@ /** * Indicates whether or not the combo box button should be square. * If square, then the width and height are equal, and are both set to - * the height of the combo (minus appropriate insets). + * the height of the combo minus appropriate insets. + * + * @since 1.7 */ - private boolean squareButton = true; + protected boolean squareButton = true; /** - * Optional: if specified, these insets act as padding around the cell - * renderer when laying out and painting the "selected" item in the - * combo box. BasicComboBoxUI uses a single combo box renderer for rendering - * both the main combo box item and also all the items in the dropdown - * for the combo box. padding allows you to specify addition insets in - * addition to those specified by the cell renderer. + * If specified, these insets act as padding around the cell renderer when + * laying out and painting the "selected" item in the combo box. These + * insets add to those specified by the cell renderer. + * + * @since 1.7 */ - private Insets padding; + protected Insets padding; // Used for calculating the default size. private static ListCellRenderer getDefaultListCellRenderer() { @@ -345,7 +345,7 @@ } /** - * Create and install the listeners for the combo box and its model. + * Creates and installs listeners for the combo box and its model. * This method is called when the UI is installed. */ protected void installListeners() { @@ -379,8 +379,8 @@ } /** - * Uninstalls the default colors, default font, default renderer, and default - * editor into the JComboBox. + * Uninstalls the default colors, default font, default renderer, + * and default editor from the combo box. */ protected void uninstallDefaults() { LookAndFeel.installColorsAndFont( comboBox, @@ -391,7 +391,7 @@ } /** - * Remove the installed listeners from the combo box and its model. + * Removes the installed listeners from the combo box and its model. * The number and types of listeners removed and in this method should be * the same that was added in installListeners */ @@ -839,7 +839,7 @@ } /** - * Creates an button which will be used as the control to show or hide + * Creates a button which will be used as the control to show or hide * the popup portion of the combo box. * * @return a button which represents the popup control @@ -1392,12 +1392,17 @@ } /** - * This has been refactored out in hopes that it may be investigated and - * simplified for the next major release. adding/removing - * the component to the currentValuePane and changing the font may be - * redundant operations. + * Returns the size a component would have if used as a cell renderer. + * + * @param comp a {@code Component} to check + * @return size of the component + * @since 1.7 */ - private Dimension getSizeForComponent(Component comp) { + protected Dimension getSizeForComponent(Component comp) { + // This has been refactored out in hopes that it may be investigated and + // simplified for the next major release. adding/removing + // the component to the currentValuePane and changing the font may be + // redundant operations. currentValuePane.add(comp); comp.setFont(comboBox.getFont()); Dimension d = comp.getPreferredSize(); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -141,11 +141,10 @@ } /** - * Paint the label text in the foreground color, if the label - * is opaque then paint the entire background with the background - * color. The Label text is drawn by paintEnabledText() or - * paintDisabledText(). The locations of the label parts are computed - * by layoutCL. + * Paints the label text with the foreground color, if the label is opaque + * then paints the entire background with the background color. The Label + * text is drawn by {@link #paintEnabledText} or {@link #paintDisabledText}. + * The locations of the label parts are computed by {@link #layoutCL}. * * @see #paintEnabledText * @see #paintDisabledText diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -685,7 +685,7 @@ /** - * Create and install the listeners for the JList, its model, and its + * Creates and installs the listeners for the JList, its model, and its * selectionModel. This method is called at installUI() time. * * @see #installUI @@ -728,7 +728,7 @@ /** - * Remove the listeners for the JList, its model, and its + * Removes the listeners from the JList, its model, and its * selectionModel. All of the listener fields, are reset to * null here. This method is called at uninstallUI() time, * it should be kept in sync with installListeners. @@ -764,8 +764,8 @@ /** - * Initialize JList properties, e.g. font, foreground, and background, - * and add the CellRendererPane. The font, foreground, and background + * Initializes list properties such as font, foreground, and background, + * and adds the CellRendererPane. The font, foreground, and background * properties are only set if their current value is either null * or a UIResource, other properties are set if the current * value is null. @@ -820,9 +820,9 @@ /** - * Set the JList properties that haven't been explicitly overridden to - * null. A property is considered overridden if its current value - * is not a UIResource. + * Sets the list properties that have not been explicitly overridden to + * {@code null}. A property is considered overridden if its current value + * is not a {@code UIResource}. * * @see #installDefaults * @see #uninstallUI diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuItemUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -32,7 +32,6 @@ import javax.swing.*; import javax.swing.event.*; -import javax.swing.border.*; import javax.swing.plaf.*; import javax.swing.text.View; @@ -54,7 +53,12 @@ protected Color disabledForeground; protected Color acceleratorForeground; protected Color acceleratorSelectionForeground; - private String acceleratorDelimiter; + + /** + * Accelerator delimiter string, such as {@code '+'} in {@code 'Ctrl+C'}. + * @since 1.7 + */ + protected String acceleratorDelimiter; protected int defaultTextIconGap; protected Font acceleratorFont; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -93,10 +93,13 @@ * scrollbar. */ private boolean supportsAbsolutePositioning; - /** Hint as to what width (when vertical) or height (when horizontal) + /** + * Hint as to what width (when vertical) or height (when horizontal) * should be. + * + * @since 1.7 */ - private int scrollBarWidth; + protected int scrollBarWidth; private Handler handler; @@ -117,18 +120,18 @@ * number. If negative, then an overlap between the button and track will occur, * which is useful for shaped buttons. * - * TODO This should be made protected in a feature release + * @since 1.7 */ - private int incrGap; + protected int incrGap; /** * Distance between the decrement button and the track. This may be a negative * number. If negative, then an overlap between the button and track will occur, * which is useful for shaped buttons. * - * TODO This should be made protected in a feature release + * @since 1.7 */ - private int decrGap; + protected int decrGap; static void loadActionMap(LazyActionMap map) { map.put(new Actions(Actions.POSITIVE_UNIT_INCREMENT)); @@ -586,7 +589,7 @@ /** - * Return the smallest acceptable size for the thumb. If the scrollbar + * Returns the smallest acceptable size for the thumb. If the scrollbar * becomes so small that this size isn't available, the thumb will be * hidden. *

    @@ -601,7 +604,7 @@ } /** - * Return the largest acceptable size for the thumb. To create a fixed + * Returns the largest acceptable size for the thumb. To create a fixed * size thumb one make this method and getMinimumThumbSize * return the same value. *

    diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -1409,9 +1409,10 @@ } /** - * Returns a value give a y position. If yPos is past the track at the top or the - * bottom it will set the value to the min or max of the slider, depending if the - * slider is inverted or not. + * Returns the value at the y position. If {@code yPos} is beyond the + * track at the the bottom or the top, this method sets the value to either + * the minimum or maximum value of the slider, depending on if the slider + * is inverted or not. */ public int valueForYPosition( int yPos ) { int value; @@ -1440,9 +1441,10 @@ } /** - * Returns a value give an x position. If xPos is past the track at the left or the - * right it will set the value to the min or max of the slider, depending if the - * slider is inverted or not. + * Returns the value at the x position. If {@code xPos} is beyond the + * track at the left or the right, this method sets the value to either the + * minimum or maximum value of the slider, depending on if the slider is + * inverted or not. */ public int valueForXPosition( int xPos ) { int value; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSpinnerUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -268,7 +268,7 @@ } /** - * Create a LayoutManager that manages the editor, + * Creates a LayoutManager that manages the editor, * nextButton, and previousButton * children of the JSpinner. These three children must be * added with a constraint that identifies their role: @@ -286,7 +286,7 @@ /** - * Create a PropertyChangeListener that can be + * Creates a PropertyChangeListener that can be * added to the JSpinner itself. Typically, this listener * will call replaceEditor when the "editor" property changes, * since it's the SpinnerUI's responsibility to @@ -302,16 +302,13 @@ /** - * Create a component that will replace the spinner models value - * with the object returned by spinner.getPreviousValue. - * By default the previousButton is a JButton. This - * method invokes installPreviousButtonListeners to - * install the necessary listeners to update the JSpinner's - * model in response to a user gesture. If a previousButton isn't needed - * (in a subclass) then override this method to return null. + * Creates a decrement button, i.e. component that replaces the spinner + * value with the object returned by spinner.getPreviousValue. + * By default the previousButton is a {@code JButton}. If the + * decrement button is not needed this method should return {@code null}. * - * @return a component that will replace the spinners model with the - * next value in the sequence, or null + * @return a component that will replace the spinner's value with the + * previous value in the sequence, or {@code null} * @see #installUI * @see #createNextButton * @see #installPreviousButtonListeners @@ -325,15 +322,13 @@ /** - * Create a component that will replace the spinner models value - * with the object returned by spinner.getNextValue. - * By default the nextButton is a JButton - * who's ActionListener updates it's JSpinner - * ancestors model. If a nextButton isn't needed (in a subclass) - * then override this method to return null. + * Creates an increment button, i.e. component that replaces the spinner + * value with the object returned by spinner.getNextValue. + * By default the nextButton is a {@code JButton}. If the + * increment button is not needed this method should return {@code null}. * - * @return a component that will replace the spinners model with the - * next value in the sequence, or null + * @return a component that will replace the spinner's value with the + * next value in the sequence, or {@code null} * @see #installUI * @see #createPreviousButton * @see #installNextButtonListeners diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -829,7 +829,7 @@ /** * Returns the default non continuous layout divider, which is an - * instanceof Canvas that fills the background in dark gray. + * instance of {@code Canvas} that fills in the background with dark gray. */ protected Component createDefaultNonContinuousLayoutDivider() { return new Canvas() { @@ -1041,11 +1041,11 @@ /** - * Messaged after the JSplitPane the receiver is providing the look - * and feel for paints its children. + * Called when the specified split pane has finished painting + * its children. */ - public void finishedPaintingChildren(JSplitPane jc, Graphics g) { - if(jc == splitPane && getLastDragLocation() != -1 && + public void finishedPaintingChildren(JSplitPane sp, Graphics g) { + if(sp == splitPane && getLastDragLocation() != -1 && !isContinuousLayout() && !draggingHW) { Dimension size = splitPane.getSize(); @@ -1062,7 +1062,7 @@ /** - * Messaged to paint the look and feel. + * @inheritDoc */ public void paint(Graphics g, JComponent jc) { if (!painted && splitPane.getDividerLocation()<0) { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -306,7 +306,7 @@ } /** - * Initialize JTableHeader properties, e.g. font, foreground, and background. + * Initializes JTableHeader properties such as font, foreground, and background. * The font, foreground, and background properties are only set if their * current value is either null or a UIResource, other properties are set * if the current value is null. @@ -403,9 +403,9 @@ } /** - * This method gets called every time the rollover column in the table - * header is updated. Every look and feel supporting rollover effect - * in table header should override this method and repaint the header. + * This method gets called every time when a rollover column in the table + * header is updated. Every look and feel that supports a rollover effect + * in a table header should override this method and repaint the header. * * @param oldColumn the index of the previous rollover column or -1 if the * mouse was not over a column @@ -736,7 +736,6 @@ } private Dimension createHeaderSize(long width) { - TableColumnModel columnModel = header.getColumnModel(); // None of the callers include the intercell spacing, do it here. if (width > Integer.MAX_VALUE) { width = Integer.MAX_VALUE; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -37,6 +37,7 @@ import javax.swing.event.*; import javax.swing.border.Border; import javax.swing.plaf.UIResource; +import javax.swing.plaf.synth.SynthUI; import sun.swing.DefaultLookup; import sun.awt.AppContext; import javax.swing.plaf.basic.DragRecognitionSupport.BeforeDrag; @@ -221,8 +222,7 @@ // is ==, which is the case for the windows look and feel. // Until an appropriate solution is found, the code is being // reverted to what it was before the original fix. - if (this instanceof sun.swing.plaf.synth.SynthUI || - (c instanceof JTextArea)) { + if (this instanceof SynthUI || (c instanceof JTextArea)) { return; } Color background = c.getBackground(); @@ -289,7 +289,7 @@ protected abstract String getPropertyPrefix(); /** - * Initializes component properties, e.g. font, foreground, + * Initializes component properties, such as font, foreground, * background, caret color, selection color, selected text color, * disabled text color, and border color. The font, foreground, and * background properties are only set if their current value is either null @@ -377,9 +377,9 @@ } /** - * Sets the component properties that haven't been explicitly overridden to - * null. A property is considered overridden if its current value - * is not a UIResource. + * Sets the component properties that have not been explicitly overridden + * to {@code null}. A property is considered overridden if its current + * value is not a {@code UIResource}. * * @see #installDefaults * @see #uninstallUI @@ -756,18 +756,18 @@ * things. *

      *
    1. - * Set the associated component to opaque (can be changed + * Sets the associated component to opaque (can be changed * easily by a subclass or on JTextComponent directly), * which is the most common case. This will cause the * component's background color to be painted. *
    2. - * Install the default caret and highlighter into the + * Installs the default caret and highlighter into the * associated component. *
    3. - * Attach to the editor and model. If there is no + * Attaches to the editor and model. If there is no * model, a default one is created. *
    4. - * create the view factory and the view hierarchy used + * Creates the view factory and the view hierarchy used * to represent the model. *
    * @@ -784,7 +784,7 @@ // This is a workaround as these should not override what synth has // set them to - if (!(this instanceof sun.swing.plaf.synth.SynthUI)){ + if (! (this instanceof SynthUI)) { // common case is background painted... this can // easily be changed by subclasses or from outside // of the component. @@ -857,9 +857,9 @@ * To prevent this from happening twice, this method is * reimplemented to simply paint. *

    - * NOTE: Superclass is also not thread-safe in - * it's rendering of the background, although that's not - * an issue with the default rendering. + * NOTE: NOTE: Superclass is also not thread-safe in its + * rendering of the background, although that is not an issue with the + * default rendering. */ public void update(Graphics g, JComponent c) { paint(g, c); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -669,7 +669,7 @@ /** * Sets the border of the component to have a rollover border which - * was created by createRolloverBorder. + * was created by the {@link #createRolloverBorder} method. * * @param c component which will have a rollover border installed * @see #createRolloverBorder @@ -709,7 +709,7 @@ /** * Sets the border of the component to have a non-rollover border which - * was created by createNonRolloverBorder. + * was created by the {@link #createNonRolloverBorder} method. * * @param c component which will have a non-rollover border installed * @see #createNonRolloverBorder diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -30,16 +30,12 @@ import java.awt.*; import java.awt.event.*; import java.awt.datatransfer.*; -import java.awt.dnd.*; import java.beans.*; -import java.io.*; import java.util.Enumeration; import java.util.Hashtable; -import java.util.TooManyListenersException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import javax.swing.plaf.ActionMapUIResource; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.TreeUI; @@ -1244,11 +1240,26 @@ drawingCache.clear(); } - private boolean isDropLine(JTree.DropLocation loc) { + /** + * Tells if a {@code DropLocation} should be indicated by a line between + * nodes. This is meant for {@code javax.swing.DropMode.INSERT} and + * {@code javax.swing.DropMode.ON_OR_INSERT} drop modes. + * + * @param loc a {@code DropLocation} + * @return {@code true} if the drop location should be shown as a line + * @since 1.7 + */ + protected boolean isDropLine(JTree.DropLocation loc) { return loc != null && loc.getPath() != null && loc.getChildIndex() != -1; } - private void paintDropLine(Graphics g) { + /** + * Paints the drop line. + * + * @param g {@code Graphics} object to draw on + * @since 1.7 + */ + protected void paintDropLine(Graphics g) { JTree.DropLocation loc = tree.getDropLocation(); if (!isDropLine(loc)) { return; @@ -1262,7 +1273,14 @@ } } - private Rectangle getDropLineRect(JTree.DropLocation loc) { + /** + * Returns a ubounding box for the drop line. + * + * @param loc a {@code DropLocation} + * @return bounding box for the drop line + * @since 1.7 + */ + protected Rectangle getDropLineRect(JTree.DropLocation loc) { Rectangle rect; TreePath path = loc.getPath(); int index = loc.getChildIndex(); @@ -1684,7 +1702,7 @@ treeState.setExpandedState(path, true); } } - updateLeadRow(); + updateLeadSelectionRow(); updateSize(); } } @@ -2425,11 +2443,21 @@ return tree.getLeadSelectionPath(); } - private void updateLeadRow() { + /** + * Updates the lead row of the selection. + * @since 1.7 + */ + protected void updateLeadSelectionRow() { leadRow = getRowForPath(tree, getLeadSelectionPath()); } - private int getLeadSelectionRow() { + /** + * Returns the lead row of the selection. + * + * @return selection lead row + * @since 1.7 + */ + protected int getLeadSelectionRow() { return leadRow; } @@ -3345,7 +3373,7 @@ if (changeName == JTree.LEAD_SELECTION_PATH_PROPERTY) { if (!ignoreLAChange) { - updateLeadRow(); + updateLeadSelectionRow(); repaintPath((TreePath)event.getOldValue()); repaintPath((TreePath)event.getNewValue()); } @@ -3763,7 +3791,7 @@ completeEditing(); if(path != null && tree.isVisible(path)) { treeState.setExpandedState(path, false); - updateLeadRow(); + updateLeadSelectionRow(); updateSize(); } } @@ -3823,7 +3851,7 @@ if(treeState != null && e != null) { treeState.treeNodesInserted(e); - updateLeadRow(); + updateLeadSelectionRow(); TreePath path = e.getTreePath(); @@ -3848,7 +3876,7 @@ if(treeState != null && e != null) { treeState.treeNodesRemoved(e); - updateLeadRow(); + updateLeadSelectionRow(); TreePath path = e.getTreePath(); @@ -3862,7 +3890,7 @@ if(treeState != null && e != null) { treeState.treeStructureChanged(e); - updateLeadRow(); + updateLeadSelectionRow(); TreePath pPath = e.getTreePath(); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java Wed Jul 05 17:04:26 2017 +0200 @@ -34,7 +34,7 @@ /** * The default layout manager for Popup menus and menubars. This * class is an extension of BoxLayout which adds the UIResource tag - * so that plauggable L&Fs can distinguish it from user-installed + * so that pluggable L&Fs can distinguish it from user-installed * layout managers on menus. * * @author Georges Saab diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java --- a/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java Wed Jul 05 17:04:26 2017 +0200 @@ -257,13 +257,41 @@ /** * @inheritDoc - * @return true + * @return {@code true} */ @Override public boolean shouldUpdateStyleOnAncestorChanged() { return true; } /** + * @inheritDoc + * + *

    Overridden to return {@code true} when one of the following + * properties change: + *

      + *
    • {@code "Nimbus.Overrides"} + *
    • {@code "Nimbus.Overrides.InheritDefaults"} + *
    • {@code "JComponent.sizeVariant"} + *
    + * + * @since 1.7 + */ + @Override + protected boolean shouldUpdateStyleOnEvent(PropertyChangeEvent ev) { + String eName = ev.getPropertyName(); + + // Always update when overrides or size variant change + if ("Nimbus.Overrides" == eName || + "Nimbus.Overrides.InheritDefaults" == eName || + "JComponent.sizeVariant" == eName) { + + return true; + } + + return super.shouldUpdateStyleOnEvent(ev); + } + + /** *

    Registers a third party component with the NimbusLookAndFeel.

    * *

    Regions represent Components and areas within Components that act as diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/nimbus/package.html --- a/jdk/src/share/classes/javax/swing/plaf/nimbus/package.html Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/package.html Wed Jul 05 17:04:26 2017 +0200 @@ -88,12 +88,11 @@

    Note: Most of the Swing API is not thread safe. For details, see -Threads and Swing, +Concurrency in Swing, a section in The Java Tutorial. + target="_top">The Java Tutorial. @since 1.7 @serial exclude diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/DefaultMenuLayout.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/DefaultMenuLayout.java Wed Dec 16 23:39:39 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * Copyright 2002-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 javax.swing.plaf.synth; - -import javax.swing.*; -import javax.swing.plaf.UIResource; - -import java.awt.Container; -import java.awt.Dimension; - -/** - * The default layout manager for Popup menus and menubars. This - * class is an extension of BoxLayout which adds the UIResource tag - * so that plauggable L&Fs can distinguish it from user-installed - * layout managers on menus. - * - * Derived from javax.swing.plaf.basic.DefaultMenuLayout - * - * @author Georges Saab - */ - -class DefaultMenuLayout extends BoxLayout implements UIResource { - public DefaultMenuLayout(Container target, int axis) { - super(target, axis); - } - - public Dimension preferredLayoutSize(Container target) { - if (target instanceof JPopupMenu) { - JPopupMenu popupMenu = (JPopupMenu) target; - - popupMenu.putClientProperty( - SynthMenuItemLayoutHelper.MAX_ACC_OR_ARROW_WIDTH, null); - sun.swing.MenuItemLayoutHelper.clearUsedClientProperties(popupMenu); - - if (popupMenu.getComponentCount() == 0) { - return new Dimension(0, 0); - } - } - - // Make BoxLayout recalculate cached preferred sizes - super.invalidateLayout(target); - - return super.preferredLayoutSize(target); - } -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthBorder.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthBorder.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthBorder.java Wed Jul 05 17:04:26 2017 +0200 @@ -29,7 +29,6 @@ import javax.swing.text.JTextComponent; import javax.swing.border.*; import javax.swing.plaf.UIResource; -import sun.swing.plaf.synth.SynthUI; /** * SynthBorder is a border that delegates to a Painter. The Insets diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -25,40 +25,49 @@ package javax.swing.plaf.synth; +import javax.swing.*; import java.awt.*; -import java.awt.event.*; -import java.io.Serializable; -import javax.swing.*; -import javax.swing.border.*; -import java.awt.*; -import java.awt.event.*; import java.beans.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicButtonUI; import javax.swing.plaf.basic.BasicHTML; import javax.swing.text.View; -import sun.swing.plaf.synth.SynthUI; -import sun.swing.plaf.synth.DefaultSynthStyle; /** - * Synth's ButtonUI implementation. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JButton}. * * @author Scott Violet + * @since 1.7 */ -class SynthButtonUI extends BasicButtonUI implements +public class SynthButtonUI extends BasicButtonUI implements PropertyChangeListener, SynthUI { private SynthStyle style; + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthButtonUI(); } + /** + * @inheritDoc + */ + @Override protected void installDefaults(AbstractButton b) { updateStyle(b); LookAndFeel.installProperty(b, "rolloverEnabled", Boolean.TRUE); } + /** + * @inheritDoc + */ + @Override protected void installListeners(AbstractButton b) { super.installListeners(b); b.addPropertyChangeListener(this); @@ -99,11 +108,19 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners(AbstractButton b) { super.uninstallListeners(b); b.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults(AbstractButton b) { SynthContext context = getContext(b, ENABLED); @@ -112,20 +129,20 @@ style = null; } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } SynthContext getContext(JComponent c, int state) { - Region region = getRegion(c); + Region region = SynthLookAndFeel.getRegion(c); return SynthContext.getContext(SynthContext.class, c, region, style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - /** * Returns the current state of the passed in AbstractButton. */ @@ -164,6 +181,10 @@ return state; } + /** + * @inheritDoc + */ + @Override public int getBaseline(JComponent c, int width, int height) { if (c == null) { throw new NullPointerException("Component must be non-null"); @@ -215,6 +236,10 @@ // Paint Methods // ******************************** + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -224,6 +249,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -231,6 +260,12 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { AbstractButton b = (AbstractButton)context.getComponent(); @@ -253,19 +288,22 @@ } } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintButtonBorder(context, g, x, y, w, h); } /** - * Returns the default icon. This should NOT callback + * Returns the default icon. This should not callback * to the JComponent. * - * @param b AbstractButton the icon is associated with + * @param b button the icon is associated with * @return default icon */ - protected Icon getDefaultIcon(AbstractButton b) { SynthContext context = getContext(b); Icon icon = context.getStyle().getIcon(context, getPropertyPrefix() + "icon"); @@ -274,7 +312,11 @@ } /** - * Returns the Icon to use in painting the button. + * Returns the Icon to use for painting the button. The icon is chosen with + * respect to the current state of the button. + * + * @param b button the icon is associated with + * @return an icon */ protected Icon getIcon(AbstractButton b) { Icon icon = b.getIcon(); @@ -374,7 +416,7 @@ /** * Returns the amount to shift the text/icon when painting. */ - protected int getTextShiftOffset(SynthContext state) { + private int getTextShiftOffset(SynthContext state) { AbstractButton button = (AbstractButton)state.getComponent(); ButtonModel model = button.getModel(); @@ -389,6 +431,11 @@ // ******************************** // Layout Methods // ******************************** + + /** + * @inheritDoc + */ + @Override public Dimension getMinimumSize(JComponent c) { if (c.getComponentCount() > 0 && c.getLayout() != null) { return null; @@ -406,6 +453,10 @@ return size; } + /** + * @inheritDoc + */ + @Override public Dimension getPreferredSize(JComponent c) { if (c.getComponentCount() > 0 && c.getLayout() != null) { return null; @@ -423,6 +474,10 @@ return size; } + /** + * @inheritDoc + */ + @Override public Dimension getMaximumSize(JComponent c) { if (c.getComponentCount() > 0 && c.getLayout() != null) { return null; @@ -442,7 +497,8 @@ } /** - * Returns the Icon used in calculating the pref/min/max size. + * Returns the Icon used in calculating the + * preferred/minimum/maximum size. */ protected Icon getSizingIcon(AbstractButton b) { Icon icon = getEnabledIcon(b, b.getIcon()); @@ -452,6 +508,10 @@ return icon; } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((AbstractButton)e.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -27,56 +27,50 @@ import java.awt.*; -import java.awt.event.*; import javax.swing.*; import javax.swing.plaf.*; -import javax.swing.border.*; -import java.io.Serializable; /** - * Synth's CheckBoxMenuItemUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JCheckBoxMenuItem}. * * @author Leif Samuelsson * @author Georges Saab * @author David Karlton * @author Arnaud Weber + * @since 1.7 */ -class SynthCheckBoxMenuItemUI extends SynthMenuItemUI { +public class SynthCheckBoxMenuItemUI extends SynthMenuItemUI { + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthCheckBoxMenuItemUI(); } + /** + * @inheritDoc + */ + @Override protected String getPropertyPrefix() { return "CheckBoxMenuItem"; } - public void processMouseEvent(JMenuItem item, MouseEvent e, - MenuElement path[], MenuSelectionManager manager) { - Point p = e.getPoint(); - if (p.x >= 0 && p.x < item.getWidth() && p.y >= 0 && p.y < item.getHeight()) { - if (e.getID() == MouseEvent.MOUSE_RELEASED) { - manager.clearSelectedPath(); - item.doClick(0); - } else { - manager.setSelectedPath(path); - } - } else if (item.getModel().isArmed()) { - int c = path.length - 1; - MenuElement newPath[] = new MenuElement[c]; - for (int i = 0; i < c; i++) { - newPath[i] = path[i]; - } - manager.setSelectedPath(newPath); - } - } - + @Override void paintBackground(SynthContext context, Graphics g, JComponent c) { context.getPainter().paintCheckBoxMenuItemBackground(context, g, 0, 0, c.getWidth(), c.getHeight()); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintCheckBoxMenuItemBorder(context, g, x, y, w, h); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -25,36 +25,51 @@ package javax.swing.plaf.synth; -import javax.swing.*; -import java.awt.*; -import java.awt.event.*; -import javax.swing.plaf.*; -import java.io.Serializable; +import javax.swing.JComponent; +import java.awt.Graphics; +import javax.swing.plaf.ComponentUI; /** - * Synth's CheckBoxUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JCheckBox}. * * @author Jeff Dinkins + * @since 1.7 */ -class SynthCheckBoxUI extends SynthRadioButtonUI { +public class SynthCheckBoxUI extends SynthRadioButtonUI { // ******************************** // Create PLAF // ******************************** + /** + * Creates a new UI object for the given component. + * + * @param b component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent b) { return new SynthCheckBoxUI(); } + /** + * @inheritDoc + */ + @Override protected String getPropertyPrefix() { return "CheckBox."; } + @Override void paintBackground(SynthContext context, Graphics g, JComponent c) { context.getPainter().paintCheckBoxBackground(context, g, 0, 0, c.getWidth(), c.getHeight()); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintCheckBoxBorder(context, g, x, y, w, h); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -28,34 +28,39 @@ import javax.swing.*; import javax.swing.colorchooser.*; -import javax.swing.event.*; -import javax.swing.border.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicColorChooserUI; -import java.util.*; import java.awt.*; -import java.awt.image.*; -import java.awt.event.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.io.Serializable; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's ColorChooserUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JColorChooser}. * * @author Tom Santos * @author Steve Wilson + * @since 1.7 */ -class SynthColorChooserUI extends BasicColorChooserUI implements +public class SynthColorChooserUI extends BasicColorChooserUI implements PropertyChangeListener, SynthUI { private SynthStyle style; + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthColorChooserUI(); } + /** + * @inheritDoc + */ + @Override protected AbstractColorChooserPanel[] createDefaultChoosers() { SynthContext context = getContext(chooser, ENABLED); AbstractColorChooserPanel[] panels = (AbstractColorChooserPanel[]) @@ -68,6 +73,10 @@ return panels; } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { super.installDefaults(); updateStyle(chooser); @@ -79,6 +88,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(chooser, ENABLED); @@ -88,16 +101,28 @@ super.uninstallDefaults(); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); chooser.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { chooser.removePropertyChangeListener(this); super.uninstallListeners(); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -107,14 +132,14 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -125,6 +150,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -132,14 +161,29 @@ context.dispose(); } + /** + * Paints the specified component. + * This implementation does not perform any actions. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintColorChooserBorder(context, g, x, y,w,h); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JColorChooser)e.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -27,21 +27,21 @@ import java.awt.*; import java.awt.event.*; -import java.lang.reflect.*; import javax.swing.*; import javax.swing.plaf.*; import javax.swing.event.*; import javax.swing.plaf.basic.*; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's ComboBoxUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JComboBox}. * * @author Scott Violet + * @since 1.7 */ -class SynthComboBoxUI extends BasicComboBoxUI implements +public class SynthComboBoxUI extends BasicComboBoxUI implements PropertyChangeListener, SynthUI { private SynthStyle style; private boolean useListColors; @@ -93,12 +93,11 @@ private boolean forceOpaque = false; /** - * NOTE: This serves the same purpose as the same field in BasicComboBoxUI. - * It is here because I could not give the padding field in - * BasicComboBoxUI protected access in an update release. + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object */ - private Insets padding; - public static ComponentUI createUI(JComponent c) { return new SynthComboBoxUI(); } @@ -118,21 +117,6 @@ @Override protected void installDefaults() { - //NOTE: This next line of code was added because, since squareButton in - //BasicComboBoxUI is private, I need to have some way of reading it from UIManager. - //This is an incomplete solution (since it implies that squareButons, - //once set, cannot be reset per state. Probably ok, but not always ok). - //This line of code should be removed at the same time that squareButton - //is made protected in the super class. - super.installDefaults(); - - //This is here instead of in updateStyle because the value for padding - //needs to remain consistent with the value for padding in - //BasicComboBoxUI. I wouldn't have this value here at all if not - //for the fact that I cannot make "padding" protected in any way - //for an update release. This *should* be fixed in Java 7 - padding = UIManager.getInsets("ComboBox.padding"); - updateStyle(comboBox); } @@ -142,6 +126,7 @@ style = SynthLookAndFeel.updateStyle(context, this); if (style != oldStyle) { + padding = (Insets) style.get(context, "ComboBox.padding"); popupInsets = (Insets)style.get(context, "ComboBox.popupInsets"); useListColors = style.getBoolean(context, "ComboBox.rendererUseListColors", true); @@ -149,6 +134,8 @@ "ComboBox.buttonWhenNotEditable", false); pressedWhenPopupVisible = style.getBoolean(context, "ComboBox.pressedWhenPopupVisible", false); + squareButton = style.getBoolean(context, + "ComboBox.squareButton", true); if (oldStyle != null) { uninstallKeyboardActions(); @@ -164,6 +151,9 @@ } } + /** + * @inheritDoc + */ @Override protected void installListeners() { comboBox.addPropertyChangeListener(this); @@ -172,6 +162,9 @@ super.installListeners(); } + /** + * @inheritDoc + */ @Override public void uninstallUI(JComponent c) { if (popup instanceof SynthComboPopup) { @@ -181,6 +174,9 @@ buttonHandler = null; } + /** + * @inheritDoc + */ @Override protected void uninstallDefaults() { SynthContext context = getContext(comboBox, ENABLED); @@ -190,6 +186,9 @@ style = null; } + /** + * @inheritDoc + */ @Override protected void uninstallListeners() { editorFocusHandler.unregister(); @@ -200,6 +199,9 @@ super.uninstallListeners(); } + /** + * @inheritDoc + */ @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); @@ -210,10 +212,6 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { // currently we have a broken situation where if a developer // takes the border from a JComboBox and sets it on a JTextField @@ -252,6 +250,9 @@ } } + /** + * @inheritDoc + */ @Override protected ComboPopup createPopup() { SynthComboPopup p = new SynthComboPopup(comboBox); @@ -259,11 +260,17 @@ return p; } + /** + * @inheritDoc + */ @Override protected ListCellRenderer createRenderer() { return new SynthComboBoxRenderer(); } + /** + * @inheritDoc + */ @Override protected ComboBoxEditor createEditor() { return new SynthComboBoxEditor(); @@ -273,6 +280,9 @@ // end UI Initialization //====================== + /** + * @inheritDoc + */ @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { @@ -280,6 +290,9 @@ } } + /** + * @inheritDoc + */ @Override protected JButton createArrowButton() { SynthArrowButton button = new SynthArrowButton(SwingConstants.SOUTH); @@ -291,6 +304,9 @@ //================================= // begin ComponentUI Implementation + /** + * @inheritDoc + */ @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -302,6 +318,9 @@ context.dispose(); } + /** + * @inheritDoc + */ @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -310,6 +329,12 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { hasFocus = comboBox.hasFocus(); if ( !comboBox.isEditable() ) { @@ -318,6 +343,9 @@ } } + /** + * @inheritDoc + */ @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { @@ -375,7 +403,7 @@ } /** - * Return the default size of an empty display area of the combo box using + * Returns the default size of an empty display area of the combo box using * the current renderer and font. * * This method was overridden to use SynthComboBoxRenderer instead of @@ -394,23 +422,6 @@ } /** - * This has been refactored out in hopes that it may be investigated and - * simplified for the next major release. adding/removing - * the component to the currentValuePane and changing the font may be - * redundant operations. - * - * NOTE: This method was copied in its entirety from BasicComboBoxUI. Might - * want to make it protected in BasicComboBoxUI in Java 7 - */ - private Dimension getSizeForComponent(Component comp) { - currentValuePane.add(comp); - comp.setFont(comboBox.getFont()); - Dimension d = comp.getPreferredSize(); - currentValuePane.remove(comp); - return d; - } - - /** * From BasicComboBoxRenderer v 1.18. * * Be aware that SynthFileChooserUIImpl relies on the fact that the default @@ -478,85 +489,17 @@ } - /** - * From BasicCombBoxEditor v 1.24. - */ - private static class SynthComboBoxEditor implements - ComboBoxEditor, UIResource { - protected JTextField editor; - private Object oldValue; - - public SynthComboBoxEditor() { - editor = new JTextField("",9); - editor.setName("ComboBox.textField"); - } - - @Override - public Component getEditorComponent() { - return editor; - } - - /** - * Sets the item that should be edited. - * - * @param anObject the displayed value of the editor - */ - @Override - public void setItem(Object anObject) { - String text; + private static class SynthComboBoxEditor + extends BasicComboBoxEditor.UIResource { - if ( anObject != null ) { - text = anObject.toString(); - oldValue = anObject; - } else { - text = ""; - } - // workaround for 4530952 - if (!text.equals(editor.getText())) { - editor.setText(text); - } - } - - @Override - public Object getItem() { - Object newValue = editor.getText(); - - if (oldValue != null && !(oldValue instanceof String)) { - // The original value is not a string. Should return the value in it's - // original type. - if (newValue.equals(oldValue.toString())) { - return oldValue; - } else { - // Must take the value from the editor and get the value and cast it to the new type. - Class cls = oldValue.getClass(); - try { - Method method = cls.getMethod("valueOf", new Class[]{String.class}); - newValue = method.invoke(oldValue, new Object[] { editor.getText()}); - } catch (Exception ex) { - // Fail silently and return the newValue (a String object) - } - } - } - return newValue; - } - - @Override - public void selectAll() { - editor.selectAll(); - editor.requestFocus(); - } - - @Override - public void addActionListener(ActionListener l) { - editor.addActionListener(l); - } - - @Override - public void removeActionListener(ActionListener l) { - editor.removeActionListener(l); + @Override public JTextField createEditorComponent() { + JTextField f = new JTextField("", 9); + f.setName("ComboBox.textField"); + return f; } } + /** * Handles all the logic for treating the combo as a button when it is * not editable, and when shouldActLikeButton() is true. This class is a @@ -620,7 +563,7 @@ //------------------------------------------------------------------ /** - * {@inheritDoc} + * @inheritDoc * * Ensures that isPressed() will return true if the combo is pressed, * or the arrowButton is pressed, or if the combo popup is @@ -634,7 +577,7 @@ } /** - * {@inheritDoc} + * @inheritDoc * * Ensures that the armed state is in sync with the pressed state * if shouldActLikeButton is true. Without this method, the arrow @@ -649,7 +592,7 @@ } /** - * {@inheritDoc} + * @inheritDoc * * Ensures that isRollover() will return true if the combo is * rolled over, or the arrowButton is rolled over. @@ -660,7 +603,7 @@ } /** - * {@inheritDoc} + * @inheritDoc * * Forwards pressed states to the internal "pressed" field */ @@ -671,7 +614,7 @@ } /** - * {@inheritDoc} + * @inheritDoc * * Forwards rollover states to the internal "over" field */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthDefaultLookup.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDefaultLookup.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDefaultLookup.java Wed Jul 05 17:04:26 2017 +0200 @@ -27,7 +27,6 @@ import sun.swing.DefaultLookup; import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; -import sun.swing.plaf.synth.SynthUI; /** * SynthDefaultLookup redirects all lookup calls to the SynthContext. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -28,36 +28,44 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; -import javax.swing.event.*; -import javax.swing.border.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicDesktopIconUI; import java.beans.*; -import java.io.Serializable; -import sun.swing.plaf.synth.SynthUI; /** - * Synth L&F for a minimized window on a desktop. + * Provides the Synth L&F UI delegate for a minimized internal frame on a desktop. * * @author Joshua Outwater + * @since 1.7 */ -class SynthDesktopIconUI extends BasicDesktopIconUI implements SynthUI, - ActionListener, PropertyChangeListener { +public class SynthDesktopIconUI extends BasicDesktopIconUI + implements SynthUI, PropertyChangeListener { private SynthStyle style; + private Handler handler = new Handler(); + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthDesktopIconUI(); } + /** + * @inheritDoc + */ + @Override protected void installComponents() { if (UIManager.getBoolean("InternalFrame.useTaskBar")) { iconPane = new JToggleButton(frame.getTitle(), frame.getFrameIcon()) { - public String getToolTipText() { + @Override public String getToolTipText() { return getText(); } - public JPopupMenu getComponentPopupMenu() { + @Override public JPopupMenu getComponentPopupMenu() { return frame.getComponentPopupMenu(); } }; @@ -73,24 +81,37 @@ desktopIcon.add(iconPane, BorderLayout.CENTER); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); desktopIcon.addPropertyChangeListener(this); if (iconPane instanceof JToggleButton) { frame.addPropertyChangeListener(this); - ((JToggleButton)iconPane).addActionListener(this); + ((JToggleButton)iconPane).addActionListener(handler); } } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { if (iconPane instanceof JToggleButton) { + ((JToggleButton)iconPane).removeActionListener(handler); frame.removePropertyChangeListener(this); } desktopIcon.removePropertyChangeListener(this); super.uninstallListeners(); } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { updateStyle(desktopIcon); } @@ -101,6 +122,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(desktopIcon, ENABLED); style.uninstallDefaults(context); @@ -108,12 +133,16 @@ style = null; } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { - Region region = getRegion(c); + Region region = SynthLookAndFeel.getRegion(c); return SynthContext.getContext(SynthContext.class, c, region, style, state); } @@ -122,10 +151,10 @@ return SynthLookAndFeel.getComponentState(c); } - Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -136,6 +165,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -143,33 +176,24 @@ context.dispose(); } + /** + * Paints the specified component. This implementation does nothing. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintDesktopIconBorder(context, g, x, y, w, h); } - public void actionPerformed(ActionEvent evt) { - if (evt.getSource() instanceof JToggleButton) { - // Either iconify the frame or deiconify and activate it. - JToggleButton button = (JToggleButton)evt.getSource(); - try { - boolean selected = button.isSelected(); - if (!selected && !frame.isIconifiable()) { - button.setSelected(true); - } else { - frame.setIcon(!selected); - if (selected) { - frame.setSelected(true); - } - } - } catch (PropertyVetoException e2) { - } - } - } - public void propertyChange(PropertyChangeEvent evt) { if (evt.getSource() instanceof JInternalFrame.JDesktopIcon) { if (SynthLookAndFeel.shouldUpdateStyle(evt)) { @@ -191,4 +215,25 @@ } } } + + private final class Handler implements ActionListener { + public void actionPerformed(ActionEvent evt) { + if (evt.getSource() instanceof JToggleButton) { + // Either iconify the frame or deiconify and activate it. + JToggleButton button = (JToggleButton)evt.getSource(); + try { + boolean selected = button.isSelected(); + if (!selected && !frame.isIconifiable()) { + button.setSelected(true); + } else { + frame.setIcon(!selected); + if (selected) { + frame.setSelected(true); + } + } + } catch (PropertyVetoException e2) { + } + } + } + } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -29,34 +29,38 @@ import javax.swing.border.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicDesktopPaneUI; - import java.beans.*; - import java.awt.event.*; -import java.awt.Dimension; -import java.awt.Insets; -import java.awt.Graphics; -import java.awt.KeyboardFocusManager; import java.awt.*; -import java.util.Vector; -import sun.swing.plaf.synth.SynthUI; /** - * Synth L&F for a desktop. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JDesktopPane}. * * @author Joshua Outwater * @author Steve Wilson + * @since 1.7 */ -class SynthDesktopPaneUI extends BasicDesktopPaneUI implements +public class SynthDesktopPaneUI extends BasicDesktopPaneUI implements PropertyChangeListener, SynthUI { private SynthStyle style; private TaskBar taskBar; private DesktopManager oldDesktopManager; + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthDesktopPaneUI(); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); desktop.addPropertyChangeListener(this); @@ -68,6 +72,10 @@ } } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { updateStyle(desktop); @@ -114,6 +122,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { if (taskBar != null) { desktop.removeComponentListener(taskBar); @@ -123,6 +135,10 @@ super.uninstallListeners(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(desktop, ENABLED); @@ -147,6 +163,10 @@ } } + /** + * @inheritDoc + */ + @Override protected void installDesktopManager() { if (UIManager.getBoolean("InternalFrame.useTaskBar")) { desktopManager = oldDesktopManager = desktop.getDesktopManager(); @@ -159,6 +179,10 @@ } } + /** + * @inheritDoc + */ + @Override protected void uninstallDesktopManager() { if (oldDesktopManager != null && !(oldDesktopManager instanceof UIResource)) { desktopManager = desktop.getDesktopManager(); @@ -397,7 +421,10 @@ } } - + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -407,14 +434,14 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -425,6 +452,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -432,14 +463,28 @@ context.dispose(); } + /** + * Paints the specified component. This implementation does nothing. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintDesktopPaneBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent evt) { if (SynthLookAndFeel.shouldUpdateStyle(evt)) { updateStyle((JDesktopPane)evt.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -31,47 +31,52 @@ import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicEditorPaneUI; import java.beans.PropertyChangeEvent; -import sun.swing.plaf.synth.SynthUI; /** - * Provides the look and feel for a JEditorPane in the - * Synth look and feel. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JEditorPane}. * * @author Shannon Hickey + * @since 1.7 */ -class SynthEditorPaneUI extends BasicEditorPaneUI implements SynthUI { +public class SynthEditorPaneUI extends BasicEditorPaneUI implements SynthUI { private SynthStyle style; /* * I would prefer to use UIResource instad of this. * Unfortunately Boolean is a final class */ private Boolean localTrue = Boolean.TRUE; - private Boolean localFalse = Boolean.FALSE; /** - * Creates a UI for the JTextPane. + * Creates a new UI object for the given component. * - * @param c the JTextPane component - * @return the UI + * @param c component to create UI object for + * @return the UI object */ public static ComponentUI createUI(JComponent c) { return new SynthEditorPaneUI(); } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { // Installs the text cursor on the component super.installDefaults(); JComponent c = getComponent(); Object clientProperty = c.getClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES); - if (clientProperty == null - || clientProperty == localFalse) { - c.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, - localTrue); + if (clientProperty == null) { + c.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, localTrue); } updateStyle(getComponent()); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(getComponent(), ENABLED); JComponent c = getComponent(); @@ -84,7 +89,7 @@ Object clientProperty = c.getClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES); if (clientProperty == localTrue) { - getComponent().putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, + c.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.FALSE); } super.uninstallDefaults(); @@ -100,6 +105,7 @@ * * @param evt the property change event */ + @Override protected void propertyChange(PropertyChangeEvent evt) { if (SynthLookAndFeel.shouldUpdateStyle(evt)) { updateStyle((JTextComponent)evt.getSource()); @@ -124,6 +130,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -137,6 +147,10 @@ return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -146,10 +160,20 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { super.paint(g, getComponent()); } + /** + * @inheritDoc + */ + @Override protected void paintBackground(Graphics g) { // Overriden to do nothing, all our painting is done from update/paint. } @@ -159,6 +183,10 @@ c.getWidth(), c.getHeight()); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintEditorPaneBorder(context, g, x, y, w, h); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -24,16 +24,17 @@ */ package javax.swing.plaf.synth; -import java.awt.*; -import javax.swing.*; +import java.awt.Graphics; +import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; /** - * Provides the look and feel implementation for - * JFormattedTextField. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JFormattedTextField}. * + * @since 1.7 */ -class SynthFormattedTextFieldUI extends SynthTextFieldUI { +public class SynthFormattedTextFieldUI extends SynthTextFieldUI { /** * Creates a UI for a JFormattedTextField. * @@ -51,15 +52,24 @@ * * @return the name "FormattedTextField" */ + @Override protected String getPropertyPrefix() { return "FormattedTextField"; } + /** + * @inheritDoc + */ + @Override void paintBackground(SynthContext context, Graphics g, JComponent c) { context.getPainter().paintFormattedTextFieldBackground(context, g, 0, 0, c.getWidth(), c.getHeight()); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintFormattedTextFieldBorder(context, g, x, y, diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameTitlePane.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameTitlePane.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameTitlePane.java Wed Jul 05 17:04:26 2017 +0200 @@ -30,14 +30,9 @@ import javax.swing.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicInternalFrameTitlePane; -import javax.swing.border.*; -import javax.swing.event.InternalFrameEvent; -import java.util.EventListener; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; -import java.beans.VetoableChangeListener; import java.beans.PropertyVetoException; -import sun.swing.plaf.synth.SynthUI; import sun.swing.SwingUtilities2; /** diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -27,52 +27,61 @@ import java.awt.*; import java.awt.event.*; -import java.awt.peer.LightweightPeer; - import javax.swing.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicInternalFrameUI; -import javax.swing.event.*; - import java.beans.*; -import java.io.Serializable; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's InternalFrameUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JInternalFrame}. * * @author David Kloba * @author Joshua Outwater * @author Rich Schiavi + * @since 1.7 */ -class SynthInternalFrameUI extends BasicInternalFrameUI implements SynthUI, - PropertyChangeListener { +public class SynthInternalFrameUI extends BasicInternalFrameUI + implements SynthUI, PropertyChangeListener { private SynthStyle style; - private static DesktopManager sharedDesktopManager; - private boolean componentListenerAdded = false; - - private Rectangle parentBounds; - + /** + * Creates a new UI object for the given component. + * + * @param b component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent b) { return new SynthInternalFrameUI((JInternalFrame)b); } - public SynthInternalFrameUI(JInternalFrame b) { + protected SynthInternalFrameUI(JInternalFrame b) { super(b); } + /** + * @inheritDoc + */ + @Override public void installDefaults() { frame.setLayout(internalFrameLayout = createLayoutManager()); updateStyle(frame); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); frame.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallComponents() { if (frame.getComponentPopupMenu() instanceof UIResource) { frame.setComponentPopupMenu(null); @@ -80,6 +89,10 @@ super.uninstallComponents(); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { frame.removePropertyChangeListener(this); super.uninstallListeners(); @@ -104,6 +117,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(frame, ENABLED); style.uninstallDefaults(context); @@ -115,6 +132,10 @@ } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -124,24 +145,28 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - - public int getComponentState(JComponent c) { + private int getComponentState(JComponent c) { return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override protected JComponent createNorthPane(JInternalFrame w) { titlePane = new SynthInternalFrameTitlePane(w); titlePane.setName("InternalFrame.northPane"); return titlePane; } + /** + * @inheritDoc + */ + @Override protected ComponentListener createComponentListener() { if (UIManager.getBoolean("InternalFrame.useTaskBar")) { return new ComponentHandler() { - public void componentResized(ComponentEvent e) { + @Override public void componentResized(ComponentEvent e) { if (frame != null && frame.isMaximum()) { JDesktopPane desktop = (JDesktopPane)e.getSource(); for (Component comp : desktop.getComponents()) { @@ -168,6 +193,10 @@ } } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -178,6 +207,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -185,15 +218,29 @@ context.dispose(); } + /** + * Paints the specified component. This implementation does nothing. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintInternalFrameBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent evt) { SynthStyle oldStyle = style; JInternalFrame f = (JInternalFrame)evt.getSource(); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -29,38 +29,37 @@ import javax.swing.plaf.*; import javax.swing.plaf.basic.*; import javax.swing.text.View; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.Component; -import java.awt.Container; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Insets; -import java.awt.Color; import java.awt.Graphics; -import java.awt.Font; import java.awt.FontMetrics; import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's LabelUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JLabel}. * * @author Scott Violet + * @since 1.7 */ -class SynthLabelUI extends BasicLabelUI implements SynthUI { +public class SynthLabelUI extends BasicLabelUI implements SynthUI { private SynthStyle style; /** * Returns the LabelUI implementation used for the skins look and feel. + * + * @param c component to create UI object for + * @return the UI object */ public static ComponentUI createUI(JComponent c){ return new SynthLabelUI(); } - + /** + * @inheritDoc + */ + @Override protected void installDefaults(JLabel c) { updateStyle(c); } @@ -71,6 +70,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults(JLabel c){ SynthContext context = getContext(c, ENABLED); @@ -79,6 +82,10 @@ style = null; } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -88,10 +95,6 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { int state = SynthLookAndFeel.getComponentState(c); if (SynthLookAndFeel.selectedUI == this && @@ -101,6 +104,10 @@ return state; } + /** + * @inheritDoc + */ + @Override public int getBaseline(JComponent c, int width, int height) { if (c == null) { throw new NullPointerException("Component must be non-null"); @@ -153,6 +160,10 @@ * component. This method is invoked by JComponent * when the specified component is being painted. */ + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -163,6 +174,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -170,6 +185,12 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { JLabel label = (JLabel)context.getComponent(); Icon icon = (label.isEnabled()) ? label.getIcon() : @@ -185,11 +206,19 @@ label.getIconTextGap(), label.getDisplayedMnemonicIndex(), 0); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintLabelBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public Dimension getPreferredSize(JComponent c) { JLabel label = (JLabel)c; Icon icon = (label.isEnabled()) ? label.getIcon() : @@ -207,7 +236,10 @@ return size; } - + /** + * @inheritDoc + */ + @Override public Dimension getMinimumSize(JComponent c) { JLabel label = (JLabel)c; Icon icon = (label.isEnabled()) ? label.getIcon() : @@ -225,6 +257,10 @@ return size; } + /** + * @inheritDoc + */ + @Override public Dimension getMaximumSize(JComponent c) { JLabel label = (JLabel)c; Icon icon = (label.isEnabled()) ? label.getIcon() : @@ -242,7 +278,10 @@ return size; } - + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { super.propertyChange(e); if (SynthLookAndFeel.shouldUpdateStyle(e)) { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -27,38 +27,39 @@ import javax.swing.*; import javax.swing.border.*; -import javax.swing.event.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; -import javax.swing.text.Position; - import java.awt.*; -import java.awt.event.*; -import java.awt.datatransfer.Transferable; -import java.awt.dnd.*; - -import java.util.ArrayList; -import java.util.TooManyListenersException; - import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's ListUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JList}. * * @author Scott Violet + * @since 1.7 */ -class SynthListUI extends BasicListUI implements PropertyChangeListener, - SynthUI { +public class SynthListUI extends BasicListUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; private boolean useListColors; private boolean useUIBorder; + /** + * Creates a new UI object for the given component. + * + * @param list component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent list) { return new SynthListUI(); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -69,27 +70,47 @@ paint(g, c); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintListBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); list.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JList)e.getSource()); } } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { super.uninstallListeners(); list.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { if (list.getCellRenderer() == null || (list.getCellRenderer() instanceof UIResource)) { @@ -135,6 +156,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { super.uninstallDefaults(); @@ -145,6 +170,10 @@ style = null; } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -154,27 +183,23 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { return SynthLookAndFeel.getComponentState(c); } private class SynthListCellRenderer extends DefaultListCellRenderer.UIResource { - public String getName() { + @Override public String getName() { return "List.cellRenderer"; } - public void setBorder(Border b) { + @Override public void setBorder(Border b) { if (useUIBorder || b instanceof SynthBorder) { super.setBorder(b); } } - public Component getListCellRendererComponent(JList list, Object value, + @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (!useListColors && (isSelected || cellHasFocus)) { SynthLookAndFeel.setSelectedUI((SynthLabelUI)SynthLookAndFeel. @@ -190,7 +215,7 @@ return this; } - public void paint(Graphics g) { + @Override public void paint(Graphics g) { super.paint(g); SynthLookAndFeel.resetSelectedUI(); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthLookAndFeel.java Wed Jul 05 17:04:26 2017 +0200 @@ -234,44 +234,9 @@ * shouldUpdateStyleOnAncestorChanged as necessary. */ static boolean shouldUpdateStyle(PropertyChangeEvent event) { - String eName = event.getPropertyName(); - if ("name" == eName) { - // Always update on a name change - return true; - } - else if ("componentOrientation" == eName) { - // Always update on a component orientation change - return true; - } - else if ("ancestor" == eName && event.getNewValue() != null) { - // Only update on an ancestor change when getting a valid - // parent and the LookAndFeel wants this. - LookAndFeel laf = UIManager.getLookAndFeel(); - return (laf instanceof SynthLookAndFeel && - ((SynthLookAndFeel)laf). - shouldUpdateStyleOnAncestorChanged()); - } - // Note: The following two nimbus based overrides should be refactored - // to be in the Nimbus LAF. Due to constraints in an update release, - // we couldn't actually provide the public API necessary to allow - // NimbusLookAndFeel (a subclass of SynthLookAndFeel) to provide its - // own rules for shouldUpdateStyle. - else if ("Nimbus.Overrides" == eName) { - // Always update when the Nimbus.Overrides client property has - // been changed - return true; - } - else if ("Nimbus.Overrides.InheritDefaults" == eName) { - // Always update when the Nimbus.Overrides.InheritDefaults - // client property has changed - return true; - } - else if ("JComponent.sizeVariant" == eName) { - // Always update when the JComponent.sizeVariant - // client property has changed - return true; - } - return false; + LookAndFeel laf = UIManager.getLookAndFeel(); + return (laf instanceof SynthLookAndFeel && + ((SynthLookAndFeel) laf).shouldUpdateStyleOnEvent(event)); } /** @@ -303,12 +268,6 @@ * @param c Component to update style for. */ public static void updateStyles(Component c) { - _updateStyles(c); - c.repaint(); - } - - // Implementation for updateStyles - private static void _updateStyles(Component c) { if (c instanceof JComponent) { // Yes, this is hacky. A better solution is to get the UI // and cast, but JComponent doesn't expose a getter for the UI @@ -332,6 +291,7 @@ updateStyles(child); } } + c.repaint(); } /** @@ -789,6 +749,27 @@ } /** + * Returns whether or not the UIs should update their styles when a + * particular event occurs. + * + * @param ev a {@code PropertyChangeEvent} + * @return whether or not the UIs should update their styles + * @since 1.7 + */ + protected boolean shouldUpdateStyleOnEvent(PropertyChangeEvent ev) { + String eName = ev.getPropertyName(); + if ("name" == eName || "componentOrientation" == eName) { + return true; + } + if ("ancestor" == eName && ev.getNewValue() != null) { + // Only update on an ancestor change when getting a valid + // parent and the LookAndFeel wants this. + return shouldUpdateStyleOnAncestorChanged(); + } + return false; + } + + /** * Returns the antialiasing information as specified by the host desktop. * Antialiasing might be forced off if the desktop is GNOME and the user * has set his locale to Chinese, Japanese or Korean. This is consistent diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -25,45 +25,49 @@ package javax.swing.plaf.synth; import javax.swing.*; -import javax.swing.event.*; -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; import java.awt.Graphics; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.event.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; - -import javax.swing.border.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's MenuBarUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JMenuBar}. * * @author Scott Violet + * @since 1.7 */ -class SynthMenuBarUI extends BasicMenuBarUI implements PropertyChangeListener, - SynthUI { +public class SynthMenuBarUI extends BasicMenuBarUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; + /** + * Creates a new UI object for the given component. + * + * @param x component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent x) { return new SynthMenuBarUI(); } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { if (menuBar.getLayout() == null || menuBar.getLayout() instanceof UIResource) { - menuBar.setLayout(new DefaultMenuLayout(menuBar,BoxLayout.LINE_AXIS)); + menuBar.setLayout(new SynthMenuLayout(menuBar,BoxLayout.LINE_AXIS)); } updateStyle(menuBar); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); menuBar.addPropertyChangeListener(this); @@ -82,6 +86,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(menuBar, ENABLED); @@ -90,11 +98,19 @@ style = null; } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { super.uninstallListeners(); menuBar.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -104,14 +120,14 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -122,6 +138,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -129,14 +149,28 @@ context.dispose(); } + /** + * Paints the specified component. This implementation does nothing. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintMenuBarBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JMenuBar)e.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -24,41 +24,44 @@ */ package javax.swing.plaf.synth; -import javax.swing.plaf.basic.BasicHTML; import java.awt.*; -import java.awt.event.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; - import javax.swing.*; -import javax.swing.event.*; -import javax.swing.border.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; -import javax.swing.text.View; -import sun.swing.plaf.synth.*; import sun.swing.MenuItemLayoutHelper; /** - * Synth's MenuItemUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JMenuItem}. * * @author Georges Saab * @author David Karlton * @author Arnaud Weber * @author Fredrik Lagerblad + * @since 1.7 */ -class SynthMenuItemUI extends BasicMenuItemUI implements +public class SynthMenuItemUI extends BasicMenuItemUI implements PropertyChangeListener, SynthUI { private SynthStyle style; private SynthStyle accStyle; - private String acceleratorDelimiter; - + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthMenuItemUI(); } + /** + * @inheritDoc + */ + @Override public void uninstallUI(JComponent c) { super.uninstallUI(c); // Remove values from the parent's Client Properties. @@ -69,10 +72,18 @@ } } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { updateStyle(menuItem); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); menuItem.addPropertyChangeListener(this); @@ -122,6 +133,10 @@ accContext.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(menuItem, ENABLED); style.uninstallDefaults(context); @@ -137,11 +152,19 @@ super.uninstallDefaults(); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { super.uninstallListeners(); menuItem.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -151,7 +174,7 @@ SynthLookAndFeel.getRegion(c), style, state); } - public SynthContext getContext(JComponent c, Region region) { + SynthContext getContext(JComponent c, Region region) { return getContext(c, region, getComponentState(c, region)); } @@ -160,10 +183,6 @@ region, accStyle, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { int state; @@ -186,6 +205,10 @@ return getComponentState(c); } + /** + * @inheritDoc + */ + @Override protected Dimension getPreferredMenuItemSize(JComponent c, Icon checkIcon, Icon arrowIcon, @@ -203,6 +226,10 @@ } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -212,6 +239,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -219,6 +250,12 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { SynthContext accContext = getContext(menuItem, Region.MENU_ITEM_ACCELERATOR); @@ -236,11 +273,19 @@ SynthGraphicsUtils.paintBackground(context, g, c); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintMenuItemBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JMenuItem)e.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuLayout.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuLayout.java Wed Jul 05 17:04:26 2017 +0200 @@ -0,0 +1,53 @@ +/* + * Copyright 2002-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 javax.swing.plaf.synth; + +import javax.swing.plaf.basic.DefaultMenuLayout; +import javax.swing.JPopupMenu; +import java.awt.Container; +import java.awt.Dimension; + +/** + * @inheritDoc + * + * @author Georges Saab + */ + +class SynthMenuLayout extends DefaultMenuLayout { + public SynthMenuLayout(Container target, int axis) { + super(target, axis); + } + + public Dimension preferredLayoutSize(Container target) { + if (target instanceof JPopupMenu) { + JPopupMenu popupMenu = (JPopupMenu) target; + popupMenu.putClientProperty( + SynthMenuItemLayoutHelper.MAX_ACC_OR_ARROW_WIDTH, null); + } + + return super.preferredLayoutSize(target); + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -25,40 +25,48 @@ package javax.swing.plaf.synth; import java.awt.*; -import java.awt.event.*; import java.beans.*; import javax.swing.*; -import javax.swing.event.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; -import javax.swing.border.*; -import java.util.Arrays; -import java.util.ArrayList; -import sun.swing.plaf.synth.SynthUI; import sun.swing.MenuItemLayoutHelper; /** - * Synth's MenuUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JMenu}. * * @author Georges Saab * @author David Karlton * @author Arnaud Weber + * @since 1.7 */ -class SynthMenuUI extends BasicMenuUI implements PropertyChangeListener, - SynthUI { +public class SynthMenuUI extends BasicMenuUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; private SynthStyle accStyle; - private String acceleratorDelimiter; - + /** + * Creates a new UI object for the given component. + * + * @param x component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent x) { return new SynthMenuUI(); } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { updateStyle(menuItem); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); menuItem.addPropertyChangeListener(this); @@ -111,6 +119,10 @@ accContext.dispose(); } + /** + * @inheritDoc + */ + @Override public void uninstallUI(JComponent c) { super.uninstallUI(c); // Remove values from the parent's Client Properties. @@ -121,6 +133,10 @@ } } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(menuItem, ENABLED); style.uninstallDefaults(context); @@ -136,22 +152,30 @@ super.uninstallDefaults(); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { super.uninstallListeners(); menuItem.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } SynthContext getContext(JComponent c, int state) { - Region region = getRegion(c); + Region region = SynthLookAndFeel.getRegion(c); return SynthContext.getContext(SynthContext.class, c, region, style, state); } - public SynthContext getContext(JComponent c, Region region) { + SynthContext getContext(JComponent c, Region region) { return getContext(c, region, getComponentState(c, region)); } @@ -160,10 +184,6 @@ region, accStyle, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { int state; @@ -186,6 +206,10 @@ return getComponentState(c); } + /** + * @inheritDoc + */ + @Override protected Dimension getPreferredMenuItemSize(JComponent c, Icon checkIcon, Icon arrowIcon, @@ -202,7 +226,10 @@ return value; } - + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -213,6 +240,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -220,6 +251,12 @@ context.dispose(); } + /** + * Paints the specified component. This implementation does nothing. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { SynthContext accContext = getContext(menuItem, Region.MENU_ITEM_ACCELERATOR); @@ -232,11 +269,19 @@ accContext.dispose(); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintMenuBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JMenu)e.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -28,34 +28,45 @@ import java.awt.*; import java.beans.*; import javax.swing.*; -import javax.swing.event.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; import sun.swing.DefaultLookup; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's OptionPaneUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JOptionPane}. * * @author James Gosling * @author Scott Violet * @author Amy Fowler + * @since 1.7 */ -class SynthOptionPaneUI extends BasicOptionPaneUI implements +public class SynthOptionPaneUI extends BasicOptionPaneUI implements PropertyChangeListener, SynthUI { private SynthStyle style; /** - * Creates a new BasicOptionPaneUI instance. - */ + * Creates a new UI object for the given component. + * + * @param x component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent x) { return new SynthOptionPaneUI(); } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { updateStyle(optionPane); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); optionPane.addPropertyChangeListener(this); @@ -80,6 +91,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(optionPane, ENABLED); @@ -88,11 +103,19 @@ style = null; } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { super.uninstallListeners(); optionPane.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void installComponents() { optionPane.add(createMessageArea()); @@ -108,6 +131,10 @@ optionPane.applyComponentOrientation(optionPane.getComponentOrientation()); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -117,14 +144,14 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -135,6 +162,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -142,30 +173,49 @@ context.dispose(); } + /** + * Paints the specified component. This implementation does nothing. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintOptionPaneBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JOptionPane)e.getSource()); } } + /** + * @inheritDoc + */ + @Override protected boolean getSizeButtonsToSameWidth() { return DefaultLookup.getBoolean(optionPane, this, "OptionPane.sameSizeButtons", true); } /** - * Messaged from installComponents to create a Container containing the - * body of the message. The icon is the created by calling - * addIcon. + * Called from {@link #installComponents} to create a {@code Container} + * containing the body of the message. The icon is the created by calling + * {@link #addIcon}. */ + @Override protected Container createMessageArea() { JPanel top = new JPanel(); top.setName("OptionPane.messageArea"); @@ -206,6 +256,10 @@ return top; } + /** + * @inheritDoc + */ + @Override protected Container createSeparator() { JSeparator separator = new JSeparator(SwingConstants.HORIZONTAL); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java Wed Jul 05 17:04:26 2017 +0200 @@ -25,7 +25,6 @@ package javax.swing.plaf.synth; import java.awt.*; -import javax.swing.*; /** * SynthPainter is used for painting portions of diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -25,29 +25,37 @@ package javax.swing.plaf.synth; -import java.awt.*; import javax.swing.*; -import javax.swing.border.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicPanelUI; import java.awt.*; -import java.awt.event.*; import java.beans.*; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's PanelUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JPanel}. * * @author Steve Wilson + * @since 1.7 */ -class SynthPanelUI extends BasicPanelUI implements PropertyChangeListener, - SynthUI { +public class SynthPanelUI extends BasicPanelUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthPanelUI(); } + /** + * @inheritDoc + */ + @Override public void installUI(JComponent c) { JPanel p = (JPanel)c; @@ -55,6 +63,10 @@ installListeners(p); } + /** + * @inheritDoc + */ + @Override public void uninstallUI(JComponent c) { JPanel p = (JPanel)c; @@ -62,18 +74,36 @@ super.uninstallUI(c); } + /** + * Installs listeners into the panel. + * + * @param p the {@code JPanel} object + */ protected void installListeners(JPanel p) { p.addPropertyChangeListener(this); } + /** + * Uninstalls listeners from the panel. + * + * @param p the {@code JPanel} object + */ protected void uninstallListeners(JPanel p) { p.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void installDefaults(JPanel p) { updateStyle(p); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults(JPanel p) { SynthContext context = getContext(p, ENABLED); @@ -88,6 +118,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -97,14 +131,14 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -115,6 +149,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -122,15 +160,29 @@ context.dispose(); } + /** + * Paints the specified component. This implementation does nothing. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { // do actual painting } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintPanelBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent pce) { if (SynthLookAndFeel.shouldUpdateStyle(pce)) { updateStyle((JPanel)pce.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -25,21 +25,19 @@ package javax.swing.plaf.synth; -import java.awt.*; +import java.awt.Graphics; import javax.swing.*; import javax.swing.text.*; -import javax.swing.plaf.*; +import javax.swing.plaf.ComponentUI; /** - * Provides the Synth look and feel for a password field. - * The only difference from the standard text field is that - * the view of the text is simply a string of the echo - * character as specified in JPasswordField, rather than the - * real text contained in the field. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JPasswordField}. * * @author Shannon Hickey + * @since 1.7 */ -class SynthPasswordFieldUI extends SynthTextFieldUI { +public class SynthPasswordFieldUI extends SynthTextFieldUI { /** * Creates a UI for a JPasswordField. @@ -58,6 +56,7 @@ * * @return the name ("PasswordField") */ + @Override protected String getPropertyPrefix() { return "PasswordField"; } @@ -68,20 +67,33 @@ * @param elem the element * @return the view */ + @Override public View create(Element elem) { return new PasswordView(elem); } + /** + * @inheritDoc + */ + @Override void paintBackground(SynthContext context, Graphics g, JComponent c) { context.getPainter().paintPasswordFieldBackground(context, g, 0, 0, c.getWidth(), c.getHeight()); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintPasswordFieldBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override protected void installKeyboardActions() { super.installKeyboardActions(); ActionMap map = SwingUtilities.getUIActionMap(getComponent()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -26,49 +26,43 @@ package javax.swing.plaf.synth; import javax.swing.*; -import javax.swing.event.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; -import javax.swing.border.*; - -import java.applet.Applet; - -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; import java.awt.Graphics; -import java.awt.KeyboardFocusManager; -import java.awt.Window; -import java.awt.event.*; -import java.awt.AWTEvent; -import java.awt.Toolkit; - import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; -import java.util.*; -import sun.swing.plaf.synth.SynthUI; - /** - * Synth's PopupMenuUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JPopupMenu}. * * @author Georges Saab * @author David Karlton * @author Arnaud Weber + * @since 1.7 */ -class SynthPopupMenuUI extends BasicPopupMenuUI implements - PropertyChangeListener, SynthUI { +public class SynthPopupMenuUI extends BasicPopupMenuUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; + /** + * Creates a new UI object for the given component. + * + * @param x component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent x) { return new SynthPopupMenuUI(); } + /** + * @inheritDoc + */ + @Override public void installDefaults() { if (popupMenu.getLayout() == null || popupMenu.getLayout() instanceof UIResource) { - popupMenu.setLayout(new DefaultMenuLayout( - popupMenu, BoxLayout.Y_AXIS)); + popupMenu.setLayout(new SynthMenuLayout(popupMenu, BoxLayout.Y_AXIS)); } updateStyle(popupMenu); } @@ -86,11 +80,19 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); popupMenu.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(popupMenu, ENABLED); @@ -103,11 +105,19 @@ } } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { super.uninstallListeners(); popupMenu.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -117,14 +127,14 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -135,6 +145,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -142,14 +156,28 @@ context.dispose(); } + /** + * Paints the specified component. This implementation does nothing. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintPopupMenuBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle(popupMenu); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -32,16 +32,17 @@ import javax.swing.plaf.basic.BasicProgressBarUI; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; -import sun.swing.plaf.synth.SynthUI; import sun.swing.SwingUtilities2; /** - * Synth's ProgressBarUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JProgressBar}. * * @author Joshua Outwater + * @since 1.7 */ -class SynthProgressBarUI extends BasicProgressBarUI implements SynthUI, - PropertyChangeListener { +public class SynthProgressBarUI extends BasicProgressBarUI + implements SynthUI, PropertyChangeListener { private SynthStyle style; private int progressPadding; private boolean rotateText; // added for Nimbus LAF @@ -49,22 +50,37 @@ private boolean tileWhenIndeterminate; //whether to tile indeterminate painting private int tileWidth; //the width of each tile + /** + * Creates a new UI object for the given component. + * + * @param x component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent x) { return new SynthProgressBarUI(); } + /** + * @inheritDoc + */ @Override protected void installListeners() { super.installListeners(); progressBar.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ @Override protected void uninstallListeners() { super.uninstallListeners(); progressBar.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ @Override protected void installDefaults() { updateStyle(progressBar); @@ -101,6 +117,9 @@ context.dispose(); } + /** + * @inheritDoc + */ @Override protected void uninstallDefaults() { SynthContext context = getContext(progressBar, ENABLED); @@ -110,6 +129,10 @@ style = null; } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -119,14 +142,13 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ @Override public int getBaseline(JComponent c, int width, int height) { super.getBaseline(c, width, height); @@ -142,6 +164,9 @@ return -1; } + /** + * @inheritDoc + */ @Override protected Rectangle getBox(Rectangle r) { if (tileWhenIndeterminate) { @@ -151,6 +176,9 @@ } } + /** + * @inheritDoc + */ @Override protected void setAnimationIndex(int newValue) { if (paintOutsideClip) { @@ -164,6 +192,9 @@ } } + /** + * @inheritDoc + */ @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -176,6 +207,9 @@ context.dispose(); } + /** + * @inheritDoc + */ @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -184,6 +218,12 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { JProgressBar pBar = (JProgressBar)context.getComponent(); int x = 0, y = 0, width = 0, height = 0; @@ -261,8 +301,14 @@ } } - protected void paintText(SynthContext context, Graphics g, - String title) { + /** + * Paints the component's text. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + * @param title the text to paint + */ + protected void paintText(SynthContext context, Graphics g, String title) { if (progressBar.isStringPainted()) { SynthStyle style = context.getStyle(); Font font = style.getFont(context); @@ -323,12 +369,20 @@ } } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintProgressBarBorder(context, g, x, y, w, h, progressBar.getOrientation()); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e) || "indeterminate".equals(e.getPropertyName())) { @@ -336,6 +390,9 @@ } } + /** + * @inheritDoc + */ @Override public Dimension getPreferredSize(JComponent c) { Dimension size = null; @@ -398,5 +455,5 @@ size.height += border.top + border.bottom; return size; - } + } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -27,49 +27,46 @@ import javax.swing.*; import java.awt.*; -import java.awt.event.*; import javax.swing.plaf.*; -import javax.swing.border.*; /** - * Synth's RadioButtonMenuItemUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JRadioButtonMenuItem}. * * @author Georges Saab * @author David Karlton + * @since 1.7 */ -class SynthRadioButtonMenuItemUI extends SynthMenuItemUI { +public class SynthRadioButtonMenuItemUI extends SynthMenuItemUI { + + /** + * Creates a new UI object for the given component. + * + * @param b component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent b) { return new SynthRadioButtonMenuItemUI(); } + /** + * @inheritDoc + */ + @Override protected String getPropertyPrefix() { return "RadioButtonMenuItem"; } - public void processMouseEvent(JMenuItem item,MouseEvent e,MenuElement path[],MenuSelectionManager manager) { - Point p = e.getPoint(); - if(p.x >= 0 && p.x < item.getWidth() && - p.y >= 0 && p.y < item.getHeight()) { - if(e.getID() == MouseEvent.MOUSE_RELEASED) { - manager.clearSelectedPath(); - item.doClick(0); - item.setArmed(false); - } else - manager.setSelectedPath(path); - } else if(item.getModel().isArmed()) { - MenuElement newPath[] = new MenuElement[path.length-1]; - int i,c; - for(i=0,c=path.length-1;idefaultButton has changed, this will * reinstall the keyboard actions. */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JRootPane)e.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -30,41 +30,33 @@ import javax.swing.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's ScrollBarUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JScrollBar}. * * @author Scott Violet + * @since 1.7 */ -class SynthScrollBarUI extends BasicScrollBarUI implements - PropertyChangeListener, SynthUI { +public class SynthScrollBarUI extends BasicScrollBarUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; private SynthStyle thumbStyle; private SynthStyle trackStyle; private boolean validMinimumThumbSize; - private int scrollBarWidth; - - //These two variables should be removed when the corrosponding ones in BasicScrollBarUI are made protected - private int incrGap; - private int decrGap; public static ComponentUI createUI(JComponent c) { return new SynthScrollBarUI(); } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { - //NOTE: This next line of code was added because, since incrGap and decrGap in - //BasicScrollBarUI are private, I need to have some way of updating them. - //This is an incomplete solution (since it implies that the incrGap and decrGap - //are set once, and not reset per state. Probably ok, but not always ok). - //This line of code should be removed at the same time that incrGap and - //decrGap are removed and made protected in the super class. - super.installDefaults(); - trackHighlight = NO_HIGHLIGHT; if (scrollbar.getLayout() == null || (scrollbar.getLayout() instanceof UIResource)) { @@ -73,6 +65,10 @@ updateStyle(scrollbar); } + /** + * @inheritDoc + */ + @Override protected void configureScrollBarColors() { } @@ -137,16 +133,28 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); scrollbar.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { super.uninstallListeners(); scrollbar.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults(){ SynthContext context = getContext(scrollbar, ENABLED); style.uninstallDefaults(context); @@ -166,9 +174,12 @@ super.uninstallDefaults(); } - + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { @@ -176,14 +187,6 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - private SynthContext getContext(JComponent c, Region region) { return getContext(c, region, getComponentState(c, region)); } @@ -206,6 +209,10 @@ return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public boolean getSupportsAbsolutePositioning() { SynthContext context = getContext(scrollbar); boolean value = style.getBoolean(context, @@ -214,6 +221,10 @@ return value; } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -225,6 +236,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -232,6 +247,12 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { SynthContext subcontext = getContext(scrollbar, Region.SCROLL_BAR_TRACK); @@ -243,31 +264,49 @@ subcontext.dispose(); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintScrollBarBorder(context, g, x, y, w, h, scrollbar.getOrientation()); } - protected void paintTrack(SynthContext ss, Graphics g, + /** + * Paints the scrollbar track. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + * @param trackBounds bounding box for the track + */ + protected void paintTrack(SynthContext context, Graphics g, Rectangle trackBounds) { - SynthLookAndFeel.updateSubregion(ss, g, trackBounds); - ss.getPainter().paintScrollBarTrackBackground(ss, g, trackBounds.x, + SynthLookAndFeel.updateSubregion(context, g, trackBounds); + context.getPainter().paintScrollBarTrackBackground(context, g, trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height, scrollbar.getOrientation()); - ss.getPainter().paintScrollBarTrackBorder(ss, g, trackBounds.x, + context.getPainter().paintScrollBarTrackBorder(context, g, trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height, scrollbar.getOrientation()); } - protected void paintThumb(SynthContext ss, Graphics g, + /** + * Paints the scrollbar thumb. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + * @param thumbBounds bounding box for the thumb + */ + protected void paintThumb(SynthContext context, Graphics g, Rectangle thumbBounds) { - SynthLookAndFeel.updateSubregion(ss, g, thumbBounds); + SynthLookAndFeel.updateSubregion(context, g, thumbBounds); int orientation = scrollbar.getOrientation(); - ss.getPainter().paintScrollBarThumbBackground(ss, g, thumbBounds.x, + context.getPainter().paintScrollBarThumbBackground(context, g, thumbBounds.x, thumbBounds.y, thumbBounds.width, thumbBounds.height, orientation); - ss.getPainter().paintScrollBarThumbBorder(ss, g, thumbBounds.x, + context.getPainter().paintScrollBarThumbBorder(context, g, thumbBounds.x, thumbBounds.y, thumbBounds.width, thumbBounds.height, orientation); } @@ -288,6 +327,7 @@ * @see #getMaximumSize * @see #getMinimumSize */ + @Override public Dimension getPreferredSize(JComponent c) { Insets insets = c.getInsets(); return (scrollbar.getOrientation() == JScrollBar.VERTICAL) @@ -295,6 +335,10 @@ : new Dimension(48, scrollBarWidth + insets.top + insets.bottom); } + /** + * @inheritDoc + */ + @Override protected Dimension getMinimumThumbSize() { if (!validMinimumThumbSize) { if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { @@ -308,6 +352,10 @@ return minimumThumbSize; } + /** + * @inheritDoc + */ + @Override protected JButton createDecreaseButton(int orientation) { SynthArrowButton synthArrowButton = new SynthArrowButton(orientation) { @Override @@ -333,6 +381,10 @@ return synthArrowButton; } + /** + * @inheritDoc + */ + @Override protected JButton createIncreaseButton(int orientation) { SynthArrowButton synthArrowButton = new SynthArrowButton(orientation) { @Override @@ -360,6 +412,10 @@ return synthArrowButton; } + /** + * @inheritDoc + */ + @Override protected void setThumbRollover(boolean active) { if (isThumbRollover() != active) { scrollbar.repaint(getThumbBounds()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -40,24 +40,32 @@ import java.awt.event.FocusListener; import java.awt.event.FocusEvent; -import sun.swing.plaf.synth.SynthUI; - - /** - * Synth's ScrollPaneUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JScrollPane}. * * @author Scott Violet + * @since 1.7 */ -class SynthScrollPaneUI extends BasicScrollPaneUI implements - PropertyChangeListener, SynthUI { +public class SynthScrollPaneUI extends BasicScrollPaneUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; private boolean viewportViewHasFocus = false; private ViewportViewFocusHandler viewportViewFocusHandler; + /** + * Creates a new UI object for the given component. + * + * @param x component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent x) { return new SynthScrollPaneUI(); } + /** + * @inheritDoc + */ @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -69,6 +77,9 @@ context.dispose(); } + /** + * @inheritDoc + */ @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -77,6 +88,12 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { Border vpBorder = scrollpane.getViewportBorder(); if (vpBorder != null) { @@ -85,12 +102,18 @@ } } - + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintScrollPaneBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ @Override protected void installDefaults(JScrollPane scrollpane) { updateStyle(scrollpane); @@ -114,7 +137,9 @@ context.dispose(); } - + /** + * @inheritDoc + */ @Override protected void installListeners(JScrollPane c) { super.installListeners(c); @@ -129,6 +154,9 @@ } } + /** + * @inheritDoc + */ @Override protected void uninstallDefaults(JScrollPane c) { SynthContext context = getContext(c, ENABLED); @@ -141,7 +169,9 @@ } } - + /** + * @inheritDoc + */ @Override protected void uninstallListeners(JComponent c) { super.uninstallListeners(c); @@ -156,7 +186,10 @@ } } - + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -166,12 +199,6 @@ SynthLookAndFeel.getRegion(c), style, state); } - - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - - private int getComponentState(JComponent c) { int baseState = SynthLookAndFeel.getComponentState(c); if (viewportViewFocusHandler!=null && viewportViewHasFocus){ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -34,33 +34,51 @@ import javax.swing.plaf.SeparatorUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.DimensionUIResource; -import sun.swing.plaf.synth.SynthUI; /** - * A Synth L&F implementation of SeparatorUI. This implementation - * is a "combined" view/controller. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JSeparator}. * * @author Shannon Hickey * @author Joshua Outwater + * @since 1.7 */ -class SynthSeparatorUI extends SeparatorUI implements PropertyChangeListener, - SynthUI { +public class SynthSeparatorUI extends SeparatorUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthSeparatorUI(); } + /** + * @inheritDoc + */ + @Override public void installUI(JComponent c) { installDefaults((JSeparator)c); installListeners((JSeparator)c); } - public void uninstallDefaults(JComponent c) { + /** + * @inheritDoc + */ + @Override + public void uninstallUI(JComponent c) { uninstallListeners((JSeparator)c); uninstallDefaults((JSeparator)c); } + /** + * Installs default setting. This method is called when a + * {@code LookAndFeel} is installed. + */ public void installDefaults(JSeparator c) { updateStyle(c); } @@ -88,6 +106,10 @@ context.dispose(); } + /** + * Uninstalls default setting. This method is called when a + * {@code LookAndFeel} is uninstalled. + */ public void uninstallDefaults(JSeparator c) { SynthContext context = getContext(c, ENABLED); @@ -96,14 +118,26 @@ style = null; } + /** + * Installs listeners. This method is called when a + * {@code LookAndFeel} is installed. + */ public void installListeners(JSeparator c) { c.addPropertyChangeListener(this); } + /** + * Uninstalls listeners. This method is called when a + * {@code LookAndFeel} is uninstalled. + */ public void uninstallListeners(JSeparator c) { c.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -116,6 +150,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -123,6 +161,12 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { JSeparator separator = (JSeparator)context.getComponent(); context.getPainter().paintSeparatorForeground(context, g, 0, 0, @@ -130,6 +174,10 @@ separator.getOrientation()); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { JSeparator separator = (JSeparator)context.getComponent(); @@ -137,6 +185,10 @@ separator.getOrientation()); } + /** + * @inheritDoc + */ + @Override public Dimension getPreferredSize(JComponent c) { SynthContext context = getContext(c); @@ -155,16 +207,28 @@ return size; } + /** + * @inheritDoc + */ + @Override public Dimension getMinimumSize(JComponent c) { return getPreferredSize(c); } + /** + * @inheritDoc + */ + @Override public Dimension getMaximumSize(JComponent c) { return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { @@ -172,14 +236,6 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - public void propertyChange(PropertyChangeEvent evt) { if (SynthLookAndFeel.shouldUpdateStyle(evt)) { updateStyle((JSeparator)evt.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -38,20 +38,20 @@ import javax.swing.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicSliderUI; -import sun.swing.plaf.synth.SynthUI; import sun.swing.SwingUtilities2; /** - * Synth's SliderUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JSlider}. * * @author Joshua Outwater + * @since 1.7 */ -class SynthSliderUI extends BasicSliderUI implements PropertyChangeListener, - SynthUI { - protected Dimension contentDim = new Dimension(); - protected Rectangle valueRect = new Rectangle(); - protected boolean paintValue; +public class SynthSliderUI extends BasicSliderUI + implements PropertyChangeListener, SynthUI { + private Rectangle valueRect = new Rectangle(); + private boolean paintValue; /** * When a JSlider is used as a renderer in a JTable, its layout is not @@ -83,18 +83,32 @@ /////////////////////////////////////////////////// // ComponentUI Interface Implementation methods /////////////////////////////////////////////////// + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthSliderUI((JSlider)c); } - public SynthSliderUI(JSlider c) { + protected SynthSliderUI(JSlider c) { super(c); } + /** + * @inheritDoc + */ + @Override protected void installDefaults(JSlider slider) { updateStyle(slider); } + /** + * Uninstalls default setting. This method is called when a + * {@code LookAndFeel} is uninstalled. + */ protected void uninstallDefaults() { SynthContext context = getContext(slider, ENABLED); style.uninstallDefaults(context); @@ -112,11 +126,19 @@ sliderThumbStyle = null; } + /** + * @inheritDoc + */ + @Override protected void installListeners(JSlider slider) { super.installListeners(slider); slider.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners(JSlider slider) { slider.removePropertyChangeListener(this); super.uninstallListeners(slider); @@ -177,6 +199,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected TrackListener createTrackListener(JSlider s) { return new SynthTrackListener(); } @@ -204,6 +230,10 @@ } } + /** + * @inheritDoc + */ + @Override public int getBaseline(JComponent c, int width, int height) { if (c == null) { throw new NullPointerException("Component must be non-null"); @@ -271,9 +301,13 @@ return -1; } + /** + * @inheritDoc + */ + @Override public Dimension getPreferredSize(JComponent c) { recalculateIfInsetsChanged(); - Dimension d = new Dimension(contentDim); + Dimension d = new Dimension(contentRect.width, contentRect.height); if (slider.getOrientation() == JSlider.VERTICAL) { d.height = 200; } else { @@ -285,9 +319,13 @@ return d; } + /** + * @inheritDoc + */ + @Override public Dimension getMinimumSize(JComponent c) { recalculateIfInsetsChanged(); - Dimension d = new Dimension(contentDim); + Dimension d = new Dimension(contentRect.width, contentRect.height); if (slider.getOrientation() == JSlider.VERTICAL) { d.height = thumbRect.height + insetCache.top + insetCache.bottom; } else { @@ -296,11 +334,18 @@ return d; } + /** + * @inheritDoc + */ + @Override protected void calculateGeometry() { layout(); calculateThumbLocation(); } + /** + * Lays out the slider. + */ protected void layout() { SynthContext context = getContext(slider); SynthGraphicsUtils synthGraphics = style.getGraphicsUtils(context); @@ -336,10 +381,10 @@ labelRect.height = getHeightOfTallestLabel(); } - contentDim.height = valueRect.height + trackRect.height + contentRect.height = valueRect.height + trackRect.height + trackInsets.top + trackInsets.bottom + tickRect.height + labelRect.height + 4; - contentDim.width = slider.getWidth() - insetCache.left + contentRect.width = slider.getWidth() - insetCache.left - insetCache.right; // Check if any of the labels will paint out of bounds. @@ -348,7 +393,7 @@ // Calculate the track rectangle. It is necessary for // xPositionForValue to return correct values. trackRect.x = insetCache.left; - trackRect.width = contentDim.width; + trackRect.width = contentRect.width; Dictionary dictionary = slider.getLabelTable(); if (dictionary != null) { @@ -381,9 +426,9 @@ valueRect.x = trackRect.x = tickRect.x = labelRect.x = (insetCache.left + pad); valueRect.width = trackRect.width = tickRect.width = - labelRect.width = (contentDim.width - (pad * 2)); + labelRect.width = (contentRect.width - (pad * 2)); - int centerY = slider.getHeight() / 2 - contentDim.height / 2; + int centerY = slider.getHeight() / 2 - contentRect.height / 2; valueRect.y = centerY; centerY += valueRect.height + 2; @@ -430,18 +475,18 @@ int w1 = trackInsets.left + trackRect.width / 2; int w2 = trackRect.width / 2 + trackInsets.right + tickRect.width + labelRect.width; - contentDim.width = Math.max(w1, l) + Math.max(w2, l) + + contentRect.width = Math.max(w1, l) + Math.max(w2, l) + 2 + insetCache.left + insetCache.right; - contentDim.height = slider.getHeight() - + contentRect.height = slider.getHeight() - insetCache.top - insetCache.bottom; // Layout the components. trackRect.y = tickRect.y = labelRect.y = valueRect.y + valueRect.height; trackRect.height = tickRect.height = labelRect.height = - contentDim.height - valueRect.height; + contentRect.height - valueRect.height; - int startX = slider.getWidth() / 2 - contentDim.width / 2; + int startX = slider.getWidth() / 2 - contentRect.width / 2; if (SynthLookAndFeel.isLeftToRight(slider)) { if (l > w1) { startX += (l - w1); @@ -491,6 +536,10 @@ return pad; } + /** + * @inheritDoc + */ + @Override protected void calculateThumbLocation() { super.calculateThumbLocation(); if (slider.getOrientation() == JSlider.HORIZONTAL) { @@ -504,6 +553,10 @@ } } + /** + * @inheritDoc + */ + @Override protected void calculateTickRect() { if (slider.getOrientation() == JSlider.HORIZONTAL) { tickRect.x = trackRect.x; @@ -533,6 +586,10 @@ } } + /** + * @inheritDoc + */ + @Override public void setThumbLocation(int x, int y) { super.setThumbLocation(x, y); // Value rect is tied to the thumb location. We need to repaint when @@ -542,6 +599,10 @@ setThumbActive(false); } + /** + * @inheritDoc + */ + @Override protected int xPositionForValue(int value) { int min = slider.getMinimum(); int max = slider.getMaximum(); @@ -567,6 +628,10 @@ return xPosition; } + /** + * @inheritDoc + */ + @Override protected int yPositionForValue(int value, int trackY, int trackHeight) { int min = slider.getMinimum(); int max = slider.getMaximum(); @@ -593,10 +658,9 @@ } /** - * Returns a value give a y position. If yPos is past the track at the - * top or the bottom it will set the value to the min or max of the - * slider, depending if the slider is inverted or not. + * @inheritDoc */ + @Override public int valueForYPosition(int yPos) { int value; int minValue = slider.getMinimum(); @@ -623,10 +687,9 @@ } /** - * Returns a value give an x position. If xPos is past the track at the - * left or the right it will set the value to the min or max of the - * slider, depending if the slider is inverted or not. + * @inheritDoc */ + @Override public int valueForXPosition(int xPos) { int value; int minValue = slider.getMinimum(); @@ -652,6 +715,10 @@ return value; } + /** + * @inheritDoc + */ + @Override protected Dimension getThumbSize() { Dimension size = new Dimension(); @@ -665,6 +732,10 @@ return size; } + /** + * @inheritDoc + */ + @Override protected void recalculateIfInsetsChanged() { SynthContext context = getContext(slider); Insets newInsets = style.getInsets(context, null); @@ -678,20 +749,20 @@ context.dispose(); } - public Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); + /** + * @inheritDoc + */ + @Override + public SynthContext getContext(JComponent c) { + return getContext(c, SynthLookAndFeel.getComponentState(c)); } - public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); - } - - public SynthContext getContext(JComponent c, int state) { + private SynthContext getContext(JComponent c, int state) { return SynthContext.getContext(SynthContext.class, c, SynthLookAndFeel.getRegion(c), style, state); } - public SynthContext getContext(JComponent c, Region subregion) { + private SynthContext getContext(JComponent c, Region subregion) { return getContext(c, subregion, getComponentState(c, subregion)); } @@ -707,10 +778,6 @@ return SynthContext.getContext(klass, c, subregion, style, state); } - public int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - private int getComponentState(JComponent c, Region region) { if (region == Region.SLIDER_THUMB && thumbActive &&c.isEnabled()) { int state = thumbPressed ? PRESSED : MOUSE_OVER; @@ -720,6 +787,10 @@ return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); SynthLookAndFeel.update(context, g); @@ -730,13 +801,23 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); paint(context, g); context.dispose(); } - public void paint(SynthContext context, Graphics g) { + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ + protected void paint(SynthContext context, Graphics g) { recalculateIfInsetsChanged(); recalculateIfOrientationChanged(); Rectangle clip = g.getClipBounds(); @@ -755,8 +836,8 @@ // For horizontal sliders, make sure value is not painted // outside slider bounds. if (slider.getOrientation() == JSlider.HORIZONTAL) { - if (valueRect.x + labelWidth > insetCache.left + contentDim.width) { - valueRect.x = (insetCache.left + contentDim.width) - labelWidth; + if (valueRect.x + labelWidth > insetCache.left + contentRect.width) { + valueRect.x = (insetCache.left + contentRect.width) - labelWidth; } valueRect.x = Math.max(valueRect.x, 0); } @@ -785,13 +866,24 @@ } } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintSliderBorder(context, g, x, y, w, h, slider.getOrientation()); } - public void paintThumb(SynthContext context, Graphics g, + /** + * Paints the slider thumb. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + * @param thumbBounds bounding box for the thumb + */ + protected void paintThumb(SynthContext context, Graphics g, Rectangle thumbBounds) { int orientation = slider.getOrientation(); SynthLookAndFeel.updateSubregion(context, g, thumbBounds); @@ -803,7 +895,14 @@ thumbBounds.height, orientation); } - public void paintTrack(SynthContext context, Graphics g, + /** + * Paints the slider track. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + * @param trackBounds bounding box for the track + */ + protected void paintTrack(SynthContext context, Graphics g, Rectangle trackBounds) { int orientation = slider.getOrientation(); SynthLookAndFeel.updateSubregion(context, g, trackBounds); @@ -815,6 +914,10 @@ trackBounds.height, orientation); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JSlider)e.getSource()); @@ -827,23 +930,23 @@ /** * Track mouse movements. */ - protected class SynthTrackListener extends TrackListener { + private class SynthTrackListener extends TrackListener { - public void mouseExited(MouseEvent e) { + @Override public void mouseExited(MouseEvent e) { setThumbActive(false); } - public void mousePressed(MouseEvent e) { + @Override public void mousePressed(MouseEvent e) { super.mousePressed(e); setThumbPressed(thumbRect.contains(e.getX(), e.getY())); } - public void mouseReleased(MouseEvent e) { + @Override public void mouseReleased(MouseEvent e) { super.mouseReleased(e); updateThumbState(e.getX(), e.getY(), false); } - public void mouseDragged(MouseEvent e) { + @Override public void mouseDragged(MouseEvent e) { int thumbMiddle; if (!slider.isEnabled()) { @@ -914,7 +1017,7 @@ } } - public void mouseMoved(MouseEvent e) { + @Override public void mouseMoved(MouseEvent e) { updateThumbState(e.getX(), e.getY()); } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -26,22 +26,21 @@ import java.awt.*; import java.awt.event.*; - import javax.swing.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicSpinnerUI; - import java.beans.*; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's SpinnerUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JSpinner}. * * @author Hans Muller * @author Joshua Outwater + * @since 1.7 */ -class SynthSpinnerUI extends BasicSpinnerUI implements PropertyChangeListener, - SynthUI { +public class SynthSpinnerUI extends BasicSpinnerUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; /** * A FocusListener implementation which causes the entire spinner to be @@ -65,6 +64,9 @@ return new SynthSpinnerUI(); } + /** + * @inheritDoc + */ @Override protected void installListeners() { super.installListeners(); @@ -79,12 +81,7 @@ } /** - * Removes the propertyChangeListener added - * by installListeners. - *

    - * This method is called by uninstallUI. - * - * @see #installListeners + * @inheritDoc */ @Override protected void uninstallListeners() { @@ -100,7 +97,7 @@ } /** - * Initialize the JSpinner border, + * Initializes the JSpinner border, * foreground, and background, properties * based on the corresponding "Spinner.*" properties from defaults table. * The JSpinners layout is set to the value returned by @@ -112,6 +109,7 @@ * @see LookAndFeel#installBorder * @see LookAndFeel#installColors */ + @Override protected void installDefaults() { LayoutManager layout = spinner.getLayout(); @@ -144,6 +142,7 @@ * @see #installDefaults * @see #uninstallUI */ + @Override protected void uninstallDefaults() { if (spinner.getLayout() instanceof UIResource) { spinner.setLayout(null); @@ -156,25 +155,19 @@ style = null; } - + /** + * @inheritDoc + */ + @Override protected LayoutManager createLayout() { return new SpinnerLayout(); } /** - * Create a component that will replace the spinner models value - * with the object returned by spinner.getPreviousValue. - * By default the previousButton is a JButton - * who's ActionListener updates it's JSpinner - * ancestors model. If a previousButton isn't needed (in a subclass) - * then override this method to return null. - * - * @return a component that will replace the spinners model with the - * next value in the sequence, or null - * @see #installUI - * @see #createNextButton + * @inheritDoc */ + @Override protected Component createPreviousButton() { JButton b = new SynthArrowButton(SwingConstants.SOUTH); b.setName("Spinner.previousButton"); @@ -184,18 +177,9 @@ /** - * Create a component that will replace the spinner models value - * with the object returned by spinner.getNextValue. - * By default the nextButton is a JButton - * who's ActionListener updates it's JSpinner - * ancestors model. If a nextButton isn't needed (in a subclass) - * then override this method to return null. - * - * @return a component that will replace the spinners model with the - * next value in the sequence, or null - * @see #installUI - * @see #createPreviousButton + * @inheritDoc */ + @Override protected Component createNextButton() { JButton b = new SynthArrowButton(SwingConstants.NORTH); b.setName("Spinner.nextButton"); @@ -227,6 +211,7 @@ * @see #replaceEditor * @see JSpinner#getEditor */ + @Override protected JComponent createEditor() { JComponent editor = spinner.getEditor(); editor.setName("Spinner.editor"); @@ -250,6 +235,7 @@ * @see #createEditor * @see #createPropertyChangeListener */ + @Override protected void replaceEditor(JComponent oldEditor, JComponent newEditor) { spinner.remove(oldEditor); spinner.add(newEditor, "Editor"); @@ -283,8 +269,12 @@ } } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { @@ -292,17 +282,10 @@ SynthLookAndFeel.getRegion(c), style, state); } - - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - - - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - - + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -314,6 +297,10 @@ } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -321,10 +308,19 @@ context.dispose(); } - + /** + * Paints the specified component. This implementation does nothing. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintSpinnerBorder(context, g, x, y, w, h); @@ -426,9 +422,11 @@ } } - + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { - String propertyName = e.getPropertyName(); JSpinner spinner = (JSpinner)(e.getSource()); SpinnerUI spinnerUI = spinner.getUI(); @@ -444,34 +442,13 @@ /** Listen to editor text field focus changes and repaint whole spinner */ private class EditorFocusHandler implements FocusListener{ /** Invoked when a editor text field gains the keyboard focus. */ - public void focusGained(FocusEvent e) { + @Override public void focusGained(FocusEvent e) { spinner.repaint(); } /** Invoked when a editor text field loses the keyboard focus. */ - public void focusLost(FocusEvent e) { + @Override public void focusLost(FocusEvent e) { spinner.repaint(); } } - - /** Override the arrowbuttons focus handling to follow the text fields focus */ - private class SpinnerArrowButton extends SynthArrowButton{ - public SpinnerArrowButton(int direction) { - super(direction); - } - - @Override - public boolean isFocusOwner() { - if (spinner == null){ - return super.isFocusOwner(); - } else if (spinner.getEditor() instanceof JSpinner.DefaultEditor){ - return ((JSpinner.DefaultEditor)spinner.getEditor()) - .getTextField().isFocusOwner(); - } else if (spinner.getEditor()!= null) { - return spinner.getEditor().isFocusOwner(); - } else { - return super.isFocusOwner(); - } - } - } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -31,19 +31,19 @@ import java.beans.*; import java.util.*; import javax.swing.*; -import javax.swing.event.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's SplitPaneUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JSplitPane}. * * @author Scott Violet + * @since 1.7 */ -class SynthSplitPaneUI extends BasicSplitPaneUI implements - PropertyChangeListener, SynthUI { +public class SynthSplitPaneUI extends BasicSplitPaneUI + implements PropertyChangeListener, SynthUI { /** * Keys to use for forward focus traversal when the JComponent is * managing focus. @@ -68,6 +68,9 @@ /** * Creates a new SynthSplitPaneUI instance + * + * @param x component to create UI object for + * @return the UI object */ public static ComponentUI createUI(JComponent x) { return new SynthSplitPaneUI(); @@ -76,6 +79,7 @@ /** * Installs the UI defaults. */ + @Override protected void installDefaults() { updateStyle(splitPane); @@ -161,6 +165,7 @@ /** * Installs the event listeners for the UI. */ + @Override protected void installListeners() { super.installListeners(); splitPane.addPropertyChangeListener(this); @@ -169,6 +174,7 @@ /** * Uninstalls the UI defaults. */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(splitPane, ENABLED); @@ -186,16 +192,20 @@ /** - * Uninstalls the event listeners for the UI. + * Uninstalls the event listeners from the UI. */ + @Override protected void uninstallListeners() { super.uninstallListeners(); splitPane.removePropertyChangeListener(this); } - + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { @@ -203,14 +213,6 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - SynthContext getContext(JComponent c, Region region) { return getContext(c, region, getComponentState(c, region)); } @@ -233,7 +235,10 @@ return state; } - + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JSplitPane)e.getSource()); @@ -243,6 +248,7 @@ /** * Creates the default divider. */ + @Override public BasicSplitPaneDivider createDefaultDivider() { SynthSplitPaneDivider divider = new SynthSplitPaneDivider(this); @@ -250,6 +256,10 @@ return divider; } + /** + * @inheritDoc + */ + @Override protected Component createDefaultNonContinuousLayoutDivider() { return new Canvas() { public void paint(Graphics g) { @@ -258,6 +268,10 @@ }; } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -268,6 +282,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -275,13 +293,22 @@ context.dispose(); } + /** + * Paints the specified component. This implementation does nothing. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { // This is done to update package private variables in // BasicSplitPaneUI super.paint(g, splitPane); } - + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintSplitPaneBorder(context, g, x, y, w, h); @@ -299,6 +326,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void finishedPaintingChildren(JSplitPane jc, Graphics g) { if(jc == splitPane && getLastDragLocation() != -1 && !isContinuousLayout() && !draggingHW) { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthStyle.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyle.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyle.java Wed Jul 05 17:04:26 2017 +0200 @@ -33,7 +33,6 @@ import java.util.HashMap; import java.util.Map; import javax.swing.text.JTextComponent; -import sun.swing.plaf.synth.SynthUI; /** * SynthStyle is a set of style properties. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthStyleFactory.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyleFactory.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthStyleFactory.java Wed Jul 05 17:04:26 2017 +0200 @@ -24,10 +24,7 @@ */ package javax.swing.plaf.synth; -import java.awt.*; -import java.util.*; -import javax.swing.plaf.*; -import javax.swing.*; +import javax.swing.JComponent; /** * Factory used for obtaining SynthStyles. Each of the diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -34,19 +34,21 @@ import java.awt.event.*; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; -import sun.swing.plaf.synth.SynthUI; import sun.swing.SwingUtilities2; /** - * A Synth L&F implementation of TabbedPaneUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JTabbedPane}. + * + *

    Looks up the {@code selectedTabPadInsets} property from the Style, + * which represents additional insets for the selected tab. * * @author Scott Violet + * @since 1.7 */ -/** - * Looks up 'selectedTabPadInsets' from the Style, which will be additional - * insets for the selected tab. - */ -class SynthTabbedPaneUI extends BasicTabbedPaneUI implements SynthUI, PropertyChangeListener { +public class SynthTabbedPaneUI extends BasicTabbedPaneUI + implements PropertyChangeListener, SynthUI { + /** *

    If non-zero, tabOverlap indicates the amount that the tab bounds * should be altered such that they would overlap with a tab on either the @@ -103,11 +105,17 @@ private boolean selectedTabIsPressed = false; + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthTabbedPaneUI(); } - SynthTabbedPaneUI() { + private SynthTabbedPaneUI() { textRect = new Rectangle(); iconRect = new Rectangle(); } @@ -116,6 +124,10 @@ return (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT); } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { updateStyle(tabPane); } @@ -175,16 +187,28 @@ tabContentStyle.getInsets(tabContentContext, null); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); tabPane.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { super.uninstallListeners(); tabPane.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(tabPane, ENABLED); style.uninstallDefaults(context); @@ -207,19 +231,19 @@ tabContentStyle = null; } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } - public SynthContext getContext(JComponent c, int state) { + private SynthContext getContext(JComponent c, int state) { return SynthContext.getContext(SynthContext.class, c, SynthLookAndFeel.getRegion(c),style, state); } - public SynthContext getContext(JComponent c, Region subregion) { - return getContext(c, subregion, getComponentState(c)); - } - private SynthContext getContext(JComponent c, Region subregion, int state){ SynthStyle style = null; Class klass = SynthContext.class; @@ -236,14 +260,10 @@ return SynthContext.getContext(klass, c, subregion, style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - + /** + * @inheritDoc + */ + @Override protected JButton createScrollButton(int direction) { // added for Nimbus LAF so that it can use the basic arrow buttons // UIManager is queried directly here because this is called before @@ -256,6 +276,10 @@ return new SynthScrollableTabButton(direction); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle(tabPane); @@ -313,6 +337,9 @@ }; } + /** + * @inheritDoc + */ @Override protected int getTabLabelShiftX(int tabPlacement, int tabIndex, boolean isSelected) { if (nudgeSelectedLabel) { @@ -322,6 +349,9 @@ } } + /** + * @inheritDoc + */ @Override protected int getTabLabelShiftY(int tabPlacement, int tabIndex, boolean isSelected) { if (nudgeSelectedLabel) { @@ -331,6 +361,10 @@ } } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -341,6 +375,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected int getBaseline(int tab) { if (tabPane.getTabComponentAt(tab) != null || getTextViewForTab(tab) != null) { @@ -361,11 +399,19 @@ return textRect.y + metrics.getAscent() + getBaselineOffset(); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintTabbedPaneBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -373,6 +419,12 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { int selectedIndex = tabPane.getSelectedIndex(); int tabPlacement = tabPane.getTabPlacement(); @@ -426,6 +478,10 @@ } + /** + * @inheritDoc + */ + @Override protected void paintTabArea(Graphics g, int tabPlacement, int selectedIndex) { // This can be invoked from ScrollabeTabPanel @@ -439,7 +495,7 @@ new Rectangle(x, y, width, height)); } - protected void paintTabArea(SynthContext ss, Graphics g, + private void paintTabArea(SynthContext ss, Graphics g, int tabPlacement, int selectedIndex, Rectangle tabAreaBounds) { Rectangle clipRect = g.getClipBounds(); @@ -493,6 +549,10 @@ } } + /** + * @inheritDoc + */ + @Override protected void setRolloverTab(int index) { int oldRolloverTab = getRolloverTab(); super.setRolloverTab(index); @@ -519,7 +579,7 @@ } } - protected void paintTab(SynthContext ss, Graphics g, + private void paintTab(SynthContext ss, Graphics g, int tabPlacement, Rectangle[] rects, int tabIndex, Rectangle iconRect, Rectangle textRect) { Rectangle tabRect = rects[tabIndex]; @@ -587,7 +647,7 @@ } } - protected void layoutLabel(SynthContext ss, int tabPlacement, + private void layoutLabel(SynthContext ss, int tabPlacement, FontMetrics metrics, int tabIndex, String title, Icon icon, Rectangle tabRect, Rectangle iconRect, @@ -614,7 +674,7 @@ textRect.y += yNudge; } - protected void paintText(SynthContext ss, + private void paintText(SynthContext ss, Graphics g, int tabPlacement, Font font, FontMetrics metrics, int tabIndex, String title, Rectangle textRect, @@ -636,7 +696,7 @@ } - protected void paintContentBorder(SynthContext ss, Graphics g, + private void paintContentBorder(SynthContext ss, Graphics g, int tabPlacement, int selectedIndex) { int width = tabPane.getWidth(); int height = tabPane.getHeight(); @@ -683,7 +743,10 @@ } } - + /** + * @inheritDoc + */ + @Override protected int calculateMaxTabHeight(int tabPlacement) { FontMetrics metrics = getFontMetrics(tabContext.getStyle().getFont( tabContext)); @@ -696,6 +759,10 @@ return result; } + /** + * @inheritDoc + */ + @Override protected int calculateTabWidth(int tabPlacement, int tabIndex, FontMetrics metrics) { Icon icon = getIconForTab(tabIndex); @@ -723,6 +790,10 @@ return width; } + /** + * @inheritDoc + */ + @Override protected int calculateMaxTabWidth(int tabPlacement) { FontMetrics metrics = getFontMetrics(tabContext.getStyle().getFont( tabContext)); @@ -735,17 +806,25 @@ return result; } + /** + * @inheritDoc + */ + @Override protected Insets getTabInsets(int tabPlacement, int tabIndex) { updateTabContext(tabIndex, false, false, false, (getFocusIndex() == tabIndex)); return tabInsets; } + /** + * @inheritDoc + */ + @Override protected FontMetrics getFontMetrics() { return getFontMetrics(tabContext.getStyle().getFont(tabContext)); } - protected FontMetrics getFontMetrics(Font font) { + private FontMetrics getFontMetrics(Font font) { return tabPane.getFontMetrics(font); } @@ -787,7 +866,8 @@ * Overridden to create a TabbedPaneLayout subclass which takes into * account tabOverlap. */ - @Override protected LayoutManager createLayoutManager() { + @Override + protected LayoutManager createLayoutManager() { if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT) { return super.createLayoutManager(); } else { /* WRAP_TAB_LAYOUT */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -32,19 +32,18 @@ import javax.swing.plaf.*; import javax.swing.plaf.basic.*; import javax.swing.table.*; - -import sun.swing.DefaultLookup; -import sun.swing.plaf.synth.*; import sun.swing.table.*; /** - * SynthTableHeaderUI implementation + * Provides the Synth L&F UI delegate for + * {@link javax.swing.table.JTableHeader}. * * @author Alan Chung * @author Philip Milne + * @since 1.7 */ -class SynthTableHeaderUI extends BasicTableHeaderUI implements - PropertyChangeListener, SynthUI { +public class SynthTableHeaderUI extends BasicTableHeaderUI + implements PropertyChangeListener, SynthUI { // // Instance Variables @@ -54,10 +53,20 @@ private SynthStyle style; + /** + * Creates a new UI object for the given component. + * + * @param h component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent h) { return new SynthTableHeaderUI(); } + /** + * @inheritDoc + */ + @Override protected void installDefaults() { prevRenderer = header.getDefaultRenderer(); if (prevRenderer instanceof UIResource) { @@ -79,11 +88,19 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void installListeners() { super.installListeners(); header.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { if (header.getDefaultRenderer() instanceof HeaderRenderer) { header.setDefaultRenderer(prevRenderer); @@ -96,11 +113,19 @@ style = null; } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { header.removePropertyChangeListener(this); super.uninstallListeners(); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -111,6 +136,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -118,10 +147,20 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { super.paint(g, context.getComponent()); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintTableHeaderBorder(context, g, x, y, w, h); @@ -129,8 +168,12 @@ // // SynthUI // + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { @@ -138,26 +181,25 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); + /** + * @inheritDoc + */ + @Override + protected void rolloverColumnUpdated(int oldColumn, int newColumn) { + header.repaint(header.getHeaderRect(oldColumn)); + header.repaint(header.getHeaderRect(newColumn)); } - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent evt) { if (SynthLookAndFeel.shouldUpdateStyle(evt)) { updateStyle((JTableHeader)evt.getSource()); } } - @Override - protected void rolloverColumnUpdated(int oldColumn, int newColumn) { - header.repaint(header.getHeaderRect(oldColumn)); - header.repaint(header.getHeaderRect(newColumn)); - } - private class HeaderRenderer extends DefaultTableCellHeaderRenderer { HeaderRenderer() { setHorizontalAlignment(JLabel.LEADING); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -54,15 +54,15 @@ import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; -import sun.swing.plaf.synth.SynthUI; - /** - * SynthTableUI implementation + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JTable}. * * @author Philip Milne + * @since 1.7 */ -class SynthTableUI extends BasicTableUI implements SynthUI, - PropertyChangeListener { +public class SynthTableUI extends BasicTableUI + implements SynthUI, PropertyChangeListener { // // Instance Variables // @@ -88,18 +88,25 @@ // The installation/uninstall procedures and support // + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthTableUI(); } /** - * Initialize JTable properties, e.g. font, foreground, and background. + * Initializes JTable properties, such as font, foreground, and background. * The font, foreground, and background properties are only set if their * current value is either null or a UIResource, other properties are set * if the current value is null. * * @see #installUI */ + @Override protected void installDefaults() { dateRenderer = installRendererIfPossible(Date.class, null); numberRenderer = installRendererIfPossible(Number.class, null); @@ -189,11 +196,16 @@ /** * Attaches listeners to the JTable. */ + @Override protected void installListeners() { super.installListeners(); table.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { table.setDefaultRenderer(Date.class, dateRenderer); table.setDefaultRenderer(Number.class, numberRenderer); @@ -213,6 +225,10 @@ style = null; } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners() { table.removePropertyChangeListener(this); super.uninstallListeners(); @@ -221,8 +237,13 @@ // // SynthUI // + + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { @@ -230,18 +251,14 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - // // Paint methods and support // + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -252,11 +269,19 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintTableBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -264,6 +289,12 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { Rectangle clip = g.getClipBounds(); @@ -647,6 +678,10 @@ } } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent event) { if (SynthLookAndFeel.shouldUpdateStyle(event)) { updateStyle((JTable)event.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -33,7 +33,6 @@ import java.awt.event.FocusListener; import java.awt.event.FocusEvent; import java.beans.PropertyChangeEvent; -import sun.swing.plaf.synth.SynthUI; /** * Provides the look and feel for a plain text editor in the @@ -50,40 +49,42 @@ * Please see {@link java.beans.XMLEncoder}. * * @author Shannon Hickey + * @since 1.7 */ -class SynthTextAreaUI extends BasicTextAreaUI implements SynthUI, FocusListener { +public class SynthTextAreaUI extends BasicTextAreaUI implements SynthUI { + private Handler handler = new Handler(); private SynthStyle style; /** - * Creates a UI for a JTextArea. + * Creates a UI object for a JTextArea. * * @param ta a text area - * @return the UI + * @return the UI object */ public static ComponentUI createUI(JComponent ta) { return new SynthTextAreaUI(); } - public void focusGained(FocusEvent e) { - getComponent().repaint(); - } - - public void focusLost(FocusEvent e) { - getComponent().repaint(); - } - + /** + * @inheritDoc + */ + @Override protected void installDefaults() { // Installs the text cursor on the component super.installDefaults(); updateStyle(getComponent()); - getComponent().addFocusListener(this); + getComponent().addFocusListener(handler); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(getComponent(), ENABLED); getComponent().putClientProperty("caretAspectRatio", null); - getComponent().removeFocusListener(this); + getComponent().removeFocusListener(handler); style.uninstallDefaults(context); context.dispose(); @@ -91,10 +92,6 @@ super.uninstallDefaults(); } - public void installUI(JComponent c) { - super.installUI(c); - } - private void updateStyle(JTextComponent comp) { SynthContext context = getContext(comp, ENABLED); SynthStyle oldStyle = style; @@ -112,8 +109,12 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { @@ -121,10 +122,10 @@ SynthLookAndFeel.getRegion(c), style, state); } - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -135,14 +136,30 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { super.paint(g, getComponent()); } + /** + * @inheritDoc + * + * Overridden to do nothing. + */ + @Override protected void paintBackground(Graphics g) { // Overriden to do nothing, all our painting is done from update/paint. } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintTextAreaBorder(context, g, x, y, w, h); @@ -158,10 +175,21 @@ * * @param evt the property change event */ + @Override protected void propertyChange(PropertyChangeEvent evt) { if (SynthLookAndFeel.shouldUpdateStyle(evt)) { updateStyle((JTextComponent)evt.getSource()); } super.propertyChange(evt); } + + private final class Handler implements FocusListener { + public void focusGained(FocusEvent e) { + getComponent().repaint(); + } + + public void focusLost(FocusEvent e) { + getComponent().repaint(); + } + } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -27,7 +27,6 @@ import javax.swing.*; import javax.swing.text.*; -import javax.swing.event.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicTextFieldUI; import java.awt.*; @@ -35,11 +34,9 @@ import java.awt.event.FocusListener; import java.beans.PropertyChangeEvent; -import sun.swing.plaf.synth.SynthUI; /** - * Basis of a look and feel for a JTextField in the Synth - * look and feel. + * Provides the Synth L&F UI delegate for {@link javax.swing.JTextField}. *

    * Warning: * Serialized objects of this class will not be compatible with @@ -51,27 +48,22 @@ * Please see {@link java.beans.XMLEncoder}. * * @author Shannon Hickey + * @since 1.7 */ -class SynthTextFieldUI - extends BasicTextFieldUI - implements SynthUI, FocusListener -{ +public class SynthTextFieldUI extends BasicTextFieldUI implements SynthUI { + private Handler handler = new Handler(); private SynthStyle style; /** * Creates a UI for a JTextField. * * @param c the text field - * @return the UI + * @return the UI object */ public static ComponentUI createUI(JComponent c) { return new SynthTextFieldUI(); } - public SynthTextFieldUI() { - super(); - } - private void updateStyle(JTextComponent comp) { SynthContext context = getContext(comp, ENABLED); SynthStyle oldStyle = style; @@ -155,8 +147,12 @@ } } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { @@ -164,10 +160,10 @@ SynthLookAndFeel.getRegion(c), style, state); } - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -178,12 +174,15 @@ } /** - * Paints the interface. This is routed to the - * paintSafely method under the guarantee that - * the model won't change from the view of this thread - * while it's rendering (if the associated model is - * derived from AbstractDocument). This enables the + * Paints the specified component. + *

    This is routed to the {@link #paintSafely} method under + * the guarantee that the model does not change from the view of this + * thread while it is rendering (if the associated model is + * derived from {@code AbstractDocument}). This enables the * model to potentially be updated asynchronously. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting */ protected void paint(SynthContext context, Graphics g) { super.paint(g, getComponent()); @@ -194,11 +193,20 @@ c.getWidth(), c.getHeight()); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintTextFieldBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + * Overridden to do nothing. + */ + @Override protected void paintBackground(Graphics g) { // Overriden to do nothing, all our painting is done from update/paint. } @@ -214,6 +222,7 @@ * * @param evt the property change event */ + @Override protected void propertyChange(PropertyChangeEvent evt) { if (SynthLookAndFeel.shouldUpdateStyle(evt)) { updateStyle((JTextComponent)evt.getSource()); @@ -221,26 +230,26 @@ super.propertyChange(evt); } - public void focusGained(FocusEvent e) { - getComponent().repaint(); - } - - public void focusLost(FocusEvent e) { - getComponent().repaint(); - } - + /** + * @inheritDoc + */ + @Override protected void installDefaults() { // Installs the text cursor on the component super.installDefaults(); updateStyle(getComponent()); - getComponent().addFocusListener(this); + getComponent().addFocusListener(handler); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults() { SynthContext context = getContext(getComponent(), ENABLED); getComponent().putClientProperty("caretAspectRatio", null); - getComponent().removeFocusListener(this); + getComponent().removeFocusListener(handler); style.uninstallDefaults(context); context.dispose(); @@ -248,7 +257,13 @@ super.uninstallDefaults(); } - public void installUI(JComponent c) { - super.installUI(c); + private final class Handler implements FocusListener { + public void focusGained(FocusEvent e) { + getComponent().repaint(); + } + + public void focusLost(FocusEvent e) { + getComponent().repaint(); + } } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -45,14 +45,15 @@ * Please see {@link java.beans.XMLEncoder}. * * @author Shannon Hickey + * @since 1.7 */ -class SynthTextPaneUI extends SynthEditorPaneUI { +public class SynthTextPaneUI extends SynthEditorPaneUI { /** * Creates a UI for the JTextPane. * * @param c the JTextPane object - * @return the UI + * @return the UI object */ public static ComponentUI createUI(JComponent c) { return new SynthTextPaneUI(); @@ -65,10 +66,15 @@ * * @return the name ("TextPane") */ + @Override protected String getPropertyPrefix() { return "TextPane"; } + /** + * @inheritDoc + */ + @Override public void installUI(JComponent c) { super.installUI(c); updateForeground(c.getForeground()); @@ -86,6 +92,7 @@ * * @param evt the property change event */ + @Override protected void propertyChange(PropertyChangeEvent evt) { super.propertyChange(evt); @@ -150,11 +157,16 @@ } } + @Override void paintBackground(SynthContext context, Graphics g, JComponent c) { context.getPainter().paintTextPaneBackground(context, g, 0, 0, c.getWidth(), c.getHeight()); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintTextPaneBorder(context, g, x, y, w, h); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -31,18 +31,30 @@ import javax.swing.plaf.ComponentUI; /** - * Synth's ToggleButtonUI. - *

    + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JToggleButton}. + * * @author Jeff Dinkins + * @since 1.7 */ -class SynthToggleButtonUI extends SynthButtonUI { +public class SynthToggleButtonUI extends SynthButtonUI { // ******************************** // Create PLAF // ******************************** + + /** + * Creates a new UI object for the given component. + * + * @param b component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent b) { return new SynthToggleButtonUI(); } + /** + * @inheritDoc + */ @Override protected String getPropertyPrefix() { return "ToggleButton."; @@ -57,6 +69,9 @@ } } + /** + * @inheritDoc + */ @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -42,39 +42,53 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicToolBarUI; import sun.swing.plaf.synth.SynthIcon; -import sun.swing.plaf.synth.SynthUI; /** - * A Synth L&F implementation of ToolBarUI. This implementation - * is a "combined" view/controller. - *

    + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JToolBar}. * + * @since 1.7 */ -class SynthToolBarUI extends BasicToolBarUI implements PropertyChangeListener, - SynthUI { - protected Icon handleIcon = null; - protected Rectangle contentRect = new Rectangle(); +public class SynthToolBarUI extends BasicToolBarUI + implements PropertyChangeListener, SynthUI { + private Icon handleIcon = null; + private Rectangle contentRect = new Rectangle(); private SynthStyle style; private SynthStyle contentStyle; private SynthStyle dragWindowStyle; + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthToolBarUI(); } + /** + * @inheritDoc + */ @Override protected void installDefaults() { toolBar.setLayout(createLayout()); updateStyle(toolBar); } + /** + * @inheritDoc + */ @Override protected void installListeners() { super.installListeners(); toolBar.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ @Override protected void uninstallListeners() { super.uninstallListeners(); @@ -106,6 +120,9 @@ context.dispose(); } + /** + * @inheritDoc + */ @Override protected void uninstallDefaults() { SynthContext context = getContext(toolBar, ENABLED); @@ -131,18 +148,33 @@ toolBar.setLayout(null); } + /** + * @inheritDoc + */ @Override protected void installComponents() {} + /** + * @inheritDoc + */ @Override protected void uninstallComponents() {} + /** + * Creates a {@code LayoutManager} to use with the toolbar. + * + * @return a {@code LayoutManager} instance + */ protected LayoutManager createLayout() { return new SynthToolBarLayoutManager(); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { @@ -161,18 +193,13 @@ style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - private int getComponentState(JComponent c, Region region) { return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -185,6 +212,9 @@ context.dispose(); } + /** + * @inheritDoc + */ @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -193,6 +223,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintToolBarBorder(context, g, x, y, w, h, @@ -200,17 +234,32 @@ } // Overloaded to do nothing so we can share listeners. + /** + * @inheritDoc + */ @Override protected void setBorderToNonRollover(Component c) {} // Overloaded to do nothing so we can share listeners. + /** + * @inheritDoc + */ @Override protected void setBorderToRollover(Component c) {} // Overloaded to do nothing so we can share listeners. + /** + * @inheritDoc + */ @Override protected void setBorderToNormal(Component c) {} + /** + * Paints the toolbar. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { if (handleIcon != null && toolBar.isFloatable()) { int startX = toolBar.getComponentOrientation().isLeftToRight() ? @@ -227,7 +276,14 @@ subcontext.dispose(); } - public void paintContent(SynthContext context, Graphics g, + /** + * Paints the toolbar content. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + * @param bounds bounding box for the toolbar + */ + protected void paintContent(SynthContext context, Graphics g, Rectangle bounds) { SynthLookAndFeel.updateSubregion(context, g, bounds); context.getPainter().paintToolBarContentBackground(context, g, @@ -238,6 +294,9 @@ toolBar.getOrientation()); } + /** + * @inheritDoc + */ @Override protected void paintDragWindow(Graphics g) { int w = dragWindow.getWidth(); @@ -258,6 +317,10 @@ // PropertyChangeListener // + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JToolBar)e.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -34,23 +34,33 @@ import javax.swing.plaf.basic.BasicToolTipUI; import javax.swing.plaf.ComponentUI; import javax.swing.text.View; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's ToolTipUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JToolTip}. * * @author Joshua Outwater + * @since 1.7 */ -class SynthToolTipUI extends BasicToolTipUI implements PropertyChangeListener, - SynthUI { +public class SynthToolTipUI extends BasicToolTipUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; - + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthToolTipUI(); } + /** + * @inheritDoc + */ + @Override protected void installDefaults(JComponent c) { updateStyle(c); } @@ -61,6 +71,10 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override protected void uninstallDefaults(JComponent c) { SynthContext context = getContext(c, ENABLED); style.uninstallDefaults(context); @@ -68,14 +82,26 @@ style = null; } + /** + * @inheritDoc + */ + @Override protected void installListeners(JComponent c) { c.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override protected void uninstallListeners(JComponent c) { c.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { return getContext(c, getComponentState(c)); } @@ -85,10 +111,6 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JComponent c) { - return SynthLookAndFeel.getRegion(c); - } - private int getComponentState(JComponent c) { JComponent comp = ((JToolTip)c).getComponent(); @@ -98,6 +120,10 @@ return SynthLookAndFeel.getComponentState(c); } + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -108,11 +134,19 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintToolTipBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -120,9 +154,14 @@ context.dispose(); } + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { JToolTip tip = (JToolTip)context.getComponent(); - String tipText = tip.getToolTipText(); Insets insets = tip.getInsets(); View v = (View)tip.getClientProperty(BasicHTML.propertyKey); @@ -140,6 +179,10 @@ } } + /** + * @inheritDoc + */ + @Override public Dimension getPreferredSize(JComponent c) { SynthContext context = getContext(c); Insets insets = c.getInsets(); @@ -164,6 +207,10 @@ return prefSize; } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JToolTip)e.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -48,15 +48,16 @@ import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import sun.swing.plaf.synth.SynthIcon; -import sun.swing.plaf.synth.SynthUI; /** - * Skinnable TreeUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JTree}. * * @author Scott Violet + * @since 1.7 */ -class SynthTreeUI extends BasicTreeUI implements PropertyChangeListener, - SynthUI { +public class SynthTreeUI extends BasicTreeUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; private SynthStyle cellStyle; @@ -67,27 +68,33 @@ private Object linesStyle; - private int leadRow; - private int padding; private boolean useTreeColors; - private Icon expandedIconWrapper; + private Icon expandedIconWrapper = new ExpandedIconWrapper(); + /** + * Creates a new UI object for the given component. + * + * @param x component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent x) { return new SynthTreeUI(); } - SynthTreeUI() { - expandedIconWrapper = new ExpandedIconWrapper(); - } - + /** + * @inheritDoc + */ @Override public Icon getExpandedIcon() { return expandedIconWrapper; } + /** + * @inheritDoc + */ @Override protected void installDefaults() { updateStyle(tree); @@ -148,15 +155,21 @@ context.dispose(); } + /** + * @inheritDoc + */ @Override protected void installListeners() { super.installListeners(); tree.addPropertyChangeListener(this); } + /** + * @inheritDoc + */ @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { @@ -164,14 +177,6 @@ SynthLookAndFeel.getRegion(c), style, state); } - private Region getRegion(JTree c) { - return SynthLookAndFeel.getRegion(c); - } - - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - private SynthContext getContext(JComponent c, Region region) { return getContext(c, region, getComponentState(c, region)); } @@ -187,6 +192,9 @@ return ENABLED | SELECTED; } + /** + * @inheritDoc + */ @Override protected TreeCellEditor createDefaultCellEditor() { TreeCellRenderer renderer = tree.getCellRenderer(); @@ -202,11 +210,17 @@ return editor; } + /** + * @inheritDoc + */ @Override protected TreeCellRenderer createDefaultCellRenderer() { return new SynthTreeCellRenderer(); } + /** + * @inheritDoc + */ @Override protected void uninstallDefaults() { SynthContext context = getContext(tree, ENABLED); @@ -226,12 +240,18 @@ } } + /** + * @inheritDoc + */ @Override protected void uninstallListeners() { super.uninstallListeners(); tree.removePropertyChangeListener(this); } + /** + * @inheritDoc + */ @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -243,11 +263,18 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { context.getPainter().paintTreeBorder(context, g, x, y, w, h); } + /** + * @inheritDoc + */ @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -256,14 +283,16 @@ context.dispose(); } - private void updateLeadRow() { - leadRow = getRowForPath(tree, tree.getLeadSelectionPath()); - } - + /** + * Paints the specified component. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { paintContext = context; - updateLeadRow(); + updateLeadSelectionRow(); Rectangle paintBounds = g.getClipBounds(); Insets insets = tree.getInsets(); @@ -288,7 +317,6 @@ boolean isExpanded; boolean hasBeenExpanded; boolean isLeaf; - Rectangle boundsBuffer = new Rectangle(); Rectangle rowBounds = new Rectangle(0, 0, tree.getWidth(),0); Rectangle bounds; TreePath path; @@ -392,83 +420,6 @@ rendererPane.removeAll(); } - private boolean isDropLine(JTree.DropLocation loc) { - return loc != null && loc.getPath() != null && loc.getChildIndex() != -1; - } - - private void paintDropLine(Graphics g) { - JTree.DropLocation loc = tree.getDropLocation(); - if (!isDropLine(loc)) { - return; - } - - Color c = (Color)style.get(paintContext, "Tree.dropLineColor"); - if (c != null) { - g.setColor(c); - Rectangle rect = getDropLineRect(loc); - g.fillRect(rect.x, rect.y, rect.width, rect.height); - } - } - - private Rectangle getDropLineRect(JTree.DropLocation loc) { - Rectangle rect; - TreePath path = loc.getPath(); - int index = loc.getChildIndex(); - boolean ltr = tree.getComponentOrientation().isLeftToRight(); - - Insets insets = tree.getInsets(); - - if (tree.getRowCount() == 0) { - rect = new Rectangle(insets.left, - insets.top, - tree.getWidth() - insets.left - insets.right, - 0); - } else { - int row = tree.getRowForPath(path); - TreeModel model = getModel(); - Object root = model.getRoot(); - - if (path.getLastPathComponent() == root - && index >= model.getChildCount(root)) { - - rect = tree.getRowBounds(tree.getRowCount() - 1); - rect.y = rect.y + rect.height; - Rectangle xRect; - - if (!tree.isRootVisible()) { - xRect = tree.getRowBounds(0); - } else if (model.getChildCount(root) == 0){ - xRect = tree.getRowBounds(0); - xRect.x += totalChildIndent; - xRect.width -= totalChildIndent + totalChildIndent; - } else { - TreePath lastChildPath = path.pathByAddingChild( - model.getChild(root, model.getChildCount(root) - 1)); - xRect = tree.getPathBounds(lastChildPath); - } - - rect.x = xRect.x; - rect.width = xRect.width; - } else { - rect = tree.getPathBounds(path.pathByAddingChild( - model.getChild(path.getLastPathComponent(), index))); - } - } - - if (rect.y != 0) { - rect.y--; - } - - if (!ltr) { - rect.x = rect.x + rect.width - 100; - } - - rect.width = 100; - rect.height = 2; - - return rect; - } - private void configureRenderer(SynthContext context) { TreeCellRenderer renderer = tree.getCellRenderer(); @@ -502,6 +453,9 @@ } } + /** + * @inheritDoc + */ @Override protected void paintHorizontalPartOfLeg(Graphics g, Rectangle clipBounds, Insets insets, Rectangle bounds, @@ -516,6 +470,9 @@ } } + /** + * @inheritDoc + */ @Override protected void paintHorizontalLine(Graphics g, JComponent c, int y, int left, int right) { @@ -523,6 +480,9 @@ paintContext, "Tree.horizontalLine", g, left, y, right, y, linesStyle); } + /** + * @inheritDoc + */ @Override protected void paintVerticalPartOfLeg(Graphics g, Rectangle clipBounds, Insets insets, @@ -532,6 +492,9 @@ } } + /** + * @inheritDoc + */ @Override protected void paintVerticalLine(Graphics g, JComponent c, int x, int top, int bottom) { @@ -539,7 +502,7 @@ paintContext, "Tree.verticalLine", g, x, top, x, bottom, linesStyle); } - protected void paintRow(TreeCellRenderer renderer, + private void paintRow(TreeCellRenderer renderer, DefaultTreeCellRenderer dtcr, SynthContext treeContext, SynthContext cellContext, Graphics g, Rectangle clipBounds, Insets insets, Rectangle bounds, Rectangle rowBounds, @@ -558,7 +521,7 @@ state |= SELECTED; } - if (tree.isFocusOwner() && row == leadRow) { + if (tree.isFocusOwner() && row == getLeadSelectionRow()) { state |= FOCUSED; } @@ -583,7 +546,7 @@ int leadIndex; if (tree.hasFocus()) { - leadIndex = leadRow; + leadIndex = getLeadSelectionRow(); } else { leadIndex = -1; @@ -625,6 +588,9 @@ paintContext.setComponentState(state); } + /** + * @inheritDoc + */ @Override protected void drawCentered(Component c, Graphics graphics, Icon icon, int x, int y) { @@ -636,6 +602,10 @@ y - h/2, w, h); } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent event) { if (SynthLookAndFeel.shouldUpdateStyle(event)) { updateStyle((JTree)event.getSource()); @@ -648,6 +618,24 @@ } } + /** + * @inheritDoc + */ + @Override + protected void paintDropLine(Graphics g) { + JTree.DropLocation loc = tree.getDropLocation(); + if (!isDropLine(loc)) { + return; + } + + Color c = (Color)style.get(paintContext, "Tree.dropLineColor"); + if (c != null) { + g.setColor(c); + Rectangle rect = getDropLineRect(loc); + g.fillRect(rect.x, rect.y, rect.width, rect.height); + } + } + private void repaintDropLocation(JTree.DropLocation loc) { if (loc == null) { return; @@ -670,6 +658,9 @@ } } + /** + * @inheritDoc + */ @Override protected int getRowX(int row, int depth) { return super.getRowX(row, depth) + padding; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthUI.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -0,0 +1,58 @@ +/* + * Copyright 2002-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 javax.swing.plaf.synth; + +import java.awt.Graphics; +import javax.swing.JComponent; + +/** + * SynthUI is used to fetch the SynthContext for a particular Component. + * + * @author Scott Violet + * @since 1.7 + */ +public interface SynthUI extends SynthConstants { + + /** + * Returns the Context for the specified component. + * + * @param c Component requesting SynthContext. + * @return SynthContext describing component. + */ + public SynthContext getContext(JComponent c); + + /** + * Paints the border. + * + * @param context a component context + * @param g {@code Graphics} to paint on + * @param x the X coordinate + * @param y the Y coordinate + * @param w width of the border + * @param h height of the border + */ + public void paintBorder(SynthContext context, Graphics g, int x, + int y, int w, int h); +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java Wed Jul 05 17:04:26 2017 +0200 @@ -25,40 +25,57 @@ package javax.swing.plaf.synth; -import java.awt.*; import java.beans.*; import javax.swing.*; -import javax.swing.border.*; import javax.swing.plaf.*; import java.awt.*; -import java.awt.event.*; -import sun.swing.plaf.synth.SynthUI; /** - * Synth's ViewportUI. + * Provides the Synth L&F UI delegate for + * {@link javax.swing.JViewport}. * + * @since 1.7 */ -class SynthViewportUI extends ViewportUI implements - PropertyChangeListener, SynthUI { +public class SynthViewportUI extends ViewportUI + implements PropertyChangeListener, SynthUI { private SynthStyle style; + /** + * Creates a new UI object for the given component. + * + * @param c component to create UI object for + * @return the UI object + */ public static ComponentUI createUI(JComponent c) { return new SynthViewportUI(); } + /** + * @inheritDoc + */ + @Override public void installUI(JComponent c) { super.installUI(c); installDefaults(c); installListeners(c); } + /** + * @inheritDoc + */ + @Override public void uninstallUI(JComponent c) { super.uninstallUI(c); uninstallListeners(c); uninstallDefaults(c); } + /** + * Installs defaults for a viewport. + * + * @param c a {@code JViewport} object + */ protected void installDefaults(JComponent c) { updateStyle(c); } @@ -85,14 +102,29 @@ context.dispose(); } + /** + * Installs listeners into the viewport. + * + * @param c a {@code JViewport} object + */ protected void installListeners(JComponent c) { c.addPropertyChangeListener(this); } + /** + * Uninstalls listeners from the viewport. + * + * @param c a {@code JViewport} object + */ protected void uninstallListeners(JComponent c) { c.removePropertyChangeListener(this); } + /** + * Uninstalls defaults from a viewport. + * + * @param c a {@code JViewport} object + */ protected void uninstallDefaults(JComponent c) { SynthContext context = getContext(c, ENABLED); style.uninstallDefaults(context); @@ -100,8 +132,12 @@ style = null; } + /** + * @inheritDoc + */ + @Override public SynthContext getContext(JComponent c) { - return getContext(c, getComponentState(c)); + return getContext(c, SynthLookAndFeel.getComponentState(c)); } private SynthContext getContext(JComponent c, int state) { @@ -113,10 +149,10 @@ return SynthLookAndFeel.getRegion(c); } - private int getComponentState(JComponent c) { - return SynthLookAndFeel.getComponentState(c); - } - + /** + * @inheritDoc + */ + @Override public void update(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -127,12 +163,20 @@ context.dispose(); } + /** + * @inheritDoc + */ + @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { // This does nothing on purpose, JViewport doesn't allow a border // and therefor this will NEVER be called. } + /** + * @inheritDoc + */ + @Override public void paint(Graphics g, JComponent c) { SynthContext context = getContext(c); @@ -140,9 +184,19 @@ context.dispose(); } + /** + * Paints the specified component. This implementation does nothing. + * + * @param context context for the component being painted + * @param g {@code Graphics} object used for painting + */ protected void paint(SynthContext context, Graphics g) { } + /** + * @inheritDoc + */ + @Override public void propertyChange(PropertyChangeEvent e) { if (SynthLookAndFeel.shouldUpdateStyle(e)) { updateStyle((JComponent)e.getSource()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/org/ietf/jgss/GSSContext.java --- a/jdk/src/share/classes/org/ietf/jgss/GSSContext.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/org/ietf/jgss/GSSContext.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.

    * - * 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.

    * @@ -826,7 +826,7 @@ * are not definitive then the method will attempt to treat all * available bytes as part of the token.

    * - * 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.

    * @@ -917,7 +917,7 @@ * getMutualAuthState} method.

    * * @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 * initSecContext. 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 * initSecContext. During context establishment sequence diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/awt/AWTAccessor.java --- a/jdk/src/share/classes/sun/awt/AWTAccessor.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); } /* diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/awt/AppContext.java --- a/jdk/src/share/classes/sun/awt/AppContext.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/awt/AppContext.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 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 threadAppContext = diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/awt/ComponentAccessor.java --- a/jdk/src/share/classes/sun/awt/ComponentAccessor.java Wed Dec 16 23:39:39 2009 -0800 +++ /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; - } - -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/awt/GlobalCursorManager.java --- a/jdk/src/share/classes/sun/awt/GlobalCursorManager.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/awt/GlobalCursorManager.java Wed Jul 05 17:04:26 2017 +0200 @@ -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. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/awt/SunToolkit.java --- a/jdk/src/share/classes/sun/awt/SunToolkit.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/awt/SunToolkit.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/awt/WindowAccessor.java --- a/jdk/src/share/classes/sun/awt/WindowAccessor.java Wed Dec 16 23:39:39 2009 -0800 +++ /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); - } - } -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java --- a/jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 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 fileList = castToFiles(list, userProtectionDomain); + final ArrayList uriList = new ArrayList(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 fileList) throws IOException; + private String removeSuspectedData(DataFlavor flavor, final Transferable contents, final String str) throws IOException { @@ -1452,6 +1473,33 @@ return true; } + private ArrayList castToFiles(final List files, + final ProtectionDomain userProtectionDomain) throws IOException + { + final ArrayList fileList = new ArrayList(); + 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. */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/font/StandardGlyphVector.java --- a/jdk/src/share/classes/sun/font/StandardGlyphVector.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/font/StandardGlyphVector.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/net/www/protocol/http/spnego/NegotiatorImpl.java --- a/jdk/src/share/classes/sun/net/www/protocol/http/spnego/NegotiatorImpl.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/net/www/protocol/http/spnego/NegotiatorImpl.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/jgss/GSSContextImpl.java --- a/jdk/src/share/classes/sun/security/jgss/GSSContextImpl.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/jgss/GSSContextImpl.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; + } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/jgss/krb5/InitialToken.java --- a/jdk/src/share/classes/sun/security/jgss/krb5/InitialToken.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/jgss/krb5/InitialToken.java Wed Jul 05 17:04:26 2017 +0200 @@ -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) diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java --- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Wed Jul 05 17:04:26 2017 +0200 @@ -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. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/jgss/spi/GSSContextSpi.java --- a/jdk/src/share/classes/sun/security/jgss/spi/GSSContextSpi.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/jgss/spi/GSSContextSpi.java Wed Jul 05 17:04:26 2017 +0200 @@ -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(); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java --- a/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java Wed Jul 05 17:04:26 2017 +0200 @@ -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."); } } +} -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/jgss/spnego/SpNegoMechFactory.java --- a/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoMechFactory.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoMechFactory.java Wed Jul 05 17:04:26 2017 +0200 @@ -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>> 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, diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/pkcs/PKCS10.java --- a/jdk/src/share/classes/sun/security/pkcs/PKCS10.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/pkcs/PKCS10.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 /* diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/provider/IdentityDatabase.java --- a/jdk/src/share/classes/sun/security/provider/IdentityDatabase.java Wed Dec 16 23:39:39 2009 -0800 +++ /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 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(); - } - - /** - * 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 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 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() { - public Void run() { - initializeSystem(); - return null; - } - }); - } - - /** - * This method initializes the system's identity database. The - * canonical location is - * /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); - } -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/provider/PolicyFile.java --- a/jdk/src/share/classes/sun/security/provider/PolicyFile.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/provider/PolicyFile.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 = new AtomicReference(); 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() { - 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() { - 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.

    diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/provider/SystemIdentity.java --- a/jdk/src/share/classes/sun/security/provider/SystemIdentity.java Wed Dec 16 23:39:39 2009 -0800 +++ /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 + "]"; - } - - -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/provider/SystemSigner.java --- a/jdk/src/share/classes/sun/security/provider/SystemSigner.java Wed Dec 16 23:39:39 2009 -0800 +++ /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 + "]"; - } -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/provider/certpath/OCSPChecker.java --- a/jdk/src/share/classes/sun/security/provider/certpath/OCSPChecker.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/provider/certpath/OCSPChecker.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/tools/JarSigner.java --- a/jdk/src/share/classes/sun/security/tools/JarSigner.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/tools/JarSigner.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/tools/KeyTool.java --- a/jdk/src/share/classes/sun/security/tools/KeyTool.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/tools/KeyTool.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 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 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 ...")); - 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")); } /** diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/util/SecurityConstants.java --- a/jdk/src/share/classes/sun/security/util/SecurityConstants.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/util/SecurityConstants.java Wed Jul 05 17:04:26 2017 +0200 @@ -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"); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/validator/PKIXValidator.java --- a/jdk/src/share/classes/sun/security/validator/PKIXValidator.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/validator/PKIXValidator.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); } } - } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/x509/CertAndKeyGen.java --- a/jdk/src/share/classes/sun/security/x509/CertAndKeyGen.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/security/x509/CertAndKeyGen.java Wed Jul 05 17:04:26 2017 +0200 @@ -190,41 +190,6 @@ /** - * Returns a self-signed X.509v1 certificate for the public key. - * The certificate is immediately valid. - * - *

    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 - * - * @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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/x509/X500Signer.java --- a/jdk/src/share/classes/sun/security/x509/X500Signer.java Wed Dec 16 23:39:39 2009 -0800 +++ /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. - * - *

    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. - * - *

    The X.509 certificate chain is temporarily not associated with - * the signer, but this omission will be resolved. - * - * - * @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; -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/security/x509/X509Cert.java --- a/jdk/src/share/classes/sun/security/x509/X509Cert.java Wed Dec 16 23:39:39 2009 -0800 +++ /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 - * decode 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 signs and encodes the - * certificate. Also, self-signed certificates serve as CA certificates, - * and are sometimes used as certificate requests. - * - *

    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. - * - *

    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 getIssuerName */ - public Principal getGuarantor () // for Certificate - { return getIssuerName (); } - - - /** Returns getSubjectName */ - 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 not indicate that one should - * trust the entity which it represents. - * - *

    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. - * - *

    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. - * - * - * @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). - * - *

    NOTE: 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. - * - * @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. - * - *

    NOTE: 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. - * - * @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. - * - *

    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); } -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/swing/plaf/synth/SynthUI.java --- a/jdk/src/share/classes/sun/swing/plaf/synth/SynthUI.java Wed Dec 16 23:39:39 2009 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/* - * Copyright 2002-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.swing.plaf.synth; - -import java.awt.Graphics; -import javax.swing.JComponent; -import javax.swing.plaf.synth.*; - -/** - * SynthUI is used to fetch the SynthContext for a particular Component. - * - * @author Scott Violet - */ -public interface SynthUI extends SynthConstants { - /** - * Returns the Context for the specified component. - * - * @param c Component requesting SynthContext. - * @return SynthContext describing component. - */ - public SynthContext getContext(JComponent c); - - /** - * Paints the border. - */ - public void paintBorder(SynthContext context, Graphics g, int x, - int y, int w, int h); -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/tools/jar/JarVerifierStream.java --- a/jdk/src/share/classes/sun/tools/jar/JarVerifierStream.java Wed Dec 16 23:39:39 2009 -0800 +++ /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> verified - = new Hashtable>(); - 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:

      - * - *
    • Manifest files. At any point, this stream can be queried - * for a manifest. If it is present, a Manifest object will be - * returned. - * - *
    • Block Signature file. Like with the manifest, the stream - * can be queried at any time for all blocks parsed thus far. - * - *
    - */ - 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 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 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 = null; - - - /** - * Returns the Identity vector for the given array of Certificates - */ - protected Vector getIds(Certificate[] certs) { - if (certs == null) - return null; - - if (certCache == null) - certCache = new ArrayList(); - 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() { - 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(); - 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; - } -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/tracing/MultiplexProviderFactory.java --- a/jdk/src/share/classes/sun/tracing/MultiplexProviderFactory.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/tracing/MultiplexProviderFactory.java Wed Jul 05 17:04:26 2017 +0200 @@ -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(); } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/tracing/NullProviderFactory.java --- a/jdk/src/share/classes/sun/tracing/NullProviderFactory.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/tracing/NullProviderFactory.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 createProvider(Class 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(); } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/tracing/PrintStreamProviderFactory.java --- a/jdk/src/share/classes/sun/tracing/PrintStreamProviderFactory.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/tracing/PrintStreamProviderFactory.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 createProvider(Class 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(); } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/tracing/ProviderSkeleton.java --- a/jdk/src/share/classes/sun/tracing/ProviderSkeleton.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/tracing/ProviderSkeleton.java Wed Jul 05 17:04:26 2017 +0200 @@ -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() { + 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"); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/tracing/dtrace/DTraceProviderFactory.java --- a/jdk/src/share/classes/sun/tracing/dtrace/DTraceProviderFactory.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/share/classes/sun/tracing/dtrace/DTraceProviderFactory.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java --- a/jdk/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java Wed Dec 16 23:39:39 2009 -0800 +++ /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 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 getCandidateLocales(String baseName, Locale locale) { - List 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; - } -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java.template --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java.template Wed Jul 05 17:04:26 2017 +0200 @@ -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 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 getCandidateLocales(String baseName, Locale locale) { + List 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; + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/util/LocaleDataMetaInfo-XLocales.java --- a/jdk/src/share/classes/sun/util/LocaleDataMetaInfo-XLocales.java Wed Dec 16 23:39:39 2009 -0800 +++ /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 resourceNameToLocales = - new HashMap(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); - } - -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/share/classes/sun/util/LocaleDataMetaInfo-XLocales.java.template --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/util/LocaleDataMetaInfo-XLocales.java.template Wed Jul 05 17:04:26 2017 +0200 @@ -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 resourceNameToLocales = + new HashMap(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); + } + +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/bin/java_md.c --- a/jdk/src/solaris/bin/java_md.c Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/bin/java_md.c Wed Jul 05 17:04:26 2017 +0200 @@ -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); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/InfoWindow.java --- a/jdk/src/solaris/classes/sun/awt/X11/InfoWindow.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/InfoWindow.java Wed Jul 05 17:04:26 2017 +0200 @@ -45,6 +45,7 @@ protected InfoWindow(Frame parent, Color borderColor) { super(parent); + setType(Window.Type.POPUP); container = new Container() { @Override public Insets getInsets() { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java --- a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XContentWindow.java --- a/jdk/src/solaris/classes/sun/awt/X11/XContentWindow.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XContentWindow.java Wed Jul 05 17:04:26 2017 +0200 @@ -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)); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XDataTransferer.java --- a/jdk/src/solaris/classes/sun/awt/X11/XDataTransferer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XDataTransferer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 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 uriList = new ArrayList(); + 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. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java --- a/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XDialogPeer.java --- a/jdk/src/solaris/classes/sun/awt/X11/XDialogPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XDialogPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XDragSourceContextPeer.java --- a/jdk/src/solaris/classes/sun/awt/X11/XDragSourceContextPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XDragSourceContextPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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(); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxy.java --- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxy.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedChildProxy.java Wed Jul 05 17:04:26 2017 +0200 @@ -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(); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XEmbedClientHelper.java --- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedClientHelper.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedClientHelper.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XEmbedHelper.java --- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedHelper.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedHelper.java Wed Jul 05 17:04:26 2017 +0200 @@ -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(); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XGlobalCursorManager.java --- a/jdk/src/solaris/classes/sun/awt/X11/XGlobalCursorManager.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XGlobalCursorManager.java Wed Jul 05 17:04:26 2017 +0200 @@ -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(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. */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XKeysym.java --- a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Wed Jul 05 17:04:26 2017 +0200 @@ -69,6 +69,8 @@ static Hashtable javaKeycode2KeysymHash = new Hashtable(); 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 ) { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java --- a/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java Wed Jul 05 17:04:26 2017 +0200 @@ -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"); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java --- a/jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XTextFieldPeer.java --- a/jdk/src/solaris/classes/sun/awt/X11/XTextFieldPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XTextFieldPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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()); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XToolkit.java --- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 overrideRedirectWindows = - new WeakHashMap(); - 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 { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java --- a/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 // *************************************** diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XWindow.java --- a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java --- a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 toplevelStateListeners = new Vector(); 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() { + 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)) { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java --- a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h --- a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Wed Jul 05 17:04:26 2017 +0200 @@ -107,6 +107,8 @@ tojava static Hashtable javaKeycode2KeysymHash = new Hashtable(); 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 ) { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/lib/flavormap.properties --- a/jdk/src/solaris/lib/flavormap.properties Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/lib/flavormap.properties Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_PCM.c --- a/jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_PCM.c Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_PCM.c Wed Jul 05 17:04:26 2017 +0200 @@ -143,8 +143,12 @@ ERROR1("snd_pcm_hw_params_malloc returned error %d\n", ret); } else { ret = snd_pcm_hw_params_any(handle, hwParams); - if (ret != 0) { - ERROR1("snd_pcm_hw_params_any returned error %d\n", ret); + /* snd_pcm_hw_params_any can return a positive value on success too */ + if (ret < 0) { + ERROR1("snd_pcm_hw_params_any returned error %d\n", ret); + } else { + /* for the logic following this code, set ret to 0 to indicate success */ + ret = 0; } } snd_pcm_hw_params_get_format_mask(hwParams, formatMask); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/solaris/native/sun/xawt/XlibWrapper.c --- a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c Wed Jul 05 17:04:26 2017 +0200 @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -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, diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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) { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/classes/sun/awt/windows/WDataTransferer.java --- a/jdk/src/windows/classes/sun/awt/windows/WDataTransferer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/classes/sun/awt/windows/WDataTransferer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 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. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/classes/sun/awt/windows/WDialogPeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WDialogPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/classes/sun/awt/windows/WDialogPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 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); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 toBlock) { for (Window w : toBlock) { - WWindowPeer wp = (WWindowPeer)ComponentAccessor.getPeer(w); + WWindowPeer wp = (WWindowPeer)AWTAccessor.getComponentAccessor().getPeer(w); if (wp != null) { blockWindow(wp); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/classes/sun/awt/windows/WFramePeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WFramePeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/classes/sun/awt/windows/WFramePeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -136,6 +136,7 @@ native void createAwtFrame(WComponentPeer parent); void create(WComponentPeer parent) { + preCreate(parent); createAwtFrame(parent); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 toBlock) { for (Window w : toBlock) { - WWindowPeer wp = (WWindowPeer)ComponentAccessor.getPeer(w); + WWindowPeer wp = (WWindowPeer)AWTAccessor.getComponentAccessor().getPeer(w); if (wp != null) { blockWindow(wp); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java --- a/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/lib/tzmappings --- a/jdk/src/windows/lib/tzmappings Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/lib/tzmappings Wed Jul 05 17:04:26 2017 +0200 @@ -92,7 +92,7 @@ North Asia Standard Time:14,15::Asia/Krasnoyarsk: SE Asia:14,15::Asia/Bangkok: SE Asia Standard Time:14,15::Asia/Bangkok: -North Asia East Standard Time:16,17::Asia/Ulaanbaatar: +North Asia East Standard Time:16,17:RU:Asia/Irkutsk: Singapore:16,17:SG:Asia/Singapore: Singapore Standard Time:16,17:SG:Asia/Singapore: Taipei:16,17::Asia/Taipei: @@ -184,4 +184,5 @@ Kamchatka Standard Time:916,916:RU:Asia/Kamchatka: Paraguay Standard Time:917,917:PY:America/Asuncion: Western Brazilian Standard Time:918,918:BR:America/Rio_Branco: -Armenian Standard Time:919,919:AM:Asia/Yerevan: +Ulaanbaatar Standard Time:919,919::Asia/Ulaanbaatar: +Armenian Standard Time:920,920:AM:Asia/Yerevan: diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp --- a/jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp Wed Jul 05 17:04:26 2017 +0200 @@ -485,7 +485,7 @@ } if (data.line2Start->isSource) { data.startResult = - data.line2Start->playBuffer->Play(0, 0, DSCBSTART_LOOPING); + data.line2Start->playBuffer->Play(0, 0, DSBPLAY_LOOPING); } else { data.startResult = data.line2Start->captureBuffer->Start(DSCBSTART_LOOPING); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/native/sun/windows/awt_Dialog.cpp --- a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/native/sun/windows/awt_DnDDS.cpp --- a/jdk/src/windows/native/sun/windows/awt_DnDDS.cpp Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/native/sun/windows/awt_DnDDS.cpp Wed Jul 05 17:04:26 2017 +0200 @@ -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); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/native/sun/windows/awt_Toolkit.cpp --- a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Wed Jul 05 17:04:26 2017 +0200 @@ -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. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/native/sun/windows/awt_Window.cpp --- a/jdk/src/windows/native/sun/windows/awt_Window.cpp Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp Wed Jul 05 17:04:26 2017 +0200 @@ -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; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/src/windows/native/sun/windows/awt_Window.h --- a/jdk/src/windows/native/sun/windows/awt_Window.h Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/src/windows/native/sun/windows/awt_Window.h Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/Makefile --- a/jdk/test/Makefile Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/Makefile Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/ProblemList.txt Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/BadHandshakeTest.java --- a/jdk/test/com/sun/jdi/BadHandshakeTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/BadHandshakeTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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"; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/DoubleAgentTest.java --- a/jdk/test/com/sun/jdi/DoubleAgentTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/DoubleAgentTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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"; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/ExclusiveBind.java --- a/jdk/test/com/sun/jdi/ExclusiveBind.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/ExclusiveBind.java Wed Jul 05 17:04:26 2017 +0200 @@ -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"; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/JITDebug.sh --- a/jdk/test/com/sun/jdi/JITDebug.sh Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/JITDebug.sh Wed Jul 05 17:04:26 2017 +0200 @@ -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" diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/RepStep.java --- a/jdk/test/com/sun/jdi/RepStep.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/RepStep.java Wed Jul 05 17:04:26 2017 +0200 @@ -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). diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/RunToExit.java --- a/jdk/test/com/sun/jdi/RunToExit.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/RunToExit.java Wed Jul 05 17:04:26 2017 +0200 @@ -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"; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/ShellScaffold.sh --- a/jdk/test/com/sun/jdi/ShellScaffold.sh Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/ShellScaffold.sh Wed Jul 05 17:04:26 2017 +0200 @@ -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] $ + # + # + # 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 } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/SimulResumerTest.java --- a/jdk/test/com/sun/jdi/SimulResumerTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/SimulResumerTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/Solaris32AndSolaris64Test.sh --- a/jdk/test/com/sun/jdi/Solaris32AndSolaris64Test.sh Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/Solaris32AndSolaris64Test.sh Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/VMConnection.java --- a/jdk/test/com/sun/jdi/VMConnection.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/VMConnection.java Wed Jul 05 17:04:26 2017 +0200 @@ -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. diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java --- a/jdk/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/connect/spi/DebugUsingCustomConnector.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/connect/spi/GeneratedConnectors.java --- a/jdk/test/com/sun/jdi/connect/spi/GeneratedConnectors.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/connect/spi/GeneratedConnectors.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java --- a/jdk/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/jdi/redefine/RedefineTest.java --- a/jdk/test/com/sun/jdi/redefine/RedefineTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/com/sun/jdi/redefine/RedefineTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/com/sun/tracing/BasicWithSecurityMgr.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/com/sun/tracing/BasicWithSecurityMgr.java Wed Jul 05 17:04:26 2017 +0200 @@ -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) {} + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/demo/jvmti/hprof/CpuOldTest.java --- a/jdk/test/demo/jvmti/hprof/CpuOldTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/demo/jvmti/hprof/CpuOldTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/demo/jvmti/hprof/CpuSamplesTest.java --- a/jdk/test/demo/jvmti/hprof/CpuSamplesTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/demo/jvmti/hprof/CpuSamplesTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/demo/jvmti/hprof/CpuTimesDefineClassTest.java --- a/jdk/test/demo/jvmti/hprof/CpuTimesDefineClassTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/demo/jvmti/hprof/CpuTimesDefineClassTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 * diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/demo/jvmti/hprof/CpuTimesTest.java --- a/jdk/test/demo/jvmti/hprof/CpuTimesTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/demo/jvmti/hprof/CpuTimesTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/demo/jvmti/hprof/HeapAllTest.java --- a/jdk/test/demo/jvmti/hprof/HeapAllTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/demo/jvmti/hprof/HeapAllTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/demo/jvmti/hprof/HeapBinaryFormatTest.java --- a/jdk/test/demo/jvmti/hprof/HeapBinaryFormatTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/demo/jvmti/hprof/HeapBinaryFormatTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/demo/jvmti/hprof/HeapDumpTest.java --- a/jdk/test/demo/jvmti/hprof/HeapDumpTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/demo/jvmti/hprof/HeapDumpTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/demo/jvmti/hprof/HeapSitesTest.java --- a/jdk/test/demo/jvmti/hprof/HeapSitesTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/demo/jvmti/hprof/HeapSitesTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/demo/jvmti/hprof/OptionsTest.java --- a/jdk/test/demo/jvmti/hprof/OptionsTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/demo/jvmti/hprof/OptionsTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/EventQueue/PushPopDeadlock2/PushPopTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/EventQueue/PushPopDeadlock2/PushPopTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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(); + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/KeyboardFocusmanager/TypeAhead/TestDialogTypeAhead.java --- a/jdk/test/java/awt/KeyboardFocusmanager/TypeAhead/TestDialogTypeAhead.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/awt/KeyboardFocusmanager/TypeAhead/TestDialogTypeAhead.java Wed Jul 05 17:04:26 2017 +0200 @@ -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(); } } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/Window/WindowType/WindowType.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Window/WindowType/WindowType.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/AbsoluteComponentCenterCalculator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/AbsoluteComponentCenterCalculator.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/DragUnicodeBetweenJVMTest.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/DragUnicodeBetweenJVMTest.html Wed Jul 05 17:04:26 2017 +0200 @@ -0,0 +1,25 @@ + + + + REG: DnD of File-List between JVM is broken for non ASCII file names - Win32 + + + +

    DragUnicodeBetweenJVMTest
    Bug ID: 5098433

    + +

    This is an AUTOMATIC test, simply wait for completion

    + + + + diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/DragUnicodeBetweenJVMTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/DragUnicodeBetweenJVMTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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(); + } + } + + +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/FileListTransferable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/FileListTransferable.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 list = Arrays.asList(files); + return list; + + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/InterprocessMessages.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/InterprocessMessages.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; +} + diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/NextFramePositionCalculator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/NextFramePositionCalculator.java Wed Jul 05 17:04:26 2017 +0200 @@ -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(); + } + +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/SourcePanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/SourcePanel.java Wed Jul 05 17:04:26 2017 +0200 @@ -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()); + } + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/TargetPanel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/datatransfer/DragUnicodeBetweenJVMTest/TargetPanel.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 content = new ArrayList(); + + //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 iterator = content.iterator(); iterator.hasNext();i++) { + g.drawString(iterator.next().getName(), 5, g.getFontMetrics().getAscent()*i+20); + } + + } + +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/dnd/URIListBetweenJVMsTest/FileListTransferable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/dnd/URIListBetweenJVMsTest/FileListTransferable.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 list; + + public FileListTransferable(java.util.List 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); + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/dnd/URIListBetweenJVMsTest/InterprocessMessages.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/dnd/URIListBetweenJVMsTest/InterprocessMessages.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/dnd/URIListBetweenJVMsTest/SourceFileListFrame.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/dnd/URIListBetweenJVMsTest/SourceFileListFrame.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 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 extractListOfFiles(DropTargetDropEvent dtde) { + BufferedReader reader = null; + ArrayList files = new ArrayList(); + 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)); + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/dnd/URIListBetweenJVMsTest/URIListBetweenJVMsTest.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/dnd/URIListBetweenJVMsTest/URIListBetweenJVMsTest.html Wed Jul 05 17:04:26 2017 +0200 @@ -0,0 +1,25 @@ + + + + DnD of URI-List across JVM + + + +

    URIListBetweenJVMsTest
    Bug ID: 4899516

    + +

    This is an AUTOMATIC test, simply wait for completion

    + + + + diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/dnd/URIListBetweenJVMsTest/URIListBetweenJVMsTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/dnd/URIListBetweenJVMsTest/URIListBetweenJVMsTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/font/GlyphVector/VisualBounds.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/font/GlyphVector/VisualBounds.java Wed Jul 05 17:04:26 2017 +0200 @@ -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"); + } + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/awt/regtesthelpers/process/ProcessCommunicator.java --- a/jdk/test/java/awt/regtesthelpers/process/ProcessCommunicator.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/awt/regtesthelpers/process/ProcessCommunicator.java Wed Jul 05 17:04:26 2017 +0200 @@ -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); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/beans/EventHandler/Test6788531.java --- a/jdk/test/java/beans/EventHandler/Test6788531.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/beans/EventHandler/Test6788531.java Wed Jul 05 17:04:26 2017 +0200 @@ -36,7 +36,7 @@ public static void main(String[] args) throws Exception { JButton button = new JButton("hi"); button.addActionListener(EventHandler.create(ActionListener.class, new Private(), "run")); - button.addActionListener(EventHandler.create(ActionListener.class, new PrivateGeneric(), "run", "generic")); + button.addActionListener(EventHandler.create(ActionListener.class, new PrivateGeneric(), "run", "actionCommand")); button.doClick(); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/beans/Introspector/Test5102804.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/Introspector/Test5102804.java Wed Jul 05 17:04:26 2017 +0200 @@ -0,0 +1,155 @@ +/* + * 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 5102804 + * @summary Tests memory leak + * @author Sergey Malenkov + */ + +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.beans.SimpleBeanInfo; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.net.URL; +import java.net.URLClassLoader; + +public class Test5102804 { + private static final String BEAN_NAME = "Test5102804$Example"; + private static final String BEAN_INFO_NAME = BEAN_NAME + "BeanInfo"; + + public static void main(String[] args) { + if (!isCollectible(getReference())) + throw new Error("Reference is not collected"); + } + + private static Reference getReference() { + try { + ClassLoader loader = new Loader(); + Class type = Class.forName(BEAN_NAME, true, loader); + if (!type.getClassLoader().equals(loader)) { + throw new Error("Wrong class loader"); + } + BeanInfo info = Introspector.getBeanInfo(type); + if (0 != info.getDefaultPropertyIndex()) { + throw new Error("Wrong bean info found"); + } + return new WeakReference(type); + } + catch (IntrospectionException exception) { + throw new Error("Introspection Error", exception); + } + catch (ClassNotFoundException exception) { + throw new Error("Class Not Found", exception); + } + } + + private static boolean isCollectible(Reference reference) { + int[] array = new int[10]; + while (true) { + try { + array = new int[array.length + array.length / 3]; + } + catch (OutOfMemoryError error) { + return null == reference.get(); + } + } + } + + /** + * Custom class loader to load the Example class by itself. + * Could also load it from a different code source, but this is easier to set up. + */ + private static final class Loader extends URLClassLoader { + Loader() { + super(new URL[] { + Test5102804.class.getProtectionDomain().getCodeSource().getLocation() + }); + } + + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + Class c = findLoadedClass(name); + if (c == null) { + if (BEAN_NAME.equals(name) || BEAN_INFO_NAME.equals(name)) { + c = findClass(name); + } + else try { + c = getParent().loadClass(name); + } + catch (ClassNotFoundException exception) { + c = findClass(name); + } + } + if (resolve) { + resolveClass(c); + } + return c; + } + } + + /** + * A simple bean to load from the Loader class, not main class loader. + */ + public static final class Example { + private int value; + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + } + + /** + * The BeanInfo for the Example class. + * It is also loaded from the Loader class. + */ + public static final class ExampleBeanInfo extends SimpleBeanInfo { + @Override + public int getDefaultPropertyIndex() { + return 0; + } + + @Override + public PropertyDescriptor[] getPropertyDescriptors() { + try { + return new PropertyDescriptor[] { + new PropertyDescriptor("value", Class.forName(BEAN_NAME)) + }; + } + catch (ClassNotFoundException exception) { + return null; + } + catch (IntrospectionException exception) { + return null; + } + } + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/beans/XMLEncoder/6329581/Test6329581.java --- a/jdk/test/java/beans/XMLEncoder/6329581/Test6329581.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/beans/XMLEncoder/6329581/Test6329581.java Wed Jul 05 17:04:26 2017 +0200 @@ -33,43 +33,70 @@ import java.beans.XMLEncoder; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.File; import java.net.URL; import java.net.URLClassLoader; -public class Test6329581 implements ExceptionListener { +public class Test6329581 extends URLClassLoader implements ExceptionListener { + public static final class Bean { + } public static void main(String[] args) throws Exception { - ExceptionListener listener = new Test6329581(); - // write bean to byte array - ByteArrayOutputStream out = new ByteArrayOutputStream(); - XMLEncoder encoder = new XMLEncoder(out); - encoder.setExceptionListener(listener); - encoder.writeObject(getClassLoader("beans.jar").loadClass("test.Bean").newInstance()); - encoder.close(); - // read bean from byte array - ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); - XMLDecoder decoder = new XMLDecoder(in, null, listener, getClassLoader("beans.jar")); - Object object = decoder.readObject(); - decoder.close(); + new Test6329581().decode(new Test6329581().encode(Bean.class.getName())); + } - if (!object.getClass().getClassLoader().getClass().equals(URLClassLoader.class)) { - throw new Error("bean is loaded with unexpected class loader"); - } + private Test6329581() { + super(new URL[] { + Test6329581.class.getProtectionDomain().getCodeSource().getLocation() + }); } - private static ClassLoader getClassLoader(String name) throws Exception { - StringBuilder sb = new StringBuilder(256); - sb.append("file:"); - sb.append(System.getProperty("test.src", ".")); - sb.append(File.separatorChar); - sb.append(name); - - URL[] url = { new URL(sb.toString()) }; - return new URLClassLoader(url); + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + Class c = findLoadedClass(name); + if (c == null) { + if (Bean.class.getName().equals(name)) { + c = findClass(name); + } + else try { + c = getParent().loadClass(name); + } + catch (ClassNotFoundException exception) { + c = findClass(name); + } + } + if (resolve) { + resolveClass(c); + } + return c; } public void exceptionThrown(Exception exception) { throw new Error("unexpected exception", exception); } + + private void validate(Object object) { + if (!object.getClass().getClassLoader().equals(this)) { + throw new Error("Bean is loaded with unexpected class loader"); + } + } + + private byte[] encode(String name) throws Exception { + Object object = loadClass(name).newInstance(); + validate(object); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + XMLEncoder encoder = new XMLEncoder(out); + encoder.setExceptionListener(this); + encoder.writeObject(object); + encoder.close(); + return out.toByteArray(); + } + + private Object decode(byte[] array) { + ByteArrayInputStream in = new ByteArrayInputStream(array); + XMLDecoder decoder = new XMLDecoder(in, null, this, this); + Object object = decoder.readObject(); + validate(object); + decoder.close(); + return object; + } } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/io/Serializable/enum/array/Test.java --- a/jdk/test/java/io/Serializable/enum/array/Test.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/io/Serializable/enum/array/Test.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/io/Serializable/enum/badResolve/Write.java --- a/jdk/test/java/io/Serializable/enum/badResolve/Write.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/io/Serializable/enum/badResolve/Write.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/io/Serializable/enum/basic/Test.java --- a/jdk/test/java/io/Serializable/enum/basic/Test.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/io/Serializable/enum/basic/Test.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/io/Serializable/enum/classObject/Test.java --- a/jdk/test/java/io/Serializable/enum/classObject/Test.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/io/Serializable/enum/classObject/Test.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/io/Serializable/enum/constantSubclasses/Write.java --- a/jdk/test/java/io/Serializable/enum/constantSubclasses/Write.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/io/Serializable/enum/constantSubclasses/Write.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/io/Serializable/enum/ignoreSerializationFields/Test.java --- a/jdk/test/java/io/Serializable/enum/ignoreSerializationFields/Test.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/io/Serializable/enum/ignoreSerializationFields/Test.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/io/Serializable/enum/ignoreSerializationMethods/Test.java --- a/jdk/test/java/io/Serializable/enum/ignoreSerializationMethods/Test.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/io/Serializable/enum/ignoreSerializationMethods/Test.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/io/Serializable/enum/mismatchedTypecode/Test.java --- a/jdk/test/java/io/Serializable/enum/mismatchedTypecode/Test.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/io/Serializable/enum/mismatchedTypecode/Test.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/io/Serializable/enum/missingConstant/Write.java --- a/jdk/test/java/io/Serializable/enum/missingConstant/Write.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/io/Serializable/enum/missingConstant/Write.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/io/Serializable/enum/unshared/Test.java --- a/jdk/test/java/io/Serializable/enum/unshared/Test.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/io/Serializable/enum/unshared/Test.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Boolean/MakeBooleanComparable.java --- a/jdk/test/java/lang/Boolean/MakeBooleanComparable.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Boolean/MakeBooleanComparable.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Class/Cast.java --- a/jdk/test/java/lang/Class/Cast.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Class/Cast.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Class/IsEnum.java --- a/jdk/test/java/lang/Class/IsEnum.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Class/IsEnum.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Class/asSubclass/BasicUnit.java --- a/jdk/test/java/lang/Class/asSubclass/BasicUnit.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Class/asSubclass/BasicUnit.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/ClassLoader/Assert.sh --- a/jdk/test/java/lang/ClassLoader/Assert.sh Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/ClassLoader/Assert.sh Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Integer/BitTwiddle.java --- a/jdk/test/java/lang/Integer/BitTwiddle.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Integer/BitTwiddle.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Long/BitTwiddle.java --- a/jdk/test/java/lang/Long/BitTwiddle.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Long/BitTwiddle.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Math/Atan2Tests.java --- a/jdk/test/java/lang/Math/Atan2Tests.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Math/Atan2Tests.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Math/IeeeRecommendedTests.java --- a/jdk/test/java/lang/Math/IeeeRecommendedTests.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Math/IeeeRecommendedTests.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Math/PowTests.java --- a/jdk/test/java/lang/Math/PowTests.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Math/PowTests.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Math/TanTests.java --- a/jdk/test/java/lang/Math/TanTests.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Math/TanTests.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Runtime/exec/WinCommand.java --- a/jdk/test/java/lang/Runtime/exec/WinCommand.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Runtime/exec/WinCommand.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Thread/GenerifyStackTraces.java --- a/jdk/test/java/lang/Thread/GenerifyStackTraces.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Thread/GenerifyStackTraces.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/Thread/UncaughtExceptions.sh --- a/jdk/test/java/lang/Thread/UncaughtExceptions.sh Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/Thread/UncaughtExceptions.sh Wed Jul 05 17:04:26 2017 +0200 @@ -121,7 +121,7 @@ } EOJAVA - Sys "$javac" "-source" "1.5" "Seppuku.java" + Sys "$javac" "Seppuku.java" CheckCommandResults "$expectedRC" "$expectedOut" "$expectedErr" \ "$java" "Seppuku" Cleanup diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/annotation/UnitTest.java --- a/jdk/test/java/lang/annotation/UnitTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/annotation/UnitTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/annotation/package-info.java --- a/jdk/test/java/lang/annotation/package-info.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/annotation/package-info.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/management/CompositeData/MemoryNotifInfoCompositeData.java --- a/jdk/test/java/lang/management/CompositeData/MemoryNotifInfoCompositeData.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/management/CompositeData/MemoryNotifInfoCompositeData.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java --- a/jdk/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java --- a/jdk/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java --- a/jdk/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/management/ManagementFactory/ProxyExceptions.java --- a/jdk/test/java/lang/management/ManagementFactory/ProxyExceptions.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/management/ManagementFactory/ProxyExceptions.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java --- a/jdk/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java --- a/jdk/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java --- a/jdk/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh --- a/jdk/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh Wed Jul 05 17:04:26 2017 +0200 @@ -27,7 +27,7 @@ # @summary # @author Mandy Chung # -# @run compile -source 1.5 InputArgument.java +# @run compile InputArgument.java # @run shell TestInputArgument.sh # diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/reflect/Constructor/GenericStringTest.java --- a/jdk/test/java/lang/reflect/Constructor/GenericStringTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/reflect/Constructor/GenericStringTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/reflect/Field/GenericStringTest.java --- a/jdk/test/java/lang/reflect/Field/GenericStringTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/reflect/Field/GenericStringTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/reflect/Generics/StringsAndBounds.java --- a/jdk/test/java/lang/reflect/Generics/StringsAndBounds.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/reflect/Generics/StringsAndBounds.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/reflect/Generics/TestC1.java --- a/jdk/test/java/lang/reflect/Generics/TestC1.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/reflect/Generics/TestC1.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/reflect/Generics/TestC2.java --- a/jdk/test/java/lang/reflect/Generics/TestC2.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/reflect/Generics/TestC2.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/reflect/Generics/TestN1.java --- a/jdk/test/java/lang/reflect/Generics/TestN1.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/reflect/Generics/TestN1.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/reflect/Generics/exceptionCauseTest.java --- a/jdk/test/java/lang/reflect/Generics/exceptionCauseTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/reflect/Generics/exceptionCauseTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -26,8 +26,6 @@ * @bug 4981727 * @summary * @author Joseph D. Darcy - * @compile -source 1.5 exceptionCauseTest.java - * @run main exceptionCauseTest */ import java.io.PrintStream; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/reflect/Generics/getAnnotationTest.java --- a/jdk/test/java/lang/reflect/Generics/getAnnotationTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/reflect/Generics/getAnnotationTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/reflect/Method/Equals.java --- a/jdk/test/java/lang/reflect/Method/Equals.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/reflect/Method/Equals.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/lang/reflect/Method/GenericStringTest.java --- a/jdk/test/java/lang/reflect/Method/GenericStringTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/lang/reflect/Method/GenericStringTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/math/BigDecimal/DivideTests.java --- a/jdk/test/java/math/BigDecimal/DivideTests.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/math/BigDecimal/DivideTests.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/math/BigDecimal/IntegralDivisionTests.java --- a/jdk/test/java/math/BigDecimal/IntegralDivisionTests.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/math/BigDecimal/IntegralDivisionTests.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/math/BigDecimal/PowTests.java --- a/jdk/test/java/math/BigDecimal/PowTests.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/math/BigDecimal/PowTests.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/math/BigDecimal/ToPlainStringTests.java --- a/jdk/test/java/math/BigDecimal/ToPlainStringTests.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/math/BigDecimal/ToPlainStringTests.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/math/BigDecimal/ZeroScalingTests.java --- a/jdk/test/java/math/BigDecimal/ZeroScalingTests.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/math/BigDecimal/ZeroScalingTests.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/math/RoundingMode/RoundingModeTests.java --- a/jdk/test/java/math/RoundingMode/RoundingModeTests.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/math/RoundingMode/RoundingModeTests.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/net/CookieHandler/TestHttpCookie.java --- a/jdk/test/java/net/CookieHandler/TestHttpCookie.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/net/CookieHandler/TestHttpCookie.java Wed Jul 05 17:04:26 2017 +0200 @@ -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() { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/net/ProxySelector/ProxyTest.java --- a/jdk/test/java/net/ProxySelector/ProxyTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/net/ProxySelector/ProxyTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/net/URL/PerConnectionProxy.java --- a/jdk/test/java/net/URL/PerConnectionProxy.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/net/URL/PerConnectionProxy.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/security/cert/PKIXBuilderParameters/InvalidParameters.java --- a/jdk/test/java/security/cert/PKIXBuilderParameters/InvalidParameters.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/security/cert/PKIXBuilderParameters/InvalidParameters.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/security/cert/PKIXParameters/InvalidParameters.java --- a/jdk/test/java/security/cert/PKIXParameters/InvalidParameters.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/security/cert/PKIXParameters/InvalidParameters.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/AbstractList/CheckForComodification.java --- a/jdk/test/java/util/AbstractList/CheckForComodification.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/AbstractList/CheckForComodification.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/Collections/AddAll.java --- a/jdk/test/java/util/Collections/AddAll.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/Collections/AddAll.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/Collections/Disjoint.java --- a/jdk/test/java/util/Collections/Disjoint.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/Collections/Disjoint.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/Collections/Frequency.java --- a/jdk/test/java/util/Collections/Frequency.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/Collections/Frequency.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/EnumMap/EnumMapBash.java --- a/jdk/test/java/util/EnumMap/EnumMapBash.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/EnumMap/EnumMapBash.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/EnumSet/AllOf.java --- a/jdk/test/java/util/EnumSet/AllOf.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/EnumSet/AllOf.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/EnumSet/ComplementOf.java --- a/jdk/test/java/util/EnumSet/ComplementOf.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/EnumSet/ComplementOf.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/EnumSet/EnumSetBash.java --- a/jdk/test/java/util/EnumSet/EnumSetBash.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/EnumSet/EnumSetBash.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/EnumSet/JumboRange.java --- a/jdk/test/java/util/EnumSet/JumboRange.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/EnumSet/JumboRange.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/EnumSet/Range.java --- a/jdk/test/java/util/EnumSet/Range.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/EnumSet/Range.java Wed Jul 05 17:04:26 2017 +0200 @@ -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.*; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/Formattable/StockName.java --- a/jdk/test/java/util/Formattable/StockName.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/Formattable/StockName.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/Formatter/Basic-X.java --- a/jdk/test/java/util/Formatter/Basic-X.java Wed Dec 16 23:39:39 2009 -0800 +++ /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 % 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 %Basic$2.java -# else $SPP -K$1 -Dtype=$1 -DType=$2 -K$3 Basic$2.java +# then $SPP -K$1 -Dtype=$1 -DType=$2 -KprimBasic$2.java +# else $SPP -K$1 -Dtype=$1 -DType=$2 -K$3 Basic$2.java # fi - java build.tools.spp.Spp -K$1 -Dtype=$1 -DType=$2 -K$3 -K$4 -K$5 -K$6 Basic$2.java + java build.tools.spp.Spp -K$1 -Dtype=$1 -DType=$2 -K$3 -K$4 -K$5 -K$6 Basic$2.java } gen boolean Boolean prim "" "" "" diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/IdentityHashMap/ToString.java --- a/jdk/test/java/util/IdentityHashMap/ToString.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/IdentityHashMap/ToString.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/Locale/Bug4175998Test.java --- a/jdk/test/java/util/Locale/Bug4175998Test.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/Locale/Bug4175998Test.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/UUID/UUIDTest.java --- a/jdk/test/java/util/UUID/UUIDTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/UUID/UUIDTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java --- a/jdk/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/BlockingQueue/CancelledProducerConsumerLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java --- a/jdk/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/BlockingQueue/MultipleProducersSingleConsumerLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java --- a/jdk/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/BlockingQueue/ProducerConsumerLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java --- a/jdk/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/BlockingQueue/SingleProducerMultipleConsumerLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/ConcurrentHashMap/MapCheck.java --- a/jdk/test/java/util/concurrent/ConcurrentHashMap/MapCheck.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/ConcurrentHashMap/MapCheck.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java --- a/jdk/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/ConcurrentHashMap/MapLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/Exchanger/ExchangeLoops.java --- a/jdk/test/java/util/concurrent/Exchanger/ExchangeLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/Exchanger/ExchangeLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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. */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java --- a/jdk/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/ExecutorCompletionService/ExecutorCompletionServiceLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -34,7 +34,7 @@ /* * @test * @bug 4965960 - * @compile -source 1.5 ExecutorCompletionServiceLoops.java + * @compile ExecutorCompletionServiceLoops.java * @run main/timeout=3600 ExecutorCompletionServiceLoops * @summary Exercise ExecutorCompletionServiceLoops */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java --- a/jdk/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/FutureTask/CancelledFutureLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/atomic/VMSupportsCS8.java --- a/jdk/test/java/util/concurrent/atomic/VMSupportsCS8.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/atomic/VMSupportsCS8.java Wed Jul 05 17:04:26 2017 +0200 @@ -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. */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java --- a/jdk/test/java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/CancelledLockLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java --- a/jdk/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/LockOncePerThreadLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java --- a/jdk/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/SimpleReentrantLockLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java --- a/jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/locks/ReentrantLock/TimeoutLockLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java --- a/jdk/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/java/util/concurrent/locks/ReentrantReadWriteLock/MapLoops.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOverFlowTest2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOverFlowTest2.java Wed Jul 05 17:04:26 2017 +0200 @@ -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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel overflow test 2 */ + +import java.util.HashMap; +import java.util.Map; + +import javax.sound.midi.MidiChannel; +import javax.sound.midi.Patch; +import javax.sound.midi.VoiceStatus; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; + +import com.sun.media.sound.AudioSynthesizer; +import com.sun.media.sound.SF2Instrument; +import com.sun.media.sound.SF2InstrumentRegion; +import com.sun.media.sound.SF2Layer; +import com.sun.media.sound.SF2LayerRegion; +import com.sun.media.sound.SF2Region; +import com.sun.media.sound.SF2Sample; +import com.sun.media.sound.SF2Soundbank; +import com.sun.media.sound.SoftSynthesizer; + +public class NoteOverFlowTest2 { + + public static void main(String[] args) throws Exception + { + // Create instance of the synthesizer with very low polyphony + AudioSynthesizer synth = new SoftSynthesizer(); + AudioFormat format = new AudioFormat(44100, 16, 2, true, false); + Map p = new HashMap(); + p.put("max polyphony", new Integer(5)); + AudioInputStream stream = synth.openStream(format, p); + + // Create instrument with too many regions (more than max polyphony) + SF2Soundbank sf2 = new SF2Soundbank(); + + SF2Sample sample = new SF2Sample(sf2); + sample.setName("test sample"); + sample.setData(new byte[100]); + sample.setSampleRate(44100); + sample.setOriginalPitch(20); + sf2.addResource(sample); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("test layer"); + sf2.addResource(layer); + + for (int i = 0; i < 100; i++) { + SF2LayerRegion region = new SF2LayerRegion(); + region.setSample(sample); + layer.getRegions().add(region); + } + + SF2Instrument ins = new SF2Instrument(sf2); + ins.setPatch(new Patch(0,0)); + ins.setName("test instrument"); + sf2.addInstrument(ins); + + SF2InstrumentRegion insregion = new SF2InstrumentRegion(); + insregion.setLayer(layer); + ins.getRegions().add(insregion); + + // Load the test soundbank into the synthesizer + synth.unloadAllInstruments(synth.getDefaultSoundbank()); + synth.loadAllInstruments(sf2); + + // Send out one midi on message + MidiChannel ch1 = synth.getChannels()[0]; + ch1.programChange(0); + ch1.noteOn(64, 64); + + // Read 1 sec from stream + stream.skip(format.getFrameSize() * ((int)(format.getFrameRate() * 2))); + + // Close the synthesizer after use + synth.close(); + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/javax/sound/midi/Gervill/SoftReceiver/GetMidiDevice.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/GetMidiDevice.java Wed Jul 05 17:04:26 2017 +0200 @@ -0,0 +1,48 @@ +/* + * 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. + */ + +/* @test + @summary Test SoftReceiver getMidiDevice method */ + +import javax.sound.midi.Receiver; + +import com.sun.media.sound.AudioSynthesizer; +import com.sun.media.sound.SoftReceiver; +import com.sun.media.sound.SoftSynthesizer; + +public class GetMidiDevice { + + public static void main(String[] args) throws Exception { + + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Receiver recv = synth.getReceiver(); + if (((SoftReceiver) recv).getMidiDevice() != synth) { + throw new Exception("SoftReceiver.getMidiDevice() doesn't return " + + "instance of the synthesizer"); + } + synth.close(); + } +} \ No newline at end of file diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/TestPreciseTimestampRendering.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/TestPreciseTimestampRendering.java Wed Jul 05 17:04:26 2017 +0200 @@ -0,0 +1,208 @@ +/* + * 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. + */ + +/* @test + @summary Test rendering when using precise timestamps */ + +import java.util.Arrays; +import java.util.Random; + +import javax.sound.midi.MidiChannel; +import javax.sound.midi.Receiver; +import javax.sound.midi.ShortMessage; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; + +import com.sun.media.sound.AudioFloatConverter; +import com.sun.media.sound.AudioSynthesizer; +import com.sun.media.sound.ModelAbstractChannelMixer; +import com.sun.media.sound.ModelChannelMixer; +import com.sun.media.sound.SF2Instrument; +import com.sun.media.sound.SF2InstrumentRegion; +import com.sun.media.sound.SF2Layer; +import com.sun.media.sound.SF2LayerRegion; +import com.sun.media.sound.SF2Sample; +import com.sun.media.sound.SF2Soundbank; +import com.sun.media.sound.SimpleInstrument; +import com.sun.media.sound.SimpleSoundbank; +import com.sun.media.sound.SoftSynthesizer; + +public class TestPreciseTimestampRendering { + + public static AudioFormat format = new AudioFormat(44100, 16, 1, true, + false); + + public static SF2Soundbank createTestSoundbank() { + // Create impulse instrument + // used to measure timing of note-on playback + SF2Soundbank soundbank = new SF2Soundbank(); + float[] data = new float[100]; + Arrays.fill(data, 0); + data[0] = 1.0f; + byte[] bdata = new byte[data.length * format.getFrameSize()]; + AudioFloatConverter.getConverter(format).toByteArray(data, bdata); + + SF2Sample sample = new SF2Sample(soundbank); + sample.setName("Test Sample"); + sample.setData(bdata); + sample.setSampleRate((long) format.getSampleRate()); + sample.setOriginalPitch(69); + soundbank.addResource(sample); + + SF2Layer layer = new SF2Layer(soundbank); + layer.setName("Test Layer"); + soundbank.addResource(layer); + SF2LayerRegion region = new SF2LayerRegion(); + region.setSample(sample); + layer.getRegions().add(region); + + SF2Instrument ins = new SF2Instrument(soundbank); + ins.setName("Test Instrument"); + soundbank.addInstrument(ins); + SF2InstrumentRegion insregion = new SF2InstrumentRegion(); + insregion.setLayer(layer); + ins.getRegions().add(insregion); + + return soundbank; + } + + public static Soundbank createTestSoundbankWithChannelMixer() { + SF2Soundbank soundbank = createTestSoundbank(); + + SimpleSoundbank simplesoundbank = new SimpleSoundbank(); + SimpleInstrument simpleinstrument = new SimpleInstrument() { + + public ModelChannelMixer getChannelMixer(MidiChannel channel, + AudioFormat format) { + return new ModelAbstractChannelMixer() { + boolean active = true; + + public boolean process(float[][] buffer, int offset, int len) { + for (int i = 0; i < buffer.length; i++) { + float[] cbuffer = buffer[i]; + for (int j = 0; j < cbuffer.length; j++) { + cbuffer[j] = -cbuffer[j]; + } + } + return active; + } + + public void stop() { + active = false; + } + }; + } + + }; + simpleinstrument.add(soundbank.getInstruments()[0]); + simplesoundbank.addInstrument(simpleinstrument); + + return simplesoundbank; + } + + public static void main(String[] args) throws Exception { + test(createTestSoundbank()); + test(createTestSoundbankWithChannelMixer()); + } + + public static void test(Soundbank soundbank) throws Exception { + + // Create instance of synthesizer using the testing soundbank above + AudioSynthesizer synth = new SoftSynthesizer(); + AudioInputStream stream = synth.openStream(format, null); + synth.unloadAllInstruments(synth.getDefaultSoundbank()); + synth.loadAllInstruments(soundbank); + Receiver recv = synth.getReceiver(); + + // Set volume to max and turn reverb off + ShortMessage reverb_off = new ShortMessage(); + reverb_off.setMessage(ShortMessage.CONTROL_CHANGE, 91, 0); + recv.send(reverb_off, -1); + ShortMessage full_volume = new ShortMessage(); + full_volume.setMessage(ShortMessage.CONTROL_CHANGE, 7, 127); + recv.send(full_volume, -1); + + Random random = new Random(3485934583945l); + + // Create random timestamps + long[] test_timestamps = new long[30]; + for (int i = 1; i < test_timestamps.length; i++) { + test_timestamps[i] = i * 44100 + + (int) (random.nextDouble() * 22050.0); + } + + // Send midi note on message to synthesizer + for (int i = 0; i < test_timestamps.length; i++) { + ShortMessage midi_on = new ShortMessage(); + midi_on.setMessage(ShortMessage.NOTE_ON, 69, 127); + recv.send(midi_on, + (long) ((test_timestamps[i] / 44100.0) * 1000000.0)); + } + + // Measure timing from rendered audio + float[] fbuffer = new float[100]; + byte[] buffer = new byte[fbuffer.length * format.getFrameSize()]; + long firsts = -1; + int counter = 0; + long s = 0; + long max_jitter = 0; + outerloop: for (int k = 0; k < 10000000; k++) { + stream.read(buffer); + AudioFloatConverter.getConverter(format).toFloatArray(buffer, + fbuffer); + for (int i = 0; i < fbuffer.length; i++) { + if (fbuffer[i] != 0) { + if (firsts == -1) + firsts = s; + + long measure_time = (s - firsts); + long predicted_time = test_timestamps[counter]; + + long jitter = Math.abs(measure_time - predicted_time); + + if (jitter > 10) + max_jitter = jitter; + + counter++; + if (counter == test_timestamps.length) + break outerloop; + } + s++; + } + } + synth.close(); + + if (counter == 0) + throw new Exception("Nothing was measured!"); + + if (max_jitter != 0) { + throw new Exception("Jitter has occurred! " + + "(max jitter = " + max_jitter + ")"); + } + + } + +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/javax/swing/JList/6823603/bug6823603.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JList/6823603/bug6823603.java Wed Jul 05 17:04:26 2017 +0200 @@ -0,0 +1,247 @@ +/* + * 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 6823603 + @summary Generics: JList + @author Florian Brunner + @run main bug6823603 + */ + +import java.util.Arrays; +import java.util.List; +import java.util.Vector; +import java.util.Enumeration; +import java.awt.*; +import javax.swing.*; + +public class bug6823603 { + + private static final String TEST_ELEMENT = "Test1"; + + /** + * @param args the command line arguments + */ + @SuppressWarnings("unchecked") + public static void main(String[] args) { + testRawSignatures(); + testGenericSignatures(); + + testGetSelectedValuesList(); // new method + } + + @SuppressWarnings("unchecked") + private static void testRawSignatures() { + // Test JList + ListModel rawTestModel = new DefaultListModel(); + + new JList(); + new JList(rawTestModel); + new JList(new Object[]{TEST_ELEMENT}); + JList rawTestList = new JList(new Vector()); + rawTestList.getPrototypeCellValue(); + rawTestList.setPrototypeCellValue(TEST_ELEMENT); + rawTestList.getCellRenderer(); + rawTestList.setCellRenderer(new DefaultListCellRenderer()); + rawTestList.getModel(); + rawTestList.setModel(rawTestModel); + rawTestList.setListData(new Object[]{TEST_ELEMENT}); + rawTestList.setListData(new Vector()); + + @SuppressWarnings("deprecation") + Object[] selectedValues = rawTestList.getSelectedValues(); + rawTestList.getSelectedValue(); + + // Test ListCellRenderer + ListCellRenderer rawTestCellRenderer = new DefaultListCellRenderer(); + String testEntry = "Test"; + @SuppressWarnings("unchecked") + JList rawJList = new JList(new Object[]{testEntry}); + + rawTestCellRenderer.getListCellRendererComponent(rawJList, + testEntry, 0, true, true); + + // Test ListModel + DefaultListModel testModel = new DefaultListModel(); + testModel.addElement(TEST_ELEMENT); + rawTestModel = testModel; + rawTestModel.getElementAt(0); + + // Test DefaultListModel + DefaultListModel defaultListModel = new DefaultListModel(); + + defaultListModel.addElement(TEST_ELEMENT); + defaultListModel.getElementAt(0); + defaultListModel.elements(); + defaultListModel.elementAt(0); + defaultListModel.firstElement(); + defaultListModel.lastElement(); + + String testElement2 = "Test2"; + + defaultListModel.setElementAt(testElement2, 0); + defaultListModel.insertElementAt(TEST_ELEMENT, 0); + defaultListModel.get(0); + defaultListModel.set(0, testElement2); + defaultListModel.add(0, TEST_ELEMENT); + defaultListModel.remove(0); + + // Test AbstractListModel + @SuppressWarnings("serial") + ListModel abstractListModel = new AbstractListModel() { + public int getSize() { + throw new UnsupportedOperationException("Not supported yet."); + } + + public Object getElementAt(int index) { + throw new UnsupportedOperationException("Not supported yet."); + } + }; + + // Test DefaultListCellRenderer + DefaultListCellRenderer cellRenderer = new DefaultListCellRenderer(); + + @SuppressWarnings("unchecked") + JList list = new JList(new Object[]{testEntry}); + + cellRenderer.getListCellRendererComponent(rawJList, testEntry, 0, true, true); + } + + private static void testGenericSignatures() { + // Test JList + ListModel stringListModel = new DefaultListModel(); + + new JList(); + new JList(stringListModel); + new JList(new String[]{TEST_ELEMENT}); + + JList stringTestList = new JList(new Vector()); + + stringTestList.getPrototypeCellValue(); + stringTestList.setPrototypeCellValue(TEST_ELEMENT); + + ListCellRenderer cellRenderer = stringTestList.getCellRenderer(); + + stringTestList.setCellRenderer(new DefaultListCellRenderer()); + + ListModel model = stringTestList.getModel(); + + stringTestList.setModel(stringListModel); + stringTestList.setListData(new String[]{TEST_ELEMENT}); + stringTestList.setListData(new Vector()); + + @SuppressWarnings("deprecation") + Object[] selectedValues = stringTestList.getSelectedValues(); + + stringTestList.getSelectedValue(); + + // Test ListCellRenderer + ListCellRenderer stringTestCellRenderer = + new DefaultListCellRenderer(); + String testEntry = "Test"; + JList stringJList = new JList(new String[]{testEntry}); + + Component listCellRendererComponent2 = + stringTestCellRenderer.getListCellRendererComponent(stringJList, + testEntry, 0, true, true); + + // Test ListModel + DefaultListModel testModel = new DefaultListModel(); + testModel.addElement(TEST_ELEMENT); + stringListModel = testModel; + + String element1 = stringListModel.getElementAt(0); + + // Test DefaultListModel + DefaultListModel stringTestModel = new DefaultListModel(); + + stringTestModel.addElement(TEST_ELEMENT); + element1 = stringTestModel.getElementAt(0); + Enumeration elements = stringTestModel.elements(); + String element2 = stringTestModel.elementAt(0); + String firstElement = stringTestModel.firstElement(); + String lastElement = stringTestModel.lastElement(); + + String testElement2 = "Test2"; + stringTestModel.setElementAt(testElement2, 0); + stringTestModel.insertElementAt(TEST_ELEMENT, 0); + String element3 = stringTestModel.get(0); + String element4 = stringTestModel.set(0, testElement2); + stringTestModel.add(0, TEST_ELEMENT); + String removedElement = stringTestModel.remove(0); + + // Test AbstractListModel + stringListModel = new AbstractListModel() { + + public int getSize() { + throw new UnsupportedOperationException("Not supported yet."); + } + + public String getElementAt(int index) { + throw new UnsupportedOperationException("Not supported yet."); + } + }; + + @SuppressWarnings("serial") + ListModel genericTestModel = new AbstractListModel() { + + public int getSize() { + throw new UnsupportedOperationException("Not supported yet."); + } + + public E getElementAt(int index) { + throw new UnsupportedOperationException("Not supported yet."); + } + }; + + // Test DefaultListCellRenderer + cellRenderer = new DefaultListCellRenderer(); + + stringJList = new JList(new String[]{testEntry}); + + listCellRendererComponent2 = cellRenderer.getListCellRendererComponent(stringJList, testEntry, 0, true, true); + } + + private static void testGetSelectedValuesList() { + Vector data = new Vector(); + for (int i = 0; i < 10; i++) { + data.add(i); + } + JList list = new JList(data); + list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + list.setSelectedIndices(new int[]{1, 2, 3, 5, 6, 8}); + + @SuppressWarnings("deprecation") + Object[] expectedSelectedValues = list.getSelectedValues(); + List selectedValuesList = list.getSelectedValuesList(); + assertEquals(expectedSelectedValues, selectedValuesList.toArray()); + } + + private static void assertEquals(Object[] expectedArray, + Object[] actualArray) { + if (!Arrays.equals(expectedArray, actualArray)) { + throw new RuntimeException("Expected: " + Arrays.toString( + expectedArray) + " but was: " + Arrays.toString(actualArray)); + } + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/javax/swing/JTable/Test6888156.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JTable/Test6888156.java Wed Jul 05 17:04:26 2017 +0200 @@ -0,0 +1,98 @@ +/* + * 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 6888156 + @summary Tests table column of class Icon.class with Synth LAF + @author Peter Zhelezniakov + @run main Test6888156 +*/ + +import java.awt.Component; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import javax.swing.*; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableModel; + +public class Test6888156 { + private JTable table; + private Icon ICON = new Icon() { + @Override public int getIconWidth() { + return 24; + } + + @Override public int getIconHeight() { + return 24; + } + + @Override public void paintIcon(Component c, Graphics g, int w, int h) { + } + }; + + public Test6888156() { + TableModel model = new AbstractTableModel() { + @Override public int getRowCount() { + return 3; + } + + @Override public int getColumnCount() { + return 2; + } + + @Override public Object getValueAt(int rowIndex, int columnIndex) { + return (columnIndex == 1 ? ICON : 4); + } + + @Override public Class getColumnClass(int columnIndex) { + return (columnIndex == 1 ? Icon.class : int.class); + } + }; + table = new JTable(model); + } + + public void test(final LookAndFeel laf) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override public void run() { + try { + UIManager.setLookAndFeel(laf); + } catch (UnsupportedLookAndFeelException e) { + System.err.println(laf.getDescription() + + " is unsupported; continuing"); + return; + } + SwingUtilities.updateComponentTreeUI(table); + table.setSize(100, 100); + table.paint( + new BufferedImage(100, 100, BufferedImage.OPAQUE). + getGraphics()); + } + }); + } + + public static void main(String[] args) throws Exception { + Test6888156 t = new Test6888156(); + t.test(new javax.swing.plaf.nimbus.NimbusLookAndFeel()); + t.test(new com.sun.java.swing.plaf.gtk.GTKLookAndFeel()); + } +} \ No newline at end of file diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/management/AgentCheckTest.java --- a/jdk/test/sun/management/AgentCheckTest.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/sun/management/AgentCheckTest.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/security/jgss/spnego/NoSpnegoAsDefMech.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/jgss/spnego/NoSpnegoAsDefMech.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 + } + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/security/krb5/auto/Context.java --- a/jdk/test/sun/security/krb5/auto/Context.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/sun/security/krb5/auto/Context.java Wed Jul 05 17:04:26 2017 +0200 @@ -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) { diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/security/krb5/auto/KDC.java --- a/jdk/test/sun/security/krb5/auto/KDC.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/sun/security/krb5/auto/KDC.java Wed Jul 05 17:04:26 2017 +0200 @@ -63,6 +63,14 @@ * settings after calling a KDC method, call Config.refresh() to * make sure your changes are reflected in the Config object. * + * System properties recognized: + *
      + *
    • test.kdc.save.ccache + *
    + * Support policies: + *
      + *
    • ok-as-delegate + *
    * Issues and TODOs: *
      *
    1. 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 policies = new HashMap(); + + 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); } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/security/krb5/auto/OkAsDelegate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/krb5/auto/OkAsDelegate.java Wed Jul 05 17:04:26 2017 +0200 @@ -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"); + } + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/security/krb5/auto/OkAsDelegateXRealm.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/krb5/auto/OkAsDelegateXRealm.java Wed Jul 05 17:04:26 2017 +0200 @@ -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()); + } + } + } +} + diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/security/krb5/auto/SSL.java --- a/jdk/test/sun/security/krb5/auto/SSL.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/sun/security/krb5/auto/SSL.java Wed Jul 05 17:04:26 2017 +0200 @@ -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}; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/security/krb5/auto/ok-as-delegate-xrealm.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/krb5/auto/ok-as-delegate-xrealm.sh Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/security/krb5/auto/ok-as-delegate.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/krb5/auto/ok-as-delegate.sh Wed Jul 05 17:04:26 2017 +0200 @@ -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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/security/util/Oid/S11N.sh --- a/jdk/test/sun/security/util/Oid/S11N.sh Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/sun/security/util/Oid/S11N.sh Wed Jul 05 17:04:26 2017 +0200 @@ -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} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/tools/jconsole/ResourceCheckTest.sh --- a/jdk/test/sun/tools/jconsole/ResourceCheckTest.sh Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/sun/tools/jconsole/ResourceCheckTest.sh Wed Jul 05 17:04:26 2017 +0200 @@ -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: diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/tools/jhat/HatRun.java --- a/jdk/test/sun/tools/jhat/HatRun.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/sun/tools/jhat/HatRun.java Wed Jul 05 17:04:26 2017 +0200 @@ -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"; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/tools/native2ascii/NativeErrors.java --- a/jdk/test/sun/tools/native2ascii/NativeErrors.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/sun/tools/native2ascii/NativeErrors.java Wed Jul 05 17:04:26 2017 +0200 @@ -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; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/sun/tools/native2ascii/test2 --- a/jdk/test/sun/tools/native2ascii/test2 Wed Dec 16 23:39:39 2009 -0800 +++ /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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/tools/launcher/Arrrghs.java --- a/jdk/test/tools/launcher/Arrrghs.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/tools/launcher/Arrrghs.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 */ diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/tools/launcher/ExecutionEnvironment.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/launcher/ExecutionEnvironment.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 codeList = new ArrayList(); + 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 env = new HashMap(); + 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 env = new HashMap(); + 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 env = new HashMap(); + + + 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); + } + } +} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/tools/launcher/SolarisDataModel.sh --- a/jdk/test/tools/launcher/SolarisDataModel.sh Wed Dec 16 23:39:39 2009 -0800 +++ /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 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; diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/tools/launcher/SolarisRunpath.sh --- a/jdk/test/tools/launcher/SolarisRunpath.sh Wed Dec 16 23:39:39 2009 -0800 +++ /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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/tools/launcher/TestHelper.java --- a/jdk/test/tools/launcher/TestHelper.java Wed Dec 16 23:39:39 2009 -0800 +++ b/jdk/test/tools/launcher/TestHelper.java Wed Jul 05 17:04:26 2017 +0200 @@ -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 envToSet, String...cmds) { String cmdStr = ""; for (String x : cmds) { cmdStr = cmdStr.concat(x + " "); } ProcessBuilder pb = new ProcessBuilder(cmds); Map env = pb.environment(); + if (envToSet != null) { + env.putAll(envToSet); + } BufferedReader rdr = null; try { List outputList = new ArrayList(); @@ -163,21 +215,25 @@ List testOutput; public TestResult(String str, int rv, List 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; } diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/tools/launcher/libraryCaller.c --- a/jdk/test/tools/launcher/libraryCaller.c Wed Dec 16 23:39:39 2009 -0800 +++ /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 -#include "libraryCaller.h" - -#ifndef RETURN_VALUE -#define RETURN_VALUE 0 -#endif - -JNIEXPORT jint JNICALL Java_libraryCaller_number -(JNIEnv *je, jclass jc) { - return RETURN_VALUE; -} diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/tools/launcher/libraryCaller.h --- a/jdk/test/tools/launcher/libraryCaller.h Wed Dec 16 23:39:39 2009 -0800 +++ /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 -/* 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 diff -r fcbbd4d49581 -r ade55a65b0f2 jdk/test/tools/launcher/libraryCaller.java --- a/jdk/test/tools/launcher/libraryCaller.java Wed Dec 16 23:39:39 2009 -0800 +++ /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()); - } -} diff -r fcbbd4d49581 -r ade55a65b0f2 make/Defs-internal.gmk --- a/make/Defs-internal.gmk Wed Dec 16 23:39:39 2009 -0800 +++ b/make/Defs-internal.gmk Wed Jul 05 17:04:26 2017 +0200 @@ -227,6 +227,35 @@ SKIP_FASTDEBUG_BUILD=false endif +# Select javadoc setting GENERATE_DOCS +ifndef NO_DOCS + # Default value (we want javadoc run) + GENERATE_DOCS=true + # No DOCS build when JDK_UPDATE_VERSION set + ifdef JDK_UPDATE_VERSION + GENERATE_DOCS=false + endif + # If langtools, corba, jaxp, and jaxws are not being built, + # a full jdk javadoc is not possible + ifneq ($(BUILD_LANGTOOLS), true) + GENERATE_DOCS=false + endif + ifneq ($(BUILD_CORBA), true) + GENERATE_DOCS=false + endif + ifneq ($(BUILD_JAXP), true) + GENERATE_DOCS=false + endif + ifneq ($(BUILD_JAXWS), true) + GENERATE_DOCS=false + endif + ifeq ($(GENERATE_DOCS),false) + NO_DOCS=true + endif +else + GENERATE_DOCS=false +endif + # Output directory for hotspot build HOTSPOT_DIR = $(ABS_OUTPUTDIR)/hotspot diff -r fcbbd4d49581 -r ade55a65b0f2 make/jdk-rules.gmk --- a/make/jdk-rules.gmk Wed Dec 16 23:39:39 2009 -0800 +++ b/make/jdk-rules.gmk Wed Jul 05 17:04:26 2017 +0200 @@ -30,43 +30,20 @@ JDK_JAVA_EXE = $(OUTPUTDIR)/bin/java$(EXE_SUFFIX) # NO_IMAGES may be set in conjunction with DEV_ONLY -ifdef NO_IMAGES - IMAGES_TARGET = -else - IMAGES_TARGET = images -endif - -# No DOCS build when JDK_UPDATE_VERSION set -ifdef JDK_UPDATE_VERSION - DOCS_TARGET = -else - DOCS_TARGET = docs -endif - -# NO_DOCS may be set in conjunction with DEV_ONLY -ifdef NO_DOCS - DOCS_TARGET = +IMAGES_TARGET = images +ifdef DEV_ONLY + ifdef NO_IMAGES + IMAGES_TARGET = + endif endif -# If langtools not being built, full jdk javadoc is not possible -ifneq ($(BUILD_LANGTOOLS), true) - DOCS_TARGET = -endif -ifneq ($(BUILD_CORBA), true) - DOCS_TARGET = -endif -ifneq ($(BUILD_JAXP), true) +# GENERATE_DOCS determines if we ask for the docs target +DOCS_TARGET = docs +ifeq ($(GENERATE_DOCS),false) DOCS_TARGET = endif -ifneq ($(BUILD_JAXWS), true) - DOCS_TARGET = -endif - -ifndef DEV_ONLY - JDK_BUILD_TARGETS = sanity all $(DOCS_TARGET) images -else - JDK_BUILD_TARGETS = sanity all $(IMAGES_TARGET) -endif + +JDK_BUILD_TARGETS = sanity all $(DOCS_TARGET) $(IMAGES_TARGET) JDK_CLOBBER_TARGETS = clobber diff -r fcbbd4d49581 -r ade55a65b0f2 make/sanity-rules.gmk --- a/make/sanity-rules.gmk Wed Dec 16 23:39:39 2009 -0800 +++ b/make/sanity-rules.gmk Wed Jul 05 17:04:26 2017 +0200 @@ -204,13 +204,9 @@ "" >> $(WARNING_FILE) endif endif -ifndef OPENJDK - ifdef NO_DOCS - @$(ECHO) "WARNING: Your build environment has the variable NO_DOCS\n" \ - " defined. This will result in a development-only\n" \ - " build of the JDK, lacking the documentation.\n" \ +ifeq ($(GENERATE_DOCS),false) + @$(ECHO) "WARNING: This build does not include running javadoc.\n" \ "" >> $(WARNING_FILE) - endif endif ifdef NO_IMAGES @$(ECHO) "WARNING: Your build environment has the variable NO_IMAGES\n" \ @@ -355,4 +351,4 @@ .PHONY: sanity settings pre-sanity insane \ post-sanity post-sanity-hotspot post-sanity-jdk \ post-sanity-install post-sanity-deploy \ - alt_bootdir bootdir + alt_bootdir bootdir environment