diff --git a/.hgtags b/.hgtags index 1c4e24bef66230eeb415d915b477eba8574e9f2a..116dcf0c38da86d98ed046e2fa584410a55ec040 100644 --- a/.hgtags +++ b/.hgtags @@ -209,3 +209,4 @@ ac519af51769e92c51b597a730974e8607357709 jdk8-b83 296676d534c52888c36e305a2bf7f345c4ca70f8 jdk8-b85 7989cd0cc3a9149864589438ee2c949015d8aa9a jdk8-b86 d5228e624826a10ccc5b05f30ad8d839b58fe48d jdk8-b87 +8dbb4b159e04de3c447c9242c70505e71f8624c7 jdk8-b88 diff --git a/makefiles/CompileNativeLibraries.gmk b/makefiles/CompileNativeLibraries.gmk index b1370d4a363f03171ec1104b33a2fdb72ee842c3..1836cbb13f9e670288dd9c7aa987968e1064bbb2 100644 --- a/makefiles/CompileNativeLibraries.gmk +++ b/makefiles/CompileNativeLibraries.gmk @@ -63,7 +63,12 @@ WIN_AWT_LIB := $(JDK_OUTPUTDIR)/objs/libawt/awt.lib # Use this variable to set DEBUG_SYMBOLS true on windows for all libraries, but # not on other platforms. ifeq ($(OPENJDK_TARGET_OS), windows) - WINDOWS_ONLY := true + DEBUG_ALL_BINARIES := true +endif + +# Build everything with debugging on OpenJDK +ifdef OPENJDK + DEBUG_ALL_BINARIES := true endif # @@ -91,7 +96,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBFDLIBM,\ -I$(JDK_TOPDIR)/src/share/native/java/lang/fdlibm/include,\ CFLAGS_windows_debug:=-DLOGGING,\ ARFLAGS:=$(ARFLAGS),\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libfdlibm)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libfdlibm,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) else @@ -105,7 +111,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBFDLIBM_MAC,\ CFLAGS:=$(CFLAGS_JDKLIB) \ -I$(JDK_TOPDIR)/src/share/native/java/lang/fdlibm/include,\ LDFLAGS:=-nostdlib -r -arch x86_64,\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libfdlibm)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libfdlibm,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBFDLIBM := $(JDK_OUTPUTDIR)/objs/$(LIBRARY_PREFIX)fdlibm$(STATIC_LIBRARY_SUFFIX) $(BUILD_LIBFDLIBM) : $(BUILD_LIBFDLIBM_MAC) @@ -257,7 +264,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVA,\ -D "JDK_FTYPE=0x2L",\ REORDER:=$(LIBJAVA_REORDER), \ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjava,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBJAVA) @@ -308,7 +315,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMLIB_IMAGE,\ -D "JDK_INTERNAL_NAME=mlib_image" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libmlib_image,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBMLIB_IMAGE) : $(BUILD_LIBJAVA) @@ -431,7 +438,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMLIB_IMAGE_V,\ $(BUILD_LIBMLIB_LDLIBS) -ljava -ljvm \ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_SUFFIX_solaris:=-lc,\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libmlib_image_v)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libmlib_image_v,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBMLIB_IMAGE_V): $(BUILD_LIBJAVA) @@ -739,7 +747,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT,\ -D "JDK_INTERNAL_NAME=awt" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBAWT) : $(BUILD_LIBJAVA) @@ -895,7 +903,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT_XAWT,\ -D "JDK_FNAME=xawt.dll" \ -D "JDK_INTERNAL_NAME=xawt" \ -D "JDK_FTYPE=0x2L",\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_xawt)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_xawt,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBAWT_XAWT) : $(BUILD_LIBJAVA) @@ -956,7 +965,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBZIP,\ -D "JDK_INTERNAL_NAME=zip" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libzip,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBZIP) : $(BUILD_LIBJAVA) @@ -986,7 +995,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBUNPACK,\ -D "JDK_FNAME=unpack.dll" \ -D "JDK_INTERNAL_NAME=unpack" \ -D "JDK_FTYPE=0x2L",\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBUNPACK) : $(BUILD_LIBJAVA) @@ -1100,7 +1109,7 @@ ifeq ($(OPENJDK_TARGET_OS),windows) -D "JDK_INTERNAL_NAME=dt_shmem" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libdt_shmem,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBDT_SHMEM) @@ -1134,7 +1143,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJDWP,\ -D "JDK_INTERNAL_NAME=jdwp" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjdwp,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBJDWP) : $(BUILD_LIBJAVA) @@ -1175,7 +1184,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAAS,\ -D "JDK_INTERNAL_NAME=$(LIBJAAS_NAME)" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjaas,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBJAAS) : $(BUILD_LIBJAVA) @@ -1240,7 +1249,7 @@ BUILD_LIBRARIES += $(BUILD_LIBJSDT) -D "JDK_INTERNAL_NAME=lcms" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/liblcms,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBLCMS) @@ -1300,7 +1309,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJPEG,\ -D "JDK_FTYPE=0x2L",\ REORDER:=$(BUILD_LIBJPEG_REORDER),\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjpeg,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBJPEG) : $(BUILD_LIBJAVA) @@ -1377,7 +1386,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBFONTMANAGER,\ -D "JDK_INTERNAL_NAME=fontmanager" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libfontmanager,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBFONTMANAGER) : $(BUILD_LIBAWT) @@ -1434,7 +1443,7 @@ ifndef OPENJDK -D "JDK_INTERNAL_NAME=t2k" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libt2k,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) # t2k is linked against fontmanager $(BUILD_LIBT2K) : $(BUILD_LIBFONTMANAGER) @@ -1472,7 +1481,7 @@ ifeq ($(OPENJDK_TARGET_OS), windows) -D "JDK_INTERNAL_NAME=jawt" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjawt,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBJAWT) : $(BUILD_LIBAWT) @@ -1521,7 +1530,8 @@ else # OPENJDK_TARGET_OS not windows LDFLAGS_SUFFIX_solaris:=$(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX) -lXrender,\ LDFLAGS_SUFFIX_macosx:=-Xlinker -rpath -Xlinker @loader_path $(JAWT_LIBS) \ -framework Cocoa $(LDFLAGS_JDKLIB_SUFFIX),\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjawt)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjawt,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) ifndef BUILD_HEADLESS_ONLY $(BUILD_LIBJAWT) : $(BUILD_LIBAWT_XAWT) @@ -1828,7 +1838,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBNET,\ -D "JDK_INTERNAL_NAME=net" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libnet,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBNET) : $(BUILD_LIBJAVA) @@ -1965,7 +1975,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBNIO,\ -D "JDK_INTERNAL_NAME=nio" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libnio,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBNIO) @@ -2002,7 +2012,8 @@ ifeq ($(OPENJDK_TARGET_OS_API),posix) LDFLAGS_SUFFIX_posix:=-lnio -lnet,\ LDFLAGS_SUFFIX_solaris:=-lsocket -ljava -ljvm -lc,\ LDFLAGS_SUFFIX_macosx:=-ljava -ljvm,\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsctp)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsctp,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBSCTP) @@ -2126,7 +2137,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJLI,\ -D "JDK_INTERNAL_NAME=jli" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjli,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBJLI) @@ -2143,7 +2154,8 @@ ifeq ($(OPENJDK_TARGET_OS), windows) OPTIMIZATION:=HIGH, \ CFLAGS:=$(STATIC_LIBRARY_FLAGS) $(LIBJLI_CFLAGS),\ ARFLAGS:=$(ARFLAGS),\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjli_static)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjli_static,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBJLI_STATIC) @@ -2161,7 +2173,8 @@ else ifeq ($(OPENJDK_TARGET_OS),macosx) OPTIMIZATION:=HIGH, \ CFLAGS:=$(CFLAGS_JDKLIB) $(LIBJLI_CFLAGS),\ LDFLAGS:=-nostdlib -r,\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjli_static)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjli_static,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(JDK_OUTPUTDIR)/objs/libjli_static.a : $(BUILD_LIBJLI_STATIC) $(call install-file) @@ -2192,7 +2205,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJFR,\ -D "JDK_INTERNAL_NAME=jfr" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjfr,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBJFR) @@ -2244,7 +2257,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBKCMS,\ -D "JDK_INTERNAL_NAME=kcms" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libkcms,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBKCMS) : $(BUILD_LIBJAVA) @@ -2279,7 +2292,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBSUNWJDGA, \ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ LDFLAGS_SUFFIX:=-L$(OPENWIN_LIB)$(OPENJDK_TARGET_CPU_ISADIR) -R$(OPENWIN_LIB)$(OPENJDK_TARGET_CPU_ISADIR) -ldga -lX11 $(LIBDL) -lc, \ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsunwjdga)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsunwjdga,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBSUNWJDGA) @@ -2369,7 +2383,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT_HEADLESS,\ LDFLAGS_SUFFIX_linux:=-ljvm -lawt -lm $(LIBDL) -ljava,\ LDFLAGS_SUFFIX_solaris:=$(LIBDL) -ljvm -lawt -lm -ljava $(LIBCXX) -lc,\ LDFLAGS_SUFFIX_macosx:=-ljvm $(LIBCXX) -lawt $(LIBDL) -ljava,\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_headless)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_headless,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBAWT_HEADLESS) : $(BUILD_LIBAWT) @@ -2462,7 +2477,7 @@ $(eval $(call SetupNativeCompilation,LIBSPLASHSCREEN,\ -D "JDK_INTERNAL_NAME=splashscreen" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsplashscreen,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(LIBSPLASHSCREEN) @@ -2504,7 +2519,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBDCPR,\ -D "JDK_INTERNAL_NAME=dcpr" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libdcpr,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBDCPR) : $(BUILD_LIBJAVA) @@ -2538,7 +2553,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2PCSC,\ -D "JDK_INTERNAL_NAME=j2pcsc" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libj2pcsc,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBJ2PCSC) @@ -2560,7 +2575,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2GSS,\ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_SUFFIX:=$(LIBDL),\ LDFLAGS_SUFFIX_solaris:=-lc,\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libj2gss)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libj2gss,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBJ2GSS) endif @@ -2599,7 +2615,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBKRB5,\ -D "JDK_INTERNAL_NAME=$(BUILD_LIBKRB5_NAME)" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libkrb5,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBKRB5) endif @@ -2625,7 +2641,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBSUNMSCAPI,\ -D "JDK_INTERNAL_NAME=sunmscapi" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsunmscapi,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBSUNMSCAPI) endif @@ -2657,7 +2673,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2PKCS11,\ -D "JDK_INTERNAL_NAME=j2pkcs11" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libj2pkcs11,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBJ2PKCS11) @@ -2703,7 +2719,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBSUNEC,\ -D "JDK_INTERNAL_NAME=sunec" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libsunec,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBSUNEC) endif @@ -2847,7 +2863,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJSOUND,\ -D "JDK_INTERNAL_NAME=jsound" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjsound,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBJSOUND) : $(BUILD_LIBJAVA) @@ -2882,7 +2898,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJSOUNDALSA,\ LDFLAGS:=$(LDFLAGS_JDKLIB)\ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_SUFFIX:=-lasound -ljava -ljvm,\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjsoundalsa)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjsoundalsa,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBJSOUNDALSA) : $(BUILD_LIBJAVA) @@ -2915,7 +2932,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJSOUNDDS,\ -D "JDK_INTERNAL_NAME=jsoundds" \ -D "JDK_FTYPE=0x2L",\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjsoundds,\ - DEBUG_SYMBOLS:=$(WINDOWS_ONLY))) + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBJSOUNDDS) : $(BUILD_LIBJAVA) @@ -2940,7 +2957,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJ2UCRYPTO,\ LDFLAGS:=$(LDFLAGS_JDKLIB),\ LDFLAGS_SUFFIX:=$(LIBDL),\ LDFLAGS_SUFFIX_solaris:=-lc,\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libj2ucrypto)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libj2ucrypto,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBJ2UCRYPTO) : $(BUILD_LIBJAVA) @@ -2970,7 +2988,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAPPLESCRIPTENGINE,\ -F/System/Library/Frameworks/JavaVM.framework/Frameworks \ -framework JavaNativeFoundation \ $(LDFLAGS_JDKLIB_SUFFIX),\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libAppleScriptEngine)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libAppleScriptEngine,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(BUILD_LIBAPPLESCRIPTENGINE) : $(BUILD_LIBJAVA) @@ -3009,7 +3028,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBOSXAPP,\ -framework OpenGL \ -framework IOSurface \ -framework QuartzCore, \ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libosxapp)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libosxapp,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBOSXAPP) @@ -3049,7 +3069,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBOSX,\ -framework Security \ -framework SystemConfiguration \ $(LDFLAGS_JDKLIB_SUFFIX), \ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libosx)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libosx,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBOSX) @@ -3182,7 +3203,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT_LWAWT,\ -framework JavaRuntimeSupport \ -framework OpenGL \ -framework QuartzCore -ljava,\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_lwawt)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_lwawt,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBAWT_LWAWT) @@ -3222,7 +3244,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBOSXUI,\ -framework JavaNativeFoundation \ -framework JavaRuntimeSupport \ -ljava -ljvm,\ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libosxui)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libosxui,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) BUILD_LIBRARIES += $(BUILD_LIBOSXUI) @@ -3262,7 +3285,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJOBJC32,\ -F/System/Library/Frameworks/JavaVM.framework/Frameworks \ -framework JavaNativeFoundation \ -lffi, \ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjobjc32)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjobjc32,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(eval $(call SetupNativeCompilation,BUILD_LIBJOBJC64,\ LIBRARY:=JObjC,\ @@ -3286,7 +3310,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJOBJC64,\ -F/System/Library/Frameworks/JavaVM.framework/Frameworks \ -framework JavaNativeFoundation \ -lffi, \ - OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjobjc64)) + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjobjc64,\ + DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) $(INSTALL_LIBRARIES_HERE)/$(LIBRARY_PREFIX)JObjC$(SHARED_LIBRARY_SUFFIX): $(BUILD_LIBJOBJC32) $(BUILD_LIBJOBJC64) $(LIPO) -create -output $@ $(BUILD_LIBJOBJC32) $(BUILD_LIBJOBJC64) diff --git a/makefiles/GensrcX11Wrappers.gmk b/makefiles/GensrcX11Wrappers.gmk index 6a183d783ecf82510fc0286443853bb3958a193b..934ddbed32bc55f690767d8c111e8bb029439757 100644 --- a/makefiles/GensrcX11Wrappers.gmk +++ b/makefiles/GensrcX11Wrappers.gmk @@ -86,10 +86,15 @@ ifneq ($(COMPILE_TYPE),cross) $(MKDIR) -p $(@D) $(TOOL_WRAPPERGENERATOR) $(@D) $(GENSRC_SIZER_DIR)/xlibtypes.txt "sizer" $* + # use -m32/-m64 only if the compiler supports it + ifeq ($(COMPILER_SUPPORTS_TARGET_BITS_FLAG),true) + MEMORY_MODEL_FLAG="-m$*" + endif + # Compile the C code into an executable. $(GENSRC_X11WRAPPERS_TMP)/sizer.%.exe : $(GENSRC_X11WRAPPERS_TMP)/sizer.%.c $(MKDIR) -p $(@D) - (cd $(@D) && $(CC) -m$* -o $@ $< \ + (cd $(@D) && $(CC) $(MEMORY_MODEL_FLAG) -o $@ $< \ $(X_CFLAGS) \ $(X_LIBS) \ -I$(JDK_OUTPUTDIR)/include \ diff --git a/makefiles/Images.gmk b/makefiles/Images.gmk index fe4763813226f7fbce8f8ddfe46a31f0bac3585a..fb74b2dc74becdf62678bf23ede4a443617fd328 100644 --- a/makefiles/Images.gmk +++ b/makefiles/Images.gmk @@ -352,16 +352,22 @@ ifneq ($(OPENJDK_TARGET_OS),windows) JDK_MAN_PAGES += jvisualvm.1 endif + ifndef OPENJDK + MAN_SRC_BASEDIR:=$(JDK_TOPDIR)/src/closed + else + MAN_SRC_BASEDIR:=$(JDK_TOPDIR)/src + endif + ifeq ($(OPENJDK_TARGET_OS), linux) - MAN_SRC_DIR:=$(JDK_TOPDIR)/src/linux/doc + MAN_SRC_DIR:=$(MAN_SRC_BASEDIR)/linux/doc MAN1_SUBDIR:=man endif ifeq ($(OPENJDK_TARGET_OS), solaris) - MAN_SRC_DIR:=$(JDK_TOPDIR)/src/solaris/doc + MAN_SRC_DIR:=$(MAN_SRC_BASEDIR)/solaris/doc MAN1_SUBDIR:=sun/man/man1 endif ifeq ($(OPENJDK_TARGET_OS), macosx) - MAN_SRC_DIR:=$(JDK_TOPDIR)/src/bsd/doc + MAN_SRC_DIR:=$(MAN_SRC_BASEDIR)/bsd/doc MAN1_SUBDIR:=man JDK_MAN_PAGES := $(filter-out jcmd.1, $(JDK_MAN_PAGES)) JDK_MAN_PAGES := $(filter-out jvisualvm.1, $(JDK_MAN_PAGES)) diff --git a/src/macosx/classes/sun/awt/CGraphicsDevice.java b/src/macosx/classes/sun/awt/CGraphicsDevice.java index 16ae8a82dbb598058cbc38188e9da32af7e3dcfd..a3dc7e4cd2747f8987a702079e10b142b464b85d 100644 --- a/src/macosx/classes/sun/awt/CGraphicsDevice.java +++ b/src/macosx/classes/sun/awt/CGraphicsDevice.java @@ -35,10 +35,18 @@ import java.util.Objects; import sun.java2d.opengl.CGLGraphicsConfig; -public final class CGraphicsDevice extends GraphicsDevice { +public final class CGraphicsDevice extends GraphicsDevice + implements DisplayChangedListener { - // CoreGraphics display ID - private final int displayID; + /** + * CoreGraphics display ID. This identifier can become non-valid at any time + * therefore methods, which is using this id should be ready to it. + */ + private volatile int displayID; + private volatile Insets screenInsets; + private volatile double xResolution; + private volatile double yResolution; + private volatile int scale; // Array of all GraphicsConfig instances for this device private final GraphicsConfiguration[] configs; @@ -51,7 +59,7 @@ public final class CGraphicsDevice extends GraphicsDevice { // Save/restore DisplayMode for the Full Screen mode private DisplayMode originalMode; - public CGraphicsDevice(int displayID) { + public CGraphicsDevice(final int displayID) { this.displayID = displayID; configs = new GraphicsConfiguration[] { CGLGraphicsConfig.getConfig(this, 0) @@ -89,7 +97,7 @@ public final class CGraphicsDevice extends GraphicsDevice { */ @Override public String getIDstring() { - return "Display " + this.displayID; + return "Display " + displayID; } /** @@ -104,15 +112,37 @@ public final class CGraphicsDevice extends GraphicsDevice { } public double getXResolution() { - return nativeGetXResolution(displayID); + return xResolution; } public double getYResolution() { - return nativeGetYResolution(displayID); + return yResolution; } public Insets getScreenInsets() { - return nativeGetScreenInsets(displayID); + return screenInsets; + } + + public int getScaleFactor() { + return scale; + } + + public void invalidate(final int defaultDisplayID) { + displayID = defaultDisplayID; + } + + @Override + public void displayChanged() { + xResolution = nativeGetXResolution(displayID); + yResolution = nativeGetYResolution(displayID); + screenInsets = nativeGetScreenInsets(displayID); + scale = (int) nativeGetScaleFactor(displayID); + //TODO configs/fullscreenWindow/modes? + } + + @Override + public void paletteChanged() { + // devices do not need to react to this event. } /** @@ -219,10 +249,6 @@ public final class CGraphicsDevice extends GraphicsDevice { return nativeGetDisplayModes(displayID); } - public int getScaleFactor() { - return (int) nativeGetScaleFactor(displayID); - } - private static native double nativeGetScaleFactor(int displayID); private static native void nativeSetDisplayMode(int displayID, int w, int h, int bpp, int refrate); diff --git a/src/macosx/classes/sun/awt/CGraphicsEnvironment.java b/src/macosx/classes/sun/awt/CGraphicsEnvironment.java index ab435a93fac69a6b44c8bf6a58216361fab9dd3a..a2319e675f0d65203f252642db74a30a77d3fb0a 100644 --- a/src/macosx/classes/sun/awt/CGraphicsEnvironment.java +++ b/src/macosx/classes/sun/awt/CGraphicsEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,19 +26,20 @@ package sun.awt; import java.awt.*; -import java.awt.print.*; import java.util.*; import sun.java2d.*; /** - * This is an implementation of a GraphicsEnvironment object for the default local GraphicsEnvironment used by the Java - * Runtime Environment for Mac OS X GUI environments. + * This is an implementation of a GraphicsEnvironment object for the default + * local GraphicsEnvironment used by the Java Runtime Environment for Mac OS X + * GUI environments. * * @see GraphicsDevice * @see GraphicsConfiguration */ -public class CGraphicsEnvironment extends SunGraphicsEnvironment { +public final class CGraphicsEnvironment extends SunGraphicsEnvironment { + // Global initialization of the Cocoa runtime. private static native void initCocoa(); @@ -53,7 +54,8 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { private static native int getMainDisplayID(); /** - * Noop function that just acts as an entry point for someone to force a static initialization of this class. + * Noop function that just acts as an entry point for someone to force a + * static initialization of this class. */ public static void init() { } @@ -78,8 +80,9 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { } /** - * Register the instance with CGDisplayRegisterReconfigurationCallback() - * The registration uses a weak global reference -- if our instance is garbage collected, the reference will be dropped. + * Register the instance with CGDisplayRegisterReconfigurationCallback(). + * The registration uses a weak global reference -- if our instance is + * garbage collected, the reference will be dropped. * * @return Return the registration context (a pointer). */ @@ -91,7 +94,7 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { private native void deregisterDisplayReconfiguration(long context); /** Available CoreGraphics displays. */ - private final Map devices = new HashMap(); + private final Map devices = new HashMap<>(5); /** Reference to the display reconfiguration callback context. */ private final long displayReconfigContext; @@ -118,11 +121,18 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { /** * Called by the CoreGraphics Display Reconfiguration Callback. * - * @param displayId - * CoreGraphics displayId + * @param displayId CoreGraphics displayId + * @param removed true if displayId was removed, false otherwise. */ - void _displayReconfiguration(long displayId) { - displayChanged(); + void _displayReconfiguration(final int displayId, final boolean removed) { + synchronized (this) { + if (removed && devices.containsKey(displayId)) { + final CGraphicsDevice gd = devices.remove(displayId); + gd.invalidate(getMainDisplayID()); + gd.displayChanged(); + } + } + initDevices(); } @Override @@ -135,31 +145,30 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { } /** - * (Re)create all CGraphicsDevices - * - * @return + * (Re)create all CGraphicsDevices, reuses a devices if it is possible. */ - private synchronized void initDevices() { - devices.clear(); - - int mainID = getMainDisplayID(); - - // initialization of the graphics device may change - // list of displays on hybrid systems via an activation - // of discrete video. - // So, we initialize the main display first, and then - // retrieve actual list of displays. - CGraphicsDevice mainDevice = new CGraphicsDevice(mainID); - - final int[] displayIDs = getDisplayIDs(); + private void initDevices() { + synchronized (this) { + final Map old = new HashMap<>(devices); + devices.clear(); + + int mainID = getMainDisplayID(); + + // initialization of the graphics device may change + // list of displays on hybrid systems via an activation + // of discrete video. + // So, we initialize the main display first, and then + // retrieve actual list of displays. + if (!old.containsKey(mainID)) { + old.put(mainID, new CGraphicsDevice(mainID)); + } - for (int displayID : displayIDs) { - if (displayID != mainID) { - devices.put(displayID, new CGraphicsDevice(displayID)); - } else { - devices.put(mainID, mainDevice); + for (final int id : getDisplayIDs()) { + devices.put(id, old.containsKey(id) ? old.get(id) + : new CGraphicsDevice(id)); } } + displayChanged(); } @Override @@ -167,7 +176,7 @@ public class CGraphicsEnvironment extends SunGraphicsEnvironment { final int mainDisplayID = getMainDisplayID(); CGraphicsDevice d = devices.get(mainDisplayID); if (d == null) { - // we do not exepct that this may happen, the only responce + // we do not expect that this may happen, the only response // is to re-initialize the list of devices initDevices(); diff --git a/src/macosx/classes/sun/lwawt/LWComponentPeer.java b/src/macosx/classes/sun/lwawt/LWComponentPeer.java index 3347514421ce293fc526469a2536a9ea15bc3380..1bdfb798f6be82840d2b6253829d355e927aef16 100644 --- a/src/macosx/classes/sun/lwawt/LWComponentPeer.java +++ b/src/macosx/classes/sun/lwawt/LWComponentPeer.java @@ -87,18 +87,22 @@ public abstract class LWComponentPeer private final T target; - // Container peer. It may not be the peer of the target's direct - // parent, for example, in the case of hw/lw mixing. However, - // let's skip this scenario for the time being. We also assume - // the container peer is not null, which might also be false if - // addNotify() is called for a component outside of the hierarchy. - // The exception is LWWindowPeers: their parents are always null - private LWContainerPeer containerPeer; - - // Handy reference to the top-level window peer. Window peer is - // borrowed from the containerPeer in constructor, and should also - // be updated when the component is reparented to another container - private LWWindowPeer windowPeer; + /** + * Container peer. It may not be the peer of the target's direct parent, for + * example, in the case of hw/lw mixing. However, let's skip this scenario + * for the time being. We also assume the container peer is not null, which + * might also be false if addNotify() is called for a component outside of + * the hierarchy. The exception is LWWindowPeers: their containers are + * always null + */ + private final LWContainerPeer containerPeer; + + /** + * Handy reference to the top-level window peer. Window peer is borrowed + * from the containerPeer in constructor, and should also be updated when + * the component is reparented to another container + */ + private final LWWindowPeer windowPeer; private final AtomicBoolean disposed = new AtomicBoolean(false); @@ -183,13 +187,13 @@ public abstract class LWComponentPeer this.target = target; this.platformComponent = platformComponent; - initializeContainerPeer(); // Container peer is always null for LWWindowPeers, so // windowPeer is always null for them as well. On the other // hand, LWWindowPeer shouldn't use windowPeer at all - if (containerPeer != null) { - windowPeer = containerPeer.getWindowPeerOrSelf(); - } + final Container container = SunToolkit.getNativeContainer(target); + containerPeer = (LWContainerPeer) LWToolkit.targetToPeer(container); + windowPeer = containerPeer != null ? containerPeer.getWindowPeerOrSelf() + : null; // don't bother about z-order here as updateZOrder() // will be called from addNotify() later anyway if (containerPeer != null) { @@ -356,15 +360,6 @@ public abstract class LWComponentPeer return containerPeer; } - // Just a helper method - // Overridden in LWWindowPeer to skip containerPeer initialization - protected void initializeContainerPeer() { - Container parent = LWToolkit.getNativeContainer(target); - if (parent != null) { - containerPeer = (LWContainerPeer) LWToolkit.targetToPeer(parent); - } - } - public PlatformWindow getPlatformWindow() { LWWindowPeer windowPeer = getWindowPeer(); return windowPeer.getPlatformWindow(); diff --git a/src/macosx/classes/sun/lwawt/LWWindowPeer.java b/src/macosx/classes/sun/lwawt/LWWindowPeer.java index 2774f055728a3fe2c8bcc04a3e5d6fdcd017c066..5ffaae70f219297b010b5f4156ab78ac56fd3871 100644 --- a/src/macosx/classes/sun/lwawt/LWWindowPeer.java +++ b/src/macosx/classes/sun/lwawt/LWWindowPeer.java @@ -41,7 +41,7 @@ import sun.util.logging.PlatformLogger; public class LWWindowPeer extends LWContainerPeer - implements WindowPeer, FramePeer, DialogPeer, FullScreenCapable + implements FramePeer, DialogPeer, FullScreenCapable, DisplayChangedListener { public static enum PeerType { SIMPLEWINDOW, @@ -189,6 +189,7 @@ public class LWWindowPeer if (getSurfaceData() == null) { replaceSurfaceData(false); } + activateDisplayListener(); } // Just a helper method @@ -201,15 +202,11 @@ public class LWWindowPeer return this; } - @Override - protected void initializeContainerPeer() { - // No-op as LWWindowPeer doesn't have any containerPeer - } - // ---- PEER METHODS ---- // @Override protected void disposeImpl() { + deactivateDisplayListener(); SurfaceData oldData = getSurfaceData(); synchronized (surfaceDataLock){ surfaceData = null; @@ -880,6 +877,18 @@ public class LWWindowPeer // ---- UTILITY METHODS ---- // + private void activateDisplayListener() { + final GraphicsEnvironment ge = + GraphicsEnvironment.getLocalGraphicsEnvironment(); + ((SunGraphicsEnvironment) ge).addDisplayChangedListener(this); + } + + private void deactivateDisplayListener() { + final GraphicsEnvironment ge = + GraphicsEnvironment.getLocalGraphicsEnvironment(); + ((SunGraphicsEnvironment) ge).removeDisplayChangedListener(this); + } + private void postWindowStateChangedEvent(int newWindowState) { if (getTarget() instanceof Frame) { AWTAccessor.getFrameAccessor().setExtendedState( @@ -941,7 +950,6 @@ public class LWWindowPeer graphicsDevice = newGraphicsDevice; } - // TODO: DisplayChangedListener stuff final GraphicsConfiguration newGC = newGraphicsDevice.getDefaultConfiguration(); if (!setGraphicsConfig(newGC)) return false; @@ -954,6 +962,20 @@ public class LWWindowPeer return true; } + @Override + public final void displayChanged() { + updateGraphicsDevice(); + // Replace surface unconditionally, because internal state of the + // GraphicsDevice could be changed. + replaceSurfaceData(); + repaintPeer(); + } + + @Override + public final void paletteChanged() { + // components do not need to react to this event. + } + /* * May be called by delegate to provide SD to Java2D code. */ diff --git a/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java b/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java index a8062c7899dd788217d3320e833a05088881a67c..b2f264f959d88daf45731ac3d0d4e43a8cd2e06f 100644 --- a/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java +++ b/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java @@ -32,6 +32,7 @@ import java.awt.peer.WindowPeer; import java.beans.*; import java.lang.reflect.InvocationTargetException; import java.util.List; +import java.util.Objects; import javax.swing.*; @@ -916,9 +917,12 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo final Rectangle oldB = nativeBounds; nativeBounds = new Rectangle(x, y, width, height); + final GraphicsConfiguration oldGC = peer.getGraphicsConfiguration(); peer.notifyReshape(x, y, width, height); + final GraphicsConfiguration newGC = peer.getGraphicsConfiguration(); + // System-dependent appearance optimization. if ((byUser && !oldB.getSize().equals(nativeBounds.getSize())) - || isFullScreenAnimationOn) { + || isFullScreenAnimationOn || !Objects.equals(newGC, oldGC)) { flushBuffers(); } } diff --git a/src/macosx/native/sun/awt/AWTEvent.h b/src/macosx/native/sun/awt/AWTEvent.h index f813b8c7d004500319054a2142d48247585f5c0d..7769f3d416338b5bf0eb9f196494bec9d280c917 100644 --- a/src/macosx/native/sun/awt/AWTEvent.h +++ b/src/macosx/native/sun/awt/AWTEvent.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,5 +35,6 @@ void SendAdditionalJavaEvents(JNIEnv *env, NSEvent *nsEvent, jobject peer); jint GetJavaMouseModifiers(NSInteger button, NSUInteger modifierFlags); jint NsKeyModifiersToJavaModifiers(NSUInteger nsFlags, BOOL isExtMods); NSUInteger JavaModifiersToNsKeyModifiers(jint javaModifiers, BOOL isExtMods); +unichar NsCharToJavaChar(unichar nsChar, NSUInteger modifiers); #endif /* __AWTEVENT_H */ diff --git a/src/macosx/native/sun/awt/AWTEvent.m b/src/macosx/native/sun/awt/AWTEvent.m index 7bde46f17097f0fad13ee482eefe690e0df1b193..fd3caa6051f28bf5aa94ec56d0b3ef91a7951ebe 100644 --- a/src/macosx/native/sun/awt/AWTEvent.m +++ b/src/macosx/native/sun/awt/AWTEvent.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -341,8 +341,7 @@ const charTable[] = { {0, 0, 0} }; -static unichar -NsCharToJavaChar(unichar nsChar, NSUInteger modifiers) +unichar NsCharToJavaChar(unichar nsChar, NSUInteger modifiers) { const struct _char *cur; // Mask off just the keyboard modifiers from the event modifier mask. diff --git a/src/macosx/native/sun/awt/CGraphicsEnv.m b/src/macosx/native/sun/awt/CGraphicsEnv.m index da018a2de275c60a6f030300d3bb583d29314ef2..8f8a53c31862d784b37ebd1887be2469887a1b48 100644 --- a/src/macosx/native/sun/awt/CGraphicsEnv.m +++ b/src/macosx/native/sun/awt/CGraphicsEnv.m @@ -124,10 +124,11 @@ static void displaycb_handle jobject graphicsEnv = [wrapper jObjectWithEnv:env]; if (graphicsEnv == NULL) return; // ref already GC'd - static JNF_CLASS_CACHE(jc_CGraphicsEnvironment, "sun/awt/CGraphicsEnvironment"); - static JNF_MEMBER_CACHE(jm_displayReconfiguration, jc_CGraphicsEnvironment, "_displayReconfiguration", "(J)V"); - JNFCallVoidMethod(env, graphicsEnv, jm_displayReconfiguration); + static JNF_MEMBER_CACHE(jm_displayReconfiguration, jc_CGraphicsEnvironment, "_displayReconfiguration", "(IZ)V"); + JNFCallVoidMethod(env, graphicsEnv, jm_displayReconfiguration, + (jint) display, + (jboolean) flags & kCGDisplayRemoveFlag); }); } diff --git a/src/macosx/native/sun/awt/CMenuItem.m b/src/macosx/native/sun/awt/CMenuItem.m index b67c70658dd5259435ed1c9e4c28e499796401a5..eaabb3e06aba69fa89b77efdf4d3543698901ffe 100644 --- a/src/macosx/native/sun/awt/CMenuItem.m +++ b/src/macosx/native/sun/awt/CMenuItem.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -71,12 +71,21 @@ AWT_ASSERT_APPKIT_THREAD; JNF_COCOA_ENTER(env); // If we are called as a result of user pressing a shorcut, do nothing, - // because AVTView has already sent corresponding key event to the Java + // because AVTView has already sent corresponding key event to the Java // layer from performKeyEquivalent NSEvent *currEvent = [[NSApplication sharedApplication] currentEvent]; if ([currEvent type] == NSKeyDown) { NSString *menuKey = [sender keyEquivalent]; NSString *eventKey = [currEvent charactersIgnoringModifiers]; + + // Apple uses characters from private Unicode range for some of the + // keys, so we need to do the same translation here that we do + // for the regular key down events + if ([eventKey length] == 1) { + unichar ch = NsCharToJavaChar([eventKey characterAtIndex:0], 0); + eventKey = [NSString stringWithCharacters: &ch length: 1]; + } + if ([menuKey isEqualToString:eventKey]) { return; } diff --git a/src/macosx/native/sun/awt/CTextPipe.m b/src/macosx/native/sun/awt/CTextPipe.m index 578bf9ca0e3df7ddde1f60f6cff60279647996ae..d9bf48afd9285dd8d5f12d746fa37145e7c5c98a 100644 --- a/src/macosx/native/sun/awt/CTextPipe.m +++ b/src/macosx/native/sun/awt/CTextPipe.m @@ -143,6 +143,8 @@ void JavaCT_DrawGlyphVector CGContextRef cgRef = qsdo->cgRef; CGAffineTransform ctmText = CGContextGetTextMatrix(cgRef); + BOOL saved = false; + /* Save and restore of graphics context is done before the iteration. This seems to work using our test case (see bug ID 7158350) so we are restoring it at the end of the for loop. If we find out that save/restore outside the loop @@ -175,10 +177,19 @@ void JavaCT_DrawGlyphVector CFRelease(fallback); if (cgFallback) { + if (!saved) { + CGContextSaveGState(cgRef); + saved = true; + } CGContextSetFont(cgRef, cgFallback); CFRelease(cgFallback); } } + } else { + if (saved) { + CGContextRestoreGState(cgRef); + saved = false; + } } // if we have per-glyph transformations diff --git a/src/macosx/native/sun/awt/awt.m b/src/macosx/native/sun/awt/awt.m index ea684ed0808a228317c5d8ab3eda59d68fe66d3d..5e7942aa0163f6154200d5f2635986f1cfb5d3c9 100644 --- a/src/macosx/native/sun/awt/awt.m +++ b/src/macosx/native/sun/awt/awt.m @@ -316,7 +316,10 @@ AWT_ASSERT_APPKIT_THREAD; // its finishLaunching has initialized it. // ApplicationDelegate is the support code for com.apple.eawt. [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ - OSXAPP_SetApplicationDelegate([ApplicationDelegate sharedDelegate]); + id delegate = [ApplicationDelegate sharedDelegate]; + if (delegate != nil) { + OSXAPP_SetApplicationDelegate(delegate); + } }]; } diff --git a/src/macosx/native/sun/java2d/opengl/CGLLayer.m b/src/macosx/native/sun/java2d/opengl/CGLLayer.m index 000684ee9cb7a6256baee822bea91b4c2dfc2530..e0074eb4ef3d68355c75dbdd2632087fca11b53c 100644 --- a/src/macosx/native/sun/java2d/opengl/CGLLayer.m +++ b/src/macosx/native/sun/java2d/opengl/CGLLayer.m @@ -216,7 +216,11 @@ Java_sun_java2d_opengl_CGLLayer_nativeSetScale { JNF_COCOA_ENTER(env); CGLLayer *layer = jlong_to_ptr(layerPtr); - [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ + // We always call all setXX methods asynchronously, exception is only in + // this method where we need to change native texture size and layer's scale + // in one call on appkit, otherwise we'll get window's contents blinking, + // during screen-2-screen moving. + [ThreadUtilities performOnMainThreadWaiting:[NSThread isMainThread] block:^(){ layer.contentsScale = scale; }]; JNF_COCOA_EXIT(env); diff --git a/src/share/classes/java/awt/Component.java b/src/share/classes/java/awt/Component.java index 3bfb115c15e8fc924f20701b410d152b405faba3..0dfb99996db5c8fe159040ef043351539af0da62 100644 --- a/src/share/classes/java/awt/Component.java +++ b/src/share/classes/java/awt/Component.java @@ -1051,11 +1051,11 @@ public abstract class Component implements ImageObserver, MenuContainer, return parent; } - // This method is overriden in the Window class to return null, + // This method is overridden in the Window class to return null, // because the parent field of the Window object contains // the owner of the window, not its parent. Container getContainer() { - return getParent(); + return getParent_NoClientCode(); } /** @@ -8194,10 +8194,10 @@ public abstract class Component implements ImageObserver, MenuContainer, * Fetches the native container somewhere higher up in the component * tree that contains this component. */ - Container getNativeContainer() { - Container p = parent; + final Container getNativeContainer() { + Container p = getContainer(); while (p != null && p.peer instanceof LightweightPeer) { - p = p.getParent_NoClientCode(); + p = p.getContainer(); } return p; } diff --git a/src/share/classes/java/awt/Window.java b/src/share/classes/java/awt/Window.java index 89270e27df11b7c5265d66e68e9ecab30fef1172..6428019f643fedd3f53a77de18b67d1ab02f393e 100644 --- a/src/share/classes/java/awt/Window.java +++ b/src/share/classes/java/awt/Window.java @@ -3914,7 +3914,7 @@ public class Window extends Container implements Accessible { // ************************** MIXING CODE ******************************* - // A window has a parent, but it does NOT have a container + // A window has an owner, but it does NOT have a container @Override final Container getContainer() { return null; diff --git a/src/share/classes/java/beans/MetaData.java b/src/share/classes/java/beans/MetaData.java index 3e3f5d11e0923e100a3a5443011a776426ff9d4e..61f51d4bb3fac030929d05c24e824fc745fba1c7 100644 --- a/src/share/classes/java/beans/MetaData.java +++ b/src/share/classes/java/beans/MetaData.java @@ -69,8 +69,9 @@ import java.util.Objects; * @author Philip Milne * @author Steve Langley */ +class MetaData { -class NullPersistenceDelegate extends PersistenceDelegate { +static final class NullPersistenceDelegate extends PersistenceDelegate { // Note this will be called by all classes when they reach the // top of their superclass chain. protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { @@ -87,7 +88,7 @@ class NullPersistenceDelegate extends PersistenceDelegate { * * @author Sergey A. Malenkov */ -class EnumPersistenceDelegate extends PersistenceDelegate { +static final class EnumPersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return oldInstance == newInstance; } @@ -98,7 +99,7 @@ class EnumPersistenceDelegate extends PersistenceDelegate { } } -class PrimitivePersistenceDelegate extends PersistenceDelegate { +static final class PrimitivePersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return oldInstance.equals(newInstance); } @@ -109,7 +110,7 @@ class PrimitivePersistenceDelegate extends PersistenceDelegate { } } -class ArrayPersistenceDelegate extends PersistenceDelegate { +static final class ArrayPersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return (newInstance != null && oldInstance.getClass() == newInstance.getClass() && // Also ensures the subtype is correct. @@ -150,7 +151,7 @@ class ArrayPersistenceDelegate extends PersistenceDelegate { } } -class ProxyPersistenceDelegate extends PersistenceDelegate { +static final class ProxyPersistenceDelegate extends PersistenceDelegate { protected Expression instantiate(Object oldInstance, Encoder out) { Class type = oldInstance.getClass(); java.lang.reflect.Proxy p = (java.lang.reflect.Proxy)oldInstance; @@ -185,7 +186,7 @@ class ProxyPersistenceDelegate extends PersistenceDelegate { } // Strings -class java_lang_String_PersistenceDelegate extends PersistenceDelegate { +static final class java_lang_String_PersistenceDelegate extends PersistenceDelegate { protected Expression instantiate(Object oldInstance, Encoder out) { return null; } public void writeObject(Object oldInstance, Encoder out) { @@ -194,7 +195,7 @@ class java_lang_String_PersistenceDelegate extends PersistenceDelegate { } // Classes -class java_lang_Class_PersistenceDelegate extends PersistenceDelegate { +static final class java_lang_Class_PersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return oldInstance.equals(newInstance); } @@ -228,7 +229,7 @@ class java_lang_Class_PersistenceDelegate extends PersistenceDelegate { } // Fields -class java_lang_reflect_Field_PersistenceDelegate extends PersistenceDelegate { +static final class java_lang_reflect_Field_PersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return oldInstance.equals(newInstance); } @@ -243,7 +244,7 @@ class java_lang_reflect_Field_PersistenceDelegate extends PersistenceDelegate { } // Methods -class java_lang_reflect_Method_PersistenceDelegate extends PersistenceDelegate { +static final class java_lang_reflect_Method_PersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return oldInstance.equals(newInstance); } @@ -267,7 +268,7 @@ class java_lang_reflect_Method_PersistenceDelegate extends PersistenceDelegate { * * @author Sergey A. Malenkov */ -class java_util_Date_PersistenceDelegate extends PersistenceDelegate { +static class java_util_Date_PersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { if (!super.mutatesTo(oldInstance, newInstance)) { return false; @@ -290,7 +291,7 @@ class java_util_Date_PersistenceDelegate extends PersistenceDelegate { * * @author Sergey A. Malenkov */ -final class java_sql_Timestamp_PersistenceDelegate extends java_util_Date_PersistenceDelegate { +static final class java_sql_Timestamp_PersistenceDelegate extends java_util_Date_PersistenceDelegate { private static final Method getNanosMethod = getNanosMethod(); private static Method getNanosMethod() { @@ -354,7 +355,7 @@ delegates to be registered with concrete classes. * * @author Sergey A. Malenkov */ -abstract class java_util_Collections extends PersistenceDelegate { +private static abstract class java_util_Collections extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { if (!super.mutatesTo(oldInstance, newInstance)) { return false; @@ -367,6 +368,10 @@ abstract class java_util_Collections extends PersistenceDelegate { return (oldC.size() == newC.size()) && oldC.containsAll(newC); } + protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { + // do not initialize these custom collections in default way + } + static final class EmptyList_PersistenceDelegate extends java_util_Collections { protected Expression instantiate(Object oldInstance, Encoder out) { return new Expression(oldInstance, Collections.class, "emptyList", null); @@ -569,7 +574,7 @@ abstract class java_util_Collections extends PersistenceDelegate { * * @author Sergey A. Malenkov */ -class java_util_EnumMap_PersistenceDelegate extends PersistenceDelegate { +static final class java_util_EnumMap_PersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return super.mutatesTo(oldInstance, newInstance) && (getType(oldInstance) == getType(newInstance)); } @@ -588,7 +593,7 @@ class java_util_EnumMap_PersistenceDelegate extends PersistenceDelegate { * * @author Sergey A. Malenkov */ -class java_util_EnumSet_PersistenceDelegate extends PersistenceDelegate { +static final class java_util_EnumSet_PersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return super.mutatesTo(oldInstance, newInstance) && (getType(oldInstance) == getType(newInstance)); } @@ -603,7 +608,7 @@ class java_util_EnumSet_PersistenceDelegate extends PersistenceDelegate { } // Collection -class java_util_Collection_PersistenceDelegate extends DefaultPersistenceDelegate { +static class java_util_Collection_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { java.util.Collection oldO = (java.util.Collection)oldInstance; java.util.Collection newO = (java.util.Collection)newInstance; @@ -618,7 +623,7 @@ class java_util_Collection_PersistenceDelegate extends DefaultPersistenceDelegat } // List -class java_util_List_PersistenceDelegate extends DefaultPersistenceDelegate { +static class java_util_List_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { java.util.List oldO = (java.util.List)oldInstance; java.util.List newO = (java.util.List)newInstance; @@ -653,7 +658,7 @@ class java_util_List_PersistenceDelegate extends DefaultPersistenceDelegate { // Map -class java_util_Map_PersistenceDelegate extends DefaultPersistenceDelegate { +static class java_util_Map_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { // System.out.println("Initializing: " + newInstance); java.util.Map oldMap = (java.util.Map)oldInstance; @@ -691,14 +696,14 @@ class java_util_Map_PersistenceDelegate extends DefaultPersistenceDelegate { } } -class java_util_AbstractCollection_PersistenceDelegate extends java_util_Collection_PersistenceDelegate {} -class java_util_AbstractList_PersistenceDelegate extends java_util_List_PersistenceDelegate {} -class java_util_AbstractMap_PersistenceDelegate extends java_util_Map_PersistenceDelegate {} -class java_util_Hashtable_PersistenceDelegate extends java_util_Map_PersistenceDelegate {} +static final class java_util_AbstractCollection_PersistenceDelegate extends java_util_Collection_PersistenceDelegate {} +static final class java_util_AbstractList_PersistenceDelegate extends java_util_List_PersistenceDelegate {} +static final class java_util_AbstractMap_PersistenceDelegate extends java_util_Map_PersistenceDelegate {} +static final class java_util_Hashtable_PersistenceDelegate extends java_util_Map_PersistenceDelegate {} // Beans -class java_beans_beancontext_BeanContextSupport_PersistenceDelegate extends java_util_Collection_PersistenceDelegate {} +static final class java_beans_beancontext_BeanContextSupport_PersistenceDelegate extends java_util_Collection_PersistenceDelegate {} // AWT @@ -709,7 +714,7 @@ class java_beans_beancontext_BeanContextSupport_PersistenceDelegate extends java * * @author Sergey A. Malenkov */ -final class java_awt_Insets_PersistenceDelegate extends PersistenceDelegate { +static final class java_awt_Insets_PersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return oldInstance.equals(newInstance); } @@ -733,7 +738,7 @@ final class java_awt_Insets_PersistenceDelegate extends PersistenceDelegate { * * @author Sergey A. Malenkov */ -final class java_awt_Font_PersistenceDelegate extends PersistenceDelegate { +static final class java_awt_Font_PersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return oldInstance.equals(newInstance); } @@ -802,7 +807,7 @@ final class java_awt_Font_PersistenceDelegate extends PersistenceDelegate { * * @author Sergey A. Malenkov */ -final class java_awt_AWTKeyStroke_PersistenceDelegate extends PersistenceDelegate { +static final class java_awt_AWTKeyStroke_PersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return oldInstance.equals(newInstance); } @@ -843,7 +848,7 @@ final class java_awt_AWTKeyStroke_PersistenceDelegate extends PersistenceDelegat } } -class StaticFieldsPersistenceDelegate extends PersistenceDelegate { +static class StaticFieldsPersistenceDelegate extends PersistenceDelegate { protected void installFields(Encoder out, Class cls) { Field fields[] = cls.getFields(); for(int i = 0; i < fields.length; i++) { @@ -870,13 +875,13 @@ class StaticFieldsPersistenceDelegate extends PersistenceDelegate { } // SystemColor -class java_awt_SystemColor_PersistenceDelegate extends StaticFieldsPersistenceDelegate {} +static final class java_awt_SystemColor_PersistenceDelegate extends StaticFieldsPersistenceDelegate {} // TextAttribute -class java_awt_font_TextAttribute_PersistenceDelegate extends StaticFieldsPersistenceDelegate {} +static final class java_awt_font_TextAttribute_PersistenceDelegate extends StaticFieldsPersistenceDelegate {} // MenuShortcut -class java_awt_MenuShortcut_PersistenceDelegate extends PersistenceDelegate { +static final class java_awt_MenuShortcut_PersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return oldInstance.equals(newInstance); } @@ -889,7 +894,7 @@ class java_awt_MenuShortcut_PersistenceDelegate extends PersistenceDelegate { } // Component -class java_awt_Component_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class java_awt_Component_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); java.awt.Component c = (java.awt.Component)oldInstance; @@ -936,7 +941,7 @@ class java_awt_Component_PersistenceDelegate extends DefaultPersistenceDelegate } // Container -class java_awt_Container_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class java_awt_Container_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); // Ignore the children of a JScrollPane. @@ -971,7 +976,7 @@ class java_awt_Container_PersistenceDelegate extends DefaultPersistenceDelegate } // Choice -class java_awt_Choice_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class java_awt_Choice_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); java.awt.Choice m = (java.awt.Choice)oldInstance; @@ -983,7 +988,7 @@ class java_awt_Choice_PersistenceDelegate extends DefaultPersistenceDelegate { } // Menu -class java_awt_Menu_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class java_awt_Menu_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); java.awt.Menu m = (java.awt.Menu)oldInstance; @@ -995,7 +1000,7 @@ class java_awt_Menu_PersistenceDelegate extends DefaultPersistenceDelegate { } // MenuBar -class java_awt_MenuBar_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class java_awt_MenuBar_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); java.awt.MenuBar m = (java.awt.MenuBar)oldInstance; @@ -1007,7 +1012,7 @@ class java_awt_MenuBar_PersistenceDelegate extends DefaultPersistenceDelegate { } // List -class java_awt_List_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class java_awt_List_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); java.awt.List m = (java.awt.List)oldInstance; @@ -1022,7 +1027,7 @@ class java_awt_List_PersistenceDelegate extends DefaultPersistenceDelegate { // LayoutManagers // BorderLayout -class java_awt_BorderLayout_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class java_awt_BorderLayout_PersistenceDelegate extends DefaultPersistenceDelegate { private static final String[] CONSTRAINTS = { BorderLayout.NORTH, BorderLayout.SOUTH, @@ -1053,41 +1058,44 @@ class java_awt_BorderLayout_PersistenceDelegate extends DefaultPersistenceDelega } // CardLayout -class java_awt_CardLayout_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class java_awt_CardLayout_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); - Hashtable tab = (Hashtable)ReflectionUtils.getPrivateField(oldInstance, - java.awt.CardLayout.class, - "tab", - out.getExceptionListener()); - if (tab != null) { - for(Enumeration e = tab.keys(); e.hasMoreElements();) { - Object child = e.nextElement(); - invokeStatement(oldInstance, "addLayoutComponent", - new Object[]{child, (String)tab.get(child)}, out); + if (getVector(newInstance).isEmpty()) { + for (Object card : getVector(oldInstance)) { + Object[] args = {MetaData.getPrivateFieldValue(card, "java.awt.CardLayout$Card.name"), + MetaData.getPrivateFieldValue(card, "java.awt.CardLayout$Card.comp")}; + invokeStatement(oldInstance, "addLayoutComponent", args, out); } } } + protected boolean mutatesTo(Object oldInstance, Object newInstance) { + return super.mutatesTo(oldInstance, newInstance) && getVector(newInstance).isEmpty(); + } + private static Vector getVector(Object instance) { + return (Vector) MetaData.getPrivateFieldValue(instance, "java.awt.CardLayout.vector"); + } } // GridBagLayout -class java_awt_GridBagLayout_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class java_awt_GridBagLayout_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); - Hashtable comptable = (Hashtable)ReflectionUtils.getPrivateField(oldInstance, - java.awt.GridBagLayout.class, - "comptable", - out.getExceptionListener()); - if (comptable != null) { - for(Enumeration e = comptable.keys(); e.hasMoreElements();) { - Object child = e.nextElement(); - invokeStatement(oldInstance, "addLayoutComponent", - new Object[]{child, comptable.get(child)}, out); + if (getHashtable(newInstance).isEmpty()) { + for (Map.Entry entry : getHashtable(oldInstance).entrySet()) { + Object[] args = {entry.getKey(), entry.getValue()}; + invokeStatement(oldInstance, "addLayoutComponent", args, out); } } } + protected boolean mutatesTo(Object oldInstance, Object newInstance) { + return super.mutatesTo(oldInstance, newInstance) && getHashtable(newInstance).isEmpty(); + } + private static Hashtable getHashtable(Object instance) { + return (Hashtable) MetaData.getPrivateFieldValue(instance, "java.awt.GridBagLayout.comptable"); + } } // Swing @@ -1095,7 +1103,7 @@ class java_awt_GridBagLayout_PersistenceDelegate extends DefaultPersistenceDeleg // JFrame (If we do this for Window instead of JFrame, the setVisible call // will be issued before we have added all the children to the JFrame and // will appear blank). -class javax_swing_JFrame_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class javax_swing_JFrame_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); java.awt.Window oldC = (java.awt.Window)oldInstance; @@ -1115,7 +1123,7 @@ class javax_swing_JFrame_PersistenceDelegate extends DefaultPersistenceDelegate // Models // DefaultListModel -class javax_swing_DefaultListModel_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class javax_swing_DefaultListModel_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { // Note, the "size" property will be set here. super.initialize(type, oldInstance, newInstance, out); @@ -1129,7 +1137,7 @@ class javax_swing_DefaultListModel_PersistenceDelegate extends DefaultPersistenc } // DefaultComboBoxModel -class javax_swing_DefaultComboBoxModel_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class javax_swing_DefaultComboBoxModel_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); javax.swing.DefaultComboBoxModel m = (javax.swing.DefaultComboBoxModel)oldInstance; @@ -1141,7 +1149,7 @@ class javax_swing_DefaultComboBoxModel_PersistenceDelegate extends DefaultPersis // DefaultMutableTreeNode -class javax_swing_tree_DefaultMutableTreeNode_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class javax_swing_tree_DefaultMutableTreeNode_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); @@ -1157,7 +1165,7 @@ class javax_swing_tree_DefaultMutableTreeNode_PersistenceDelegate extends Defaul } // ToolTipManager -class javax_swing_ToolTipManager_PersistenceDelegate extends PersistenceDelegate { +static final class javax_swing_ToolTipManager_PersistenceDelegate extends PersistenceDelegate { protected Expression instantiate(Object oldInstance, Encoder out) { return new Expression(oldInstance, javax.swing.ToolTipManager.class, "sharedInstance", new Object[]{}); @@ -1165,7 +1173,7 @@ class javax_swing_ToolTipManager_PersistenceDelegate extends PersistenceDelegate } // JTabbedPane -class javax_swing_JTabbedPane_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class javax_swing_JTabbedPane_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); javax.swing.JTabbedPane p = (javax.swing.JTabbedPane)oldInstance; @@ -1180,7 +1188,7 @@ class javax_swing_JTabbedPane_PersistenceDelegate extends DefaultPersistenceDele } // Box -class javax_swing_Box_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class javax_swing_Box_PersistenceDelegate extends DefaultPersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return super.mutatesTo(oldInstance, newInstance) && getAxis(oldInstance).equals(getAxis(newInstance)); } @@ -1201,7 +1209,7 @@ class javax_swing_Box_PersistenceDelegate extends DefaultPersistenceDelegate { // Container will return all of the sub menu items that // need to be added to the menu item. // Not so for JMenu apparently. -class javax_swing_JMenu_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class javax_swing_JMenu_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); javax.swing.JMenu m = (javax.swing.JMenu)oldInstance; @@ -1219,7 +1227,7 @@ class javax_swing_JMenu_PersistenceDelegate extends DefaultPersistenceDelegate { * * @author Sergey A. Malenkov */ -final class javax_swing_border_MatteBorder_PersistenceDelegate extends PersistenceDelegate { +static final class javax_swing_border_MatteBorder_PersistenceDelegate extends PersistenceDelegate { protected Expression instantiate(Object oldInstance, Encoder out) { MatteBorder border = (MatteBorder) oldInstance; Insets insets = border.getBorderInsets(); @@ -1239,7 +1247,7 @@ final class javax_swing_border_MatteBorder_PersistenceDelegate extends Persisten } /* XXX - doens't seem to work. Debug later. -class javax_swing_JMenu_PersistenceDelegate extends DefaultPersistenceDelegate { +static final class javax_swing_JMenu_PersistenceDelegate extends DefaultPersistenceDelegate { protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) { super.initialize(type, oldInstance, newInstance, out); javax.swing.JMenu m = (javax.swing.JMenu)oldInstance; @@ -1261,7 +1269,7 @@ class javax_swing_JMenu_PersistenceDelegate extends DefaultPersistenceDelegate { * * @author Sergey A. Malenkov */ -final class sun_swing_PrintColorUIResource_PersistenceDelegate extends PersistenceDelegate { +static final class sun_swing_PrintColorUIResource_PersistenceDelegate extends PersistenceDelegate { protected boolean mutatesTo(Object oldInstance, Object newInstance) { return oldInstance.equals(newInstance); } @@ -1273,7 +1281,6 @@ final class sun_swing_PrintColorUIResource_PersistenceDelegate extends Persisten } } -class MetaData { private static final Map fields = Collections.synchronizedMap(new WeakHashMap()); private static Hashtable internalPersistenceDelegates = new Hashtable<>(); @@ -1316,7 +1323,7 @@ class MetaData { if (Enum.class.isAssignableFrom(type)) { return enumPersistenceDelegate; } - if (ReflectionUtils.isPrimitive(type)) { + if (null != XMLEncoder.primitiveTypeFor(type)) { return primitivePersistenceDelegate; } // The persistence delegate for arrays is non-trivial; instantiate it lazily. @@ -1350,7 +1357,7 @@ class MetaData { internalPersistenceDelegates.put(typeName, defaultPersistenceDelegate); try { String name = type.getName(); - Class c = Class.forName("java.beans." + name.replace('.', '_') + Class c = Class.forName("java.beans.MetaData$" + name.replace('.', '_') + "_PersistenceDelegate"); pd = (PersistenceDelegate)c.newInstance(); internalPersistenceDelegates.put(typeName, pd); diff --git a/src/share/classes/java/beans/ReflectionUtils.java b/src/share/classes/java/beans/ReflectionUtils.java deleted file mode 100644 index 9271827b135568258e48afb612e0257414d8c499..0000000000000000000000000000000000000000 --- a/src/share/classes/java/beans/ReflectionUtils.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package java.beans; - -import java.lang.reflect.Field; - -/** - * A utility class for reflectively finding methods, constuctors and fields - * using reflection. - */ -class ReflectionUtils { - - @SuppressWarnings("rawtypes") - public static boolean isPrimitive(Class type) { - return primitiveTypeFor(type) != null; - } - - @SuppressWarnings("rawtypes") - public static Class primitiveTypeFor(Class wrapper) { - if (wrapper == Boolean.class) return Boolean.TYPE; - if (wrapper == Byte.class) return Byte.TYPE; - if (wrapper == Character.class) return Character.TYPE; - if (wrapper == Short.class) return Short.TYPE; - if (wrapper == Integer.class) return Integer.TYPE; - if (wrapper == Long.class) return Long.TYPE; - if (wrapper == Float.class) return Float.TYPE; - if (wrapper == Double.class) return Double.TYPE; - if (wrapper == Void.class) return Void.TYPE; - return null; - } - - /** - * Returns the value of a private field. - * - * @param instance object instance - * @param cls class - * @param name name of the field - * @param el an exception listener to handle exceptions; or null - * @return value of the field; null if not found or an error is encountered - */ - @SuppressWarnings("rawtypes") - public static Object getPrivateField(Object instance, Class cls, - String name, ExceptionListener el) { - try { - Field f = cls.getDeclaredField(name); - f.setAccessible(true); - return f.get(instance); - } - catch (Exception e) { - if (el != null) { - el.exceptionThrown(e); - } - } - return null; - } -} diff --git a/src/share/classes/java/beans/XMLEncoder.java b/src/share/classes/java/beans/XMLEncoder.java index 97e1359268a3a650b89acb64fdfcaaead6a7255d..dfccf7af11b67f97da207dd4571e29061653e439 100644 --- a/src/share/classes/java/beans/XMLEncoder.java +++ b/src/share/classes/java/beans/XMLEncoder.java @@ -604,7 +604,7 @@ public class XMLEncoder extends Encoder implements AutoCloseable { return; } - Class primitiveType = ReflectionUtils.primitiveTypeFor(value.getClass()); + Class primitiveType = primitiveTypeFor(value.getClass()); if (primitiveType != null && target == value.getClass() && methodName.equals("new")) { String primitiveTypeName = primitiveType.getName(); @@ -778,4 +778,18 @@ public class XMLEncoder extends Encoder implements AutoCloseable { indentation--; writeln(""); } + + @SuppressWarnings("rawtypes") + static Class primitiveTypeFor(Class wrapper) { + if (wrapper == Boolean.class) return Boolean.TYPE; + if (wrapper == Byte.class) return Byte.TYPE; + if (wrapper == Character.class) return Character.TYPE; + if (wrapper == Short.class) return Short.TYPE; + if (wrapper == Integer.class) return Integer.TYPE; + if (wrapper == Long.class) return Long.TYPE; + if (wrapper == Float.class) return Float.TYPE; + if (wrapper == Double.class) return Double.TYPE; + if (wrapper == Void.class) return Void.TYPE; + return null; + } } diff --git a/src/share/classes/java/lang/reflect/Executable.java b/src/share/classes/java/lang/reflect/Executable.java index d19d6b89d141ccff3f09ff21f42754c684a01938..00e08a6437503d7817a36e8d199c966878d57e99 100644 --- a/src/share/classes/java/lang/reflect/Executable.java +++ b/src/share/classes/java/lang/reflect/Executable.java @@ -510,12 +510,12 @@ public abstract class Executable extends AccessibleObject */ AnnotatedType getAnnotatedReturnType0(Type returnType) { return TypeAnnotationParser.buildAnnotatedType(getTypeAnnotationBytes(), - sun.misc.SharedSecrets.getJavaLangAccess(). - getConstantPool(getDeclaringClass()), - this, - getDeclaringClass(), - returnType, - TypeAnnotation.TypeAnnotationTarget.METHOD_RETURN_TYPE); + sun.misc.SharedSecrets.getJavaLangAccess(). + getConstantPool(getDeclaringClass()), + this, + getDeclaringClass(), + returnType, + TypeAnnotation.TypeAnnotationTarget.METHOD_RETURN); } /** @@ -535,12 +535,12 @@ public abstract class Executable extends AccessibleObject */ public AnnotatedType getAnnotatedReceiverType() { return TypeAnnotationParser.buildAnnotatedType(getTypeAnnotationBytes(), - sun.misc.SharedSecrets.getJavaLangAccess(). - getConstantPool(getDeclaringClass()), - this, - getDeclaringClass(), - getDeclaringClass(), - TypeAnnotation.TypeAnnotationTarget.METHOD_RECEIVER_TYPE); + sun.misc.SharedSecrets.getJavaLangAccess(). + getConstantPool(getDeclaringClass()), + this, + getDeclaringClass(), + getDeclaringClass(), + TypeAnnotation.TypeAnnotationTarget.METHOD_RECEIVER); } /** @@ -556,7 +556,13 @@ public abstract class Executable extends AccessibleObject * @since 1.8 */ public AnnotatedType[] getAnnotatedParameterTypes() { - throw new UnsupportedOperationException("Not yet"); + return TypeAnnotationParser.buildAnnotatedTypes(getTypeAnnotationBytes(), + sun.misc.SharedSecrets.getJavaLangAccess(). + getConstantPool(getDeclaringClass()), + this, + getDeclaringClass(), + getParameterTypes(), + TypeAnnotation.TypeAnnotationTarget.METHOD_FORMAL_PARAMETER); } /** @@ -573,12 +579,12 @@ public abstract class Executable extends AccessibleObject */ public AnnotatedType[] getAnnotatedExceptionTypes() { return TypeAnnotationParser.buildAnnotatedTypes(getTypeAnnotationBytes(), - sun.misc.SharedSecrets.getJavaLangAccess(). - getConstantPool(getDeclaringClass()), - this, - getDeclaringClass(), - getGenericExceptionTypes(), - TypeAnnotation.TypeAnnotationTarget.THROWS); + sun.misc.SharedSecrets.getJavaLangAccess(). + getConstantPool(getDeclaringClass()), + this, + getDeclaringClass(), + getGenericExceptionTypes(), + TypeAnnotation.TypeAnnotationTarget.THROWS); } } diff --git a/src/share/classes/java/lang/reflect/Field.java b/src/share/classes/java/lang/reflect/Field.java index a25223f68c10eca04fa3843caea25bac65579977..8b2603a663ef3fdc8b678efea9d1d10a0403a3ba 100644 --- a/src/share/classes/java/lang/reflect/Field.java +++ b/src/share/classes/java/lang/reflect/Field.java @@ -1161,6 +1161,6 @@ class Field extends AccessibleObject implements Member { this, getDeclaringClass(), getGenericType(), - TypeAnnotation.TypeAnnotationTarget.FIELD_TYPE); + TypeAnnotation.TypeAnnotationTarget.FIELD); } } diff --git a/src/share/classes/java/lang/reflect/Modifier.java b/src/share/classes/java/lang/reflect/Modifier.java index 227beeedd79e9a39509962ef7ca9c4f33bc3e159..7387bbeaa75a7b708f49c7a276ecbecced25eecb 100644 --- a/src/share/classes/java/lang/reflect/Modifier.java +++ b/src/share/classes/java/lang/reflect/Modifier.java @@ -350,8 +350,19 @@ public class Modifier { return (mod & MANDATED) != 0; } - /** - * See JLSv3 section 8.1.1. + // Note on the FOO_MODIFIERS fields and fooModifiers() methods: + // the sets of modifiers are not guaranteed to be constants + // across time and Java SE releases. Therefore, it would not be + // appropriate to expose an external interface to this information + // that would allow the values to be treated as Java-level + // constants since the values could be constant folded and updates + // to the sets of modifiers missed. Thus, the fooModifiers() + // methods return an unchanging values for a given release, but a + // value that can potentially change over time. + + /** + * The Java source modifiers that can be applied to a class. + * @jls 8.1.1 Class Modifiers */ private static final int CLASS_MODIFIERS = Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE | @@ -359,7 +370,8 @@ public class Modifier { Modifier.STRICT; /** - * See JLSv3 section 9.1.1. + * The Java source modifiers that can be applied to an interface. + * @jls 9.1.1 Interface Modifiers */ private static final int INTERFACE_MODIFIERS = Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE | @@ -367,13 +379,15 @@ public class Modifier { /** - * See JLSv3 section 8.8.3. + * The Java source modifiers that can be applied to a constructor. + * @jls 8.8.3 Constructor Modifiers */ private static final int CONSTRUCTOR_MODIFIERS = Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE; /** - * See JLSv3 section 8.4.3. + * The Java source modifiers that can be applied to a method. + * @jls8.4.3 Method Modifiers */ private static final int METHOD_MODIFIERS = Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE | @@ -381,13 +395,21 @@ public class Modifier { Modifier.SYNCHRONIZED | Modifier.NATIVE | Modifier.STRICT; /** - * See JLSv3 section 8.3.1. + * The Java source modifiers that can be applied to a field. + * @jls 8.3.1 Field Modifiers */ private static final int FIELD_MODIFIERS = Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE | Modifier.STATIC | Modifier.FINAL | Modifier.TRANSIENT | Modifier.VOLATILE; + /** + * The Java source modifiers that can be applied to a method or constructor parameter. + * @jls 8.4.1 Formal Parameters + */ + private static final int PARAMETER_MODIFIERS = + Modifier.FINAL; + /** * */ @@ -411,7 +433,7 @@ public class Modifier { * Return an {@code int} value OR-ing together the source language * modifiers that can be applied to an interface. * @return an {@code int} value OR-ing together the source language - * modifiers that can be applied to an inteface. + * modifiers that can be applied to an interface. * * @jls 9.1.1 Interface Modifiers * @since 1.7 @@ -446,7 +468,6 @@ public class Modifier { return METHOD_MODIFIERS; } - /** * Return an {@code int} value OR-ing together the source language * modifiers that can be applied to a field. @@ -459,4 +480,17 @@ public class Modifier { public static int fieldModifiers() { return FIELD_MODIFIERS; } + + /** + * Return an {@code int} value OR-ing together the source language + * modifiers that can be applied to a parameter. + * @return an {@code int} value OR-ing together the source language + * modifiers that can be applied to a parameter. + * + * @jls 8.4.1 Formal Parameters + * @since 1.8 + */ + public static int parameterModifiers() { + return PARAMETER_MODIFIERS; + } } diff --git a/src/share/classes/java/lang/reflect/Parameter.java b/src/share/classes/java/lang/reflect/Parameter.java index 57097e02c6f37de6594da51480e8b1c68a743033..c50e0febe41121575284d286fea8a437bf0e3fcc 100644 --- a/src/share/classes/java/lang/reflect/Parameter.java +++ b/src/share/classes/java/lang/reflect/Parameter.java @@ -200,6 +200,19 @@ public final class Parameter implements AnnotatedElement { return tmp; } + /** + * Returns an AnnotatedType object that represents the use of a type to + * specify the type of the formal parameter represented by this Parameter. + * + * @return an {@code AnnotatedType} object representing the use of a type + * to specify the type of the formal parameter represented by this + * Parameter + */ + public AnnotatedType getAnnotatedType() { + // no caching for now + return executable.getAnnotatedParameterTypes()[index]; + } + private transient volatile Class parameterClassCache = null; /** diff --git a/src/share/classes/java/util/regex/Pattern.java b/src/share/classes/java/util/regex/Pattern.java index 652784ad8d1c71620ff8d0e24058b2874f3d3d5b..14cde68c5520d0b7f6dcfc506d823873a323319e 100644 --- a/src/share/classes/java/util/regex/Pattern.java +++ b/src/share/classes/java/util/regex/Pattern.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,19 @@ package java.util.regex; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.text.CharacterIterator; import java.text.Normalizer; import java.util.Locale; +import java.util.Iterator; import java.util.Map; import java.util.ArrayList; import java.util.HashMap; import java.util.Arrays; +import java.util.NoSuchElementException; +import java.util.Spliterator; +import java.util.Spliterators; +import java.util.function.Predicate; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; /** @@ -5742,4 +5746,83 @@ NEXT: while (i <= last) { return Character.isMirrored(ch);}}); } } + + /** + * Creates a predicate which can be used to match a string. + * + * @return The predicate which can be used for matching on a string + * @since 1.8 + */ + public Predicate asPredicate() { + return s -> matcher(s).find(); + } + + /** + * Creates a stream from the given input sequence around matches of this + * pattern. + * + *

The stream returned by this method contains each substring of the + * input sequence that is terminated by another subsequence that matches + * this pattern or is terminated by the end of the input sequence. The + * substrings in the stream are in the order in which they occur in the + * input. + * + *

If this pattern does not match any subsequence of the input then + * the resulting stream has just one element, namely the input sequence in + * string form. + * + *

If the input sequence is mutable, it must remain constant during the + * execution of the terminal stream operation. Otherwise, the result of the + * terminal stream operation is undefined. + * + * @param input + * The character sequence to be split + * + * @return The stream of strings computed by splitting the input + * around matches of this pattern + * @see #split(CharSequence) + * @since 1.8 + */ + public Stream splitAsStream(final CharSequence input) { + class MatcherIterator implements Iterator { + private final Matcher matcher; + // The start position of the next sub-sequence of input + // when current == input.length there are no more elements + private int current; + // null if the next element, if any, needs to obtained + private String nextElement; + + MatcherIterator() { + this.matcher = matcher(input); + } + + public String next() { + if (!hasNext()) + throw new NoSuchElementException(); + + String n = nextElement; + nextElement = null; + return n; + } + + public boolean hasNext() { + if (nextElement != null) + return true; + + if (current == input.length()) + return false; + + if (matcher.find()) { + nextElement = input.subSequence(current, matcher.start()).toString(); + current = matcher.end(); + } else { + nextElement = input.subSequence(current, input.length()).toString(); + current = input.length(); + } + return true; + } + } + return StreamSupport.stream(Spliterators.spliteratorUnknownSize( + new MatcherIterator(), Spliterator.ORDERED | Spliterator.NONNULL)); + } } diff --git a/src/share/classes/javax/swing/JDesktopPane.java b/src/share/classes/javax/swing/JDesktopPane.java index 85615d3d9592c7af504e1832dde298b9e5aa36c6..c7201000a7b0b5290826ddfb52b55dcef7e03d12 100644 --- a/src/share/classes/javax/swing/JDesktopPane.java +++ b/src/share/classes/javax/swing/JDesktopPane.java @@ -427,6 +427,15 @@ public class JDesktopPane extends JLayeredPane implements Accessible } } + /** + * {@inheritDoc} + */ + @Override + public void remove(Component comp) { + super.remove(comp); + updateFramesCache(); + } + /** * Selects the next JInternalFrame in this desktop pane. * diff --git a/src/share/classes/sun/java2d/pipe/AAShapePipe.java b/src/share/classes/sun/java2d/pipe/AAShapePipe.java index 7da9b58ea10350d33e3f7d66713697ea00e14fa6..2b21c5fce3de3c1ba593685a18d7836e62abd7a4 100644 --- a/src/share/classes/sun/java2d/pipe/AAShapePipe.java +++ b/src/share/classes/sun/java2d/pipe/AAShapePipe.java @@ -127,7 +127,7 @@ public class AAShapePipe private static byte[] theTile; - public synchronized static byte[] getAlphaTile(int len) { + private synchronized static byte[] getAlphaTile(int len) { byte[] t = theTile; if (t == null || t.length < len) { t = new byte[len]; @@ -137,7 +137,7 @@ public class AAShapePipe return t; } - public synchronized static void dropAlphaTile(byte[] t) { + private synchronized static void dropAlphaTile(byte[] t) { theTile = t; } diff --git a/src/share/classes/sun/reflect/annotation/TypeAnnotation.java b/src/share/classes/sun/reflect/annotation/TypeAnnotation.java index c5399725e8b3a5ea66965ee479d3057bf4bc793e..1f4b9e71f5ea9c73975bb6b600f0031025734eb8 100644 --- a/src/share/classes/sun/reflect/annotation/TypeAnnotation.java +++ b/src/share/classes/sun/reflect/annotation/TypeAnnotation.java @@ -83,12 +83,13 @@ public class TypeAnnotation { CLASS_TYPE_PARAMETER, METHOD_TYPE_PARAMETER, CLASS_EXTENDS, - CLASS_IMPLEMENTS, - CLASS_PARAMETER_BOUND, - METHOD_PARAMETER_BOUND, - METHOD_RETURN_TYPE, - METHOD_RECEIVER_TYPE, - FIELD_TYPE, + CLASS_IMPLEMENTS, // Not in the spec + CLASS_TYPE_PARAMETER_BOUND, + METHOD_TYPE_PARAMETER_BOUND, + FIELD, + METHOD_RETURN, + METHOD_RECEIVER, + METHOD_FORMAL_PARAMETER, THROWS; } public static class TypeAnnotationTargetInfo { diff --git a/src/share/classes/sun/reflect/annotation/TypeAnnotationParser.java b/src/share/classes/sun/reflect/annotation/TypeAnnotationParser.java index 12abe28b4d51feaed44f84e37d5b5ecb538c4400..6b9712a6d4a71ddbe77b299bb38933cb2fc35388 100644 --- a/src/share/classes/sun/reflect/annotation/TypeAnnotationParser.java +++ b/src/share/classes/sun/reflect/annotation/TypeAnnotationParser.java @@ -282,10 +282,10 @@ public class TypeAnnotationParser { AnnotatedElement boundsDecl; TypeAnnotationTarget target; if (decl instanceof Class) { - target = TypeAnnotationTarget.CLASS_PARAMETER_BOUND; + target = TypeAnnotationTarget.CLASS_TYPE_PARAMETER_BOUND; boundsDecl = (Class)decl; } else { - target = TypeAnnotationTarget.METHOD_PARAMETER_BOUND; + target = TypeAnnotationTarget.METHOD_TYPE_PARAMETER_BOUND; boundsDecl = (Executable)decl; } return TypeAnnotation.filter(TypeAnnotationParser.parseAllTypeAnnotations(boundsDecl), target); @@ -371,14 +371,15 @@ public class TypeAnnotationParser { private static final byte LOCAL_VARIABLE = (byte)0x40; private static final byte RESOURCE_VARIABLE = (byte)0x41; private static final byte EXCEPTION_PARAMETER = (byte)0x42; - private static final byte CAST = (byte)0x43; - private static final byte INSTANCEOF = (byte)0x44; - private static final byte NEW = (byte)0x45; - private static final byte CONSTRUCTOR_REFERENCE_RECEIVER = (byte)0x46; - private static final byte METHOD_REFERENCE_RECEIVER = (byte)0x47; - private static final byte LAMBDA_FORMAL_PARAMETER = (byte)0x48; - private static final byte METHOD_REFERENCE = (byte)0x49; - private static final byte METHOD_REFERENCE_TYPE_ARGUMENT = (byte)0x50; + private static final byte INSTANCEOF = (byte)0x43; + private static final byte NEW = (byte)0x44; + private static final byte CONSTRUCTOR_REFERENCE = (byte)0x45; + private static final byte METHOD_REFERENCE = (byte)0x46; + private static final byte CAST = (byte)0x47; + private static final byte CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT = (byte)0x48; + private static final byte METHOD_INVOCATION_TYPE_ARGUMENT = (byte)0x49; + private static final byte CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT = (byte)0x4A; + private static final byte METHOD_REFERENCE_TYPE_ARGUMENT = (byte)0x4B; private static TypeAnnotation parseTypeAnnotation(ByteBuffer buf, ConstantPool cp, @@ -417,19 +418,20 @@ public class TypeAnnotationParser { return res; }} break; case CLASS_TYPE_PARAMETER_BOUND: - return parse2ByteTarget(TypeAnnotationTarget.CLASS_PARAMETER_BOUND, buf); + return parse2ByteTarget(TypeAnnotationTarget.CLASS_TYPE_PARAMETER_BOUND, buf); case METHOD_TYPE_PARAMETER_BOUND: - return parse2ByteTarget(TypeAnnotationTarget.METHOD_PARAMETER_BOUND, buf); + return parse2ByteTarget(TypeAnnotationTarget.METHOD_TYPE_PARAMETER_BOUND, buf); case FIELD: - return new TypeAnnotationTargetInfo(TypeAnnotationTarget.FIELD_TYPE); + return new TypeAnnotationTargetInfo(TypeAnnotationTarget.FIELD); case METHOD_RETURN: - return new TypeAnnotationTargetInfo(TypeAnnotationTarget.METHOD_RETURN_TYPE); + return new TypeAnnotationTargetInfo(TypeAnnotationTarget.METHOD_RETURN); case METHOD_RECEIVER: - return new TypeAnnotationTargetInfo(TypeAnnotationTarget.METHOD_RECEIVER_TYPE); + return new TypeAnnotationTargetInfo(TypeAnnotationTarget.METHOD_RECEIVER); case METHOD_FORMAL_PARAMETER: { - // Todo byte index = buf.get(); - } break; + return new TypeAnnotationTargetInfo(TypeAnnotationTarget.METHOD_FORMAL_PARAMETER, + index); + } //unreachable break; case THROWS: return parseShortTarget(TypeAnnotationTarget.THROWS, buf); @@ -445,30 +447,27 @@ public class TypeAnnotationParser { short varLength = buf.getShort(); short index = buf.getShort(); } - break; + return null; case EXCEPTION_PARAMETER: { byte index = buf.get(); - } break; - case CAST: + } + return null; case INSTANCEOF: - case NEW: { - short offset = buf.getShort(); - } break; - case CONSTRUCTOR_REFERENCE_RECEIVER: - case METHOD_REFERENCE_RECEIVER: { + case NEW: + case CONSTRUCTOR_REFERENCE: + case METHOD_REFERENCE: { short offset = buf.getShort(); - byte index = buf.get(); - } break; - case LAMBDA_FORMAL_PARAMETER: { - byte index = buf.get(); - } break; - case METHOD_REFERENCE: - // This one isn't in the spec yet - break; + } + return null; + case CAST: + case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT: + case METHOD_INVOCATION_TYPE_ARGUMENT: + case CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT: case METHOD_REFERENCE_TYPE_ARGUMENT: { short offset = buf.getShort(); byte index = buf.get(); - } break; + } + return null; default: // will throw error below diff --git a/src/share/classes/sun/security/provider/certpath/CertPathHelper.java b/src/share/classes/sun/security/provider/certpath/CertPathHelper.java index 517e91167ee797b9a784ab33c1b551e919ee1810..bd3a34281babe0a365fc8fd255a09ad6d2e76530 100644 --- a/src/share/classes/sun/security/provider/certpath/CertPathHelper.java +++ b/src/share/classes/sun/security/provider/certpath/CertPathHelper.java @@ -64,7 +64,7 @@ public abstract class CertPathHelper { instance.implSetPathToNames(sel, names); } - static void setDateAndTime(X509CRLSelector sel, Date date, long skew) { + public static void setDateAndTime(X509CRLSelector sel, Date date, long skew) { instance.implSetDateAndTime(sel, date, skew); } } diff --git a/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java b/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java index ab784524546df25821c4d95e8e31cabfb0635d94..bee12e43beef42796220ea6d3656003ad200ade0 100644 --- a/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java +++ b/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java @@ -50,7 +50,7 @@ import sun.security.x509.*; * @author Sean Mullan * @since 1.4.2 */ -class DistributionPointFetcher { +public class DistributionPointFetcher { private static final Debug debug = Debug.getInstance("certpath"); @@ -66,13 +66,14 @@ class DistributionPointFetcher { * Return the X509CRLs matching this selector. The selector must be * an X509CRLSelector with certificateChecking set. */ - static Collection getCRLs(X509CRLSelector selector, - boolean signFlag, PublicKey prevKey, - String provider, - List certStores, - boolean[] reasonsMask, - Set trustAnchors, - Date validity) + public static Collection getCRLs(X509CRLSelector selector, + boolean signFlag, + PublicKey prevKey, + String provider, + List certStores, + boolean[] reasonsMask, + Set trustAnchors, + Date validity) throws CertStoreException { X509Certificate cert = selector.getCertificateChecking(); diff --git a/src/share/classes/sun/security/provider/certpath/OCSP.java b/src/share/classes/sun/security/provider/certpath/OCSP.java index 03c910b8897fca6e56da7b0088927dd81f9e4284..ca82ef598a05939764357139f3a1d7253137c30a 100644 --- a/src/share/classes/sun/security/provider/certpath/OCSP.java +++ b/src/share/classes/sun/security/provider/certpath/OCSP.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -85,10 +85,9 @@ public final class OCSP { * value is negative, set the timeout length to the default. */ private static int initializeTimeout() { - int tmp = java.security.AccessController.doPrivileged( - new GetIntegerAction("com.sun.security.ocsp.timeout", - DEFAULT_CONNECT_TIMEOUT)); - if (tmp < 0) { + Integer tmp = java.security.AccessController.doPrivileged( + new GetIntegerAction("com.sun.security.ocsp.timeout")); + if (tmp == null || tmp < 0) { return DEFAULT_CONNECT_TIMEOUT; } // Convert to milliseconds, as the system property will be diff --git a/src/share/classes/sun/security/provider/certpath/OCSPResponse.java b/src/share/classes/sun/security/provider/certpath/OCSPResponse.java index 78802bf79bd063da94327923ed80038de3ec9382..2cd437dc263fb034a90c2f070ccc56f82e40954b 100644 --- a/src/share/classes/sun/security/provider/certpath/OCSPResponse.java +++ b/src/share/classes/sun/security/provider/certpath/OCSPResponse.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,6 +43,7 @@ import java.util.Map; import javax.security.auth.x500.X500Principal; import sun.misc.HexDumpEncoder; +import sun.security.action.GetIntegerAction; import sun.security.x509.*; import sun.security.util.*; @@ -144,9 +145,31 @@ public final class OCSPResponse { // Object identifier for the OCSPSigning key purpose private static final String KP_OCSP_SIGNING_OID = "1.3.6.1.5.5.7.3.9"; - // Maximum clock skew in milliseconds (15 minutes) allowed when checking - // validity of OCSP responses - private static final long MAX_CLOCK_SKEW = 900000; + // Default maximum clock skew in milliseconds (15 minutes) + // allowed when checking validity of OCSP responses + private static final int DEFAULT_MAX_CLOCK_SKEW = 900000; + + /** + * Integer value indicating the maximum allowable clock skew, in seconds, + * to be used for the OCSP check. + */ + private static final int MAX_CLOCK_SKEW = initializeClockSkew(); + + /** + * Initialize the maximum allowable clock skew by getting the OCSP + * clock skew system property. If the property has not been set, or if its + * value is negative, set the skew to the default. + */ + private static int initializeClockSkew() { + Integer tmp = java.security.AccessController.doPrivileged( + new GetIntegerAction("com.sun.security.ocsp.clockSkew")); + if (tmp == null || tmp < 0) { + return DEFAULT_MAX_CLOCK_SKEW; + } + // Convert to milliseconds, as the system property will be + // specified in seconds + return tmp * 1000; + } // an array of all of the CRLReasons (used in SingleResponse) private static CRLReason[] values = CRLReason.values(); diff --git a/src/share/classes/sun/security/provider/certpath/URICertStore.java b/src/share/classes/sun/security/provider/certpath/URICertStore.java index 33694ab51fb798d192a75c46b3b005b388915f71..a5ec5d36e8dd9ccf880c17715851747ee8900bef 100644 --- a/src/share/classes/sun/security/provider/certpath/URICertStore.java +++ b/src/share/classes/sun/security/provider/certpath/URICertStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,6 +51,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Locale; +import sun.security.action.GetIntegerAction; import sun.security.x509.AccessDescription; import sun.security.x509.GeneralNameInterface; import sun.security.x509.URIName; @@ -121,6 +122,33 @@ class URICertStore extends CertStoreSpi { private CertStore ldapCertStore; private String ldapPath; + // Default maximum connect timeout in milliseconds (15 seconds) + // allowed when downloading CRLs + private static final int DEFAULT_CRL_CONNECT_TIMEOUT = 15000; + + /** + * Integer value indicating the connect timeout, in seconds, to be + * used for the CRL download. A timeout of zero is interpreted as + * an infinite timeout. + */ + private static final int CRL_CONNECT_TIMEOUT = initializeTimeout(); + + /** + * Initialize the timeout length by getting the CRL timeout + * system property. If the property has not been set, or if its + * value is negative, set the timeout length to the default. + */ + private static int initializeTimeout() { + Integer tmp = java.security.AccessController.doPrivileged( + new GetIntegerAction("com.sun.security.crl.timeout")); + if (tmp == null || tmp < 0) { + return DEFAULT_CRL_CONNECT_TIMEOUT; + } + // Convert to milliseconds, as the system property will be + // specified in seconds + return tmp * 1000; + } + /** * Creates a URICertStore. * @@ -364,6 +392,7 @@ class URICertStore extends CertStoreSpi { connection.setIfModifiedSince(lastModified); } long oldLastModified = lastModified; + connection.setConnectTimeout(CRL_CONNECT_TIMEOUT); try (InputStream in = connection.getInputStream()) { lastModified = connection.getLastModified(); if (oldLastModified != 0) { diff --git a/src/solaris/classes/sun/awt/X11/XWindowPeer.java b/src/solaris/classes/sun/awt/X11/XWindowPeer.java index d2d981bd844d4593765fc8ba062cfd9dd2a46b10..bab9ee119402af18f35de84508a49ba4337dac3c 100644 --- a/src/solaris/classes/sun/awt/X11/XWindowPeer.java +++ b/src/solaris/classes/sun/awt/X11/XWindowPeer.java @@ -1887,7 +1887,9 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, switch (getWindowType()) { case NORMAL: - typeAtom = protocol.XA_NET_WM_WINDOW_TYPE_NORMAL; + typeAtom = (ownerPeer == null) ? + protocol.XA_NET_WM_WINDOW_TYPE_NORMAL : + protocol.XA_NET_WM_WINDOW_TYPE_DIALOG; break; case UTILITY: typeAtom = protocol.XA_NET_WM_WINDOW_TYPE_UTILITY; diff --git a/src/windows/classes/sun/awt/windows/WComponentPeer.java b/src/windows/classes/sun/awt/windows/WComponentPeer.java index 1fc17679f26a8a7d01b83f7c9e410acfc12ab264..f02fe3325e4d7b39831ab8d61b460053f3bc88e2 100644 --- a/src/windows/classes/sun/awt/windows/WComponentPeer.java +++ b/src/windows/classes/sun/awt/windows/WComponentPeer.java @@ -759,9 +759,7 @@ public abstract class WComponentPeer extends WObjectPeer WComponentPeer(Component target) { this.target = target; this.paintArea = new RepaintArea(); - Container parent = WToolkit.getNativeContainer(target); - WComponentPeer parentPeer = (WComponentPeer) WToolkit.targetToPeer(parent); - create(parentPeer); + create(getNativeParent()); // fix for 5088782: check if window object is created successfully checkCreation(); @@ -771,6 +769,17 @@ public abstract class WComponentPeer extends WObjectPeer } abstract void create(WComponentPeer parent); + /** + * Gets the native parent of this peer. We use the term "parent" explicitly, + * because we override the method in top-level window peer implementations. + * + * @return the parent container/owner of this peer. + */ + WComponentPeer getNativeParent() { + Container parent = SunToolkit.getNativeContainer((Component) target); + return (WComponentPeer) WToolkit.targetToPeer(parent); + } + protected void checkCreation() { if ((hwnd == 0) || (pData == 0)) diff --git a/src/windows/classes/sun/awt/windows/WWindowPeer.java b/src/windows/classes/sun/awt/windows/WWindowPeer.java index 8b941c6f3c51d390ec7e655fd1eb56da7c6822a7..f36dd2119ceb66ab885fbbc8b22c5c6e0a7153a9 100644 --- a/src/windows/classes/sun/awt/windows/WWindowPeer.java +++ b/src/windows/classes/sun/awt/windows/WWindowPeer.java @@ -215,6 +215,12 @@ public class WWindowPeer extends WPanelPeer implements WindowPeer, createAwtWindow(parent); } + @Override + final WComponentPeer getNativeParent() { + final Container owner = ((Window) target).getOwner(); + return (WComponentPeer) WToolkit.targetToPeer(owner); + } + // should be overriden in WDialogPeer protected void realShow() { super.show(); diff --git a/src/windows/classes/sun/nio/fs/WindowsFileCopy.java b/src/windows/classes/sun/nio/fs/WindowsFileCopy.java index a8ffba1c933070f9e4e15d7adc6e21420a3135b7..0d975a3fc2c883c6697d85b335e70d1566bca3e1 100644 --- a/src/windows/classes/sun/nio/fs/WindowsFileCopy.java +++ b/src/windows/classes/sun/nio/fs/WindowsFileCopy.java @@ -224,7 +224,7 @@ class WindowsFileCopy { String linkTarget = WindowsLinkSupport.readLink(source); int flags = SYMBOLIC_LINK_FLAG_DIRECTORY; CreateSymbolicLink(targetPath, - addPrefixIfNeeded(linkTarget), + WindowsPath.addPrefixIfNeeded(linkTarget), flags); } } catch (WindowsException x) { @@ -414,7 +414,7 @@ class WindowsFileCopy { } else { String linkTarget = WindowsLinkSupport.readLink(source); CreateSymbolicLink(targetPath, - addPrefixIfNeeded(linkTarget), + WindowsPath.addPrefixIfNeeded(linkTarget), SYMBOLIC_LINK_FLAG_DIRECTORY); } } catch (WindowsException x) { @@ -502,18 +502,4 @@ class WindowsFileCopy { priv.drop(); } } - - /** - * Add long path prefix to path if required - */ - private static String addPrefixIfNeeded(String path) { - if (path.length() > 248) { - if (path.startsWith("\\\\")) { - path = "\\\\?\\UNC" + path.substring(1, path.length()); - } else { - path = "\\\\?\\" + path; - } - } - return path; - } } diff --git a/src/windows/classes/sun/nio/fs/WindowsLinkSupport.java b/src/windows/classes/sun/nio/fs/WindowsLinkSupport.java index 00bce624849d15ead99c2727143339e1c5c41e1f..ddc5b4b063858d89a5e8a704840a8610d8f911fe 100644 --- a/src/windows/classes/sun/nio/fs/WindowsLinkSupport.java +++ b/src/windows/classes/sun/nio/fs/WindowsLinkSupport.java @@ -231,7 +231,7 @@ class WindowsLinkSupport { int end = (next == -1) ? path.length() : next; String search = sb.toString() + path.substring(curr, end); try { - FirstFile fileData = FindFirstFile(addLongPathPrefixIfNeeded(search)); + FirstFile fileData = FindFirstFile(WindowsPath.addPrefixIfNeeded(search)); FindClose(fileData.handle()); // if a reparse point is encountered then we must return the @@ -405,20 +405,6 @@ class WindowsLinkSupport { return path; } - /** - * Add long path prefix to path if required. - */ - private static String addLongPathPrefixIfNeeded(String path) { - if (path.length() > 248) { - if (path.startsWith("\\\\")) { - path = "\\\\?\\UNC" + path.substring(1, path.length()); - } else { - path = "\\\\?\\" + path; - } - } - return path; - } - /** * Strip long path or symbolic link prefix from path */ diff --git a/src/windows/classes/sun/nio/fs/WindowsPath.java b/src/windows/classes/sun/nio/fs/WindowsPath.java index e84db2af23156104aeb1b710577dbdd47c4214ee..ef597b3c49471c3557797e757de8b21381e81686 100644 --- a/src/windows/classes/sun/nio/fs/WindowsPath.java +++ b/src/windows/classes/sun/nio/fs/WindowsPath.java @@ -283,7 +283,7 @@ class WindowsPath extends AbstractPath { // Add long path prefix to path if required static String addPrefixIfNeeded(String path) { - if (path.length() > 248) { + if (path.length() > MAX_PATH) { if (path.startsWith("\\\\")) { path = "\\\\?\\UNC" + path.substring(1, path.length()); } else { diff --git a/test/java/awt/Focus/OverrideRedirectWindowActivationTest/OverrideRedirectWindowActivationTest.java b/test/java/awt/Focus/SimpleWindowActivationTest/SimpleWindowActivationTest.java similarity index 94% rename from test/java/awt/Focus/OverrideRedirectWindowActivationTest/OverrideRedirectWindowActivationTest.java rename to test/java/awt/Focus/SimpleWindowActivationTest/SimpleWindowActivationTest.java index 598adfbbf63cf5739e8766847231e6301b17131a..95c9db66af0f46a578f1a305d48301a786c4db48 100644 --- a/test/java/awt/Focus/OverrideRedirectWindowActivationTest/OverrideRedirectWindowActivationTest.java +++ b/test/java/awt/Focus/SimpleWindowActivationTest/SimpleWindowActivationTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,7 @@ * @author anton.tarasov@sun.com: area=awt.focus * @library ../../regtesthelpers * @build Util - * @run main OverrideRedirectWindowActivationTest + * @run main SimpleWindowActivationTest */ import java.awt.*; import java.awt.event.*; @@ -37,7 +37,7 @@ import javax.swing.SwingUtilities; import sun.awt.SunToolkit; import test.java.awt.regtesthelpers.Util; -public class OverrideRedirectWindowActivationTest { +public class SimpleWindowActivationTest { private static Frame frame; private static Window window; @@ -115,7 +115,7 @@ public class OverrideRedirectWindowActivationTest { wbutton = new Button("wbutton"); label = new Label("label"); - window.setBounds(800, 200, 200, 100); + window.setBounds(800, 200, 300, 100); window.setLayout(new FlowLayout()); window.add(wbutton); window.add(label); @@ -126,7 +126,7 @@ public class OverrideRedirectWindowActivationTest { private static void createAndShowFrame() { fbutton = new Button("fbutton"); - frame.setBounds(800, 0, 200, 100); + frame.setBounds(800, 0, 300, 100); frame.setLayout(new FlowLayout()); frame.add(fbutton); frame.setVisible(true); diff --git a/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.sh b/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.sh index f4a54d300c708470494973871f381b3ac8828a28..e58072890c13afacd2f3f25e703d46f1bd8724a4 100644 --- a/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.sh +++ b/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.sh @@ -1,4 +1,4 @@ -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,8 @@ ${TESTJAVA}/bin/javac -cp ${TESTSRC} -d . ${TESTSRC}/BadDisplayTest.java -export DISPLAY= +DISPLAY= +export DISPLAY OS=`uname -s` case "$OS" in diff --git a/test/java/awt/WMSpecificTests/Metacity/FullscreenDialogModality.java b/test/java/awt/WMSpecificTests/Metacity/FullscreenDialogModality.java new file mode 100644 index 0000000000000000000000000000000000000000..b8faff6ea2c6019c7a7c8b10041cb046a21dd9e9 --- /dev/null +++ b/test/java/awt/WMSpecificTests/Metacity/FullscreenDialogModality.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8012586 + * @summary verify that modal dialog will appeared above fullscreen window under Metacity WM. + * @run main FullscreenDialogModality + * @run main/othervm FullscreenDialogModality + * @author vkravets + */ + +import test.java.awt.regtesthelpers.Util; + +import java.awt.*; +import java.lang.reflect.InvocationTargetException; + +public class FullscreenDialogModality extends Frame { + + static Robot robot = null; + + public void enterFS() { + GraphicsDevice gd = getGraphicsConfiguration().getDevice(); + final boolean fs = gd.isFullScreenSupported(); + System.out.println("FullscreenSupported: " + (fs ? "yes" : "no")); + gd.setFullScreenWindow(this); + try { + // Give the system time to set the FS window and display it + // properly + Thread.sleep(2000); + } catch (Exception e) {} + } + + public void exitFS() { + GraphicsDevice gd = getGraphicsConfiguration().getDevice(); + // reset window + gd.setFullScreenWindow(null); + try { + // Give the system time to set the FS window and display it + // properly + Thread.sleep(2000); + } catch (Exception e) {} + } + + public void checkDialogModality() throws InvocationTargetException, InterruptedException { + // Dialog + final Dialog d = new Dialog(FullscreenDialogModality.this, "Modal dialog", Dialog.ModalityType.APPLICATION_MODAL); + d.setBounds(500, 500, 160, 160); + d.setModal(true); + d.setBackground(Color.red); + EventQueue.invokeLater(new Runnable() + { + public void run() + { + d.setVisible(true); + } + }); + // Wait until the dialog is shown + EventQueue.invokeLater(new Runnable() { + public void run() { + // Empty + } + }); + + Util.waitForIdle(robot); + try { + //Check color + Point checkPoint = new Point(d.getX() + d.getWidth() / 2, d.getY() + d.getHeight() / 2); + Color actual = robot.getPixelColor(checkPoint.x, checkPoint.y); + System.out.println("Color = " + actual); + if (actual.getRGB() == Color.GREEN.getRGB()) { + throw new RuntimeException("Test FAILED: Modal dialog shown below fullscreen window"); + } else if (actual.getRGB() == Color.RED.getRGB()) { + System.out.println("Test PASSED: Modal dialog shown above fullscreen window"); + } else { + System.out.println("pixelColor " + + Integer.toHexString(actual.getRGB()) + + " at coordinates (" + checkPoint.x + ", " + checkPoint.y + ")"); + throw new RuntimeException("Test FAILED: Unexpected behavior"); + } + + robot.delay(2000); + Util.waitForIdle(robot); + } finally { + d.dispose(); + } + } + + public static void main(String args[]) throws InvocationTargetException, InterruptedException { + if (Util.getWMID() != Util.METACITY_WM) { + System.out.println("This test is only useful on Metacity"); + return; + } + robot = Util.createRobot(); + Util.waitForIdle(robot); + final FullscreenDialogModality frame = new FullscreenDialogModality(); + frame.setUndecorated(true); + frame.setBackground(Color.green); + frame.setSize(500, 500); + frame.setVisible(true); + try { + robot.delay(100); + Util.waitForIdle(robot); + + EventQueue.invokeAndWait(new Runnable() { + public void run() { + frame.enterFS(); + } + }); + robot.delay(200); + Util.waitForIdle(robot); + + frame.checkDialogModality(); + + EventQueue.invokeAndWait(new Runnable() { + public void run() { + frame.exitFS(); + } + }); + } finally { + frame.dispose(); + } + } +} diff --git a/test/java/beans/XMLEncoder/AbstractTest.java b/test/java/beans/XMLEncoder/AbstractTest.java index 09eb73f2908fc81cc01ce70ced0c3ed31f24010f..3207fee6aff819f9973bc2fa0c24e9273e25afa3 100644 --- a/test/java/beans/XMLEncoder/AbstractTest.java +++ b/test/java/beans/XMLEncoder/AbstractTest.java @@ -30,8 +30,10 @@ import java.io.ByteArrayOutputStream; import java.nio.charset.Charset; +import java.lang.reflect.Field; + abstract class AbstractTest implements ExceptionListener { - private final BeanValidator validator = new BeanValidator(); + final BeanValidator validator = new BeanValidator(); public final void exceptionThrown(Exception exception) { throw new Error("unexpected exception", exception); @@ -59,7 +61,7 @@ abstract class AbstractTest implements ExceptionListener { } /** - * This method should be overriden + * This method should be overridden * if specified encoder should be initialized. * * @param encoder the XML encoder to initialize @@ -68,7 +70,7 @@ abstract class AbstractTest implements ExceptionListener { } /** - * This method should be overriden + * This method should be overridden * if specified decoder should be initialized. * * @param decoder the XML decoder to initialize @@ -77,7 +79,7 @@ abstract class AbstractTest implements ExceptionListener { } /** - * This method should be overriden + * This method should be overridden * for test-specific comparison. * * @param before the object before encoding @@ -134,6 +136,7 @@ abstract class AbstractTest implements ExceptionListener { private byte[] writeObject(Object object) { ByteArrayOutputStream output = new ByteArrayOutputStream(); XMLEncoder encoder = new XMLEncoder(output); + encoder.setExceptionListener(this); initialize(encoder); encoder.writeObject(object); encoder.close(); @@ -143,9 +146,24 @@ abstract class AbstractTest implements ExceptionListener { private Object readObject(byte[] array) { ByteArrayInputStream input = new ByteArrayInputStream(array); XMLDecoder decoder = new XMLDecoder(input); + decoder.setExceptionListener(this); initialize(decoder); Object object = decoder.readObject(); decoder.close(); return object; } + + static Field getField(String name) { + try { + int index = name.lastIndexOf('.'); + String className = name.substring(0, index); + String fieldName = name.substring(1 + index); + Field field = Class.forName(className).getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } + catch (Exception exception) { + throw new Error(exception); + } + } } diff --git a/test/java/beans/XMLEncoder/BeanValidator.java b/test/java/beans/XMLEncoder/BeanValidator.java index 78f2faa358f0a4b6c659a16298091e93ce17d079..78e13bc087369e087d93dc96176e904404ffacf6 100644 --- a/test/java/beans/XMLEncoder/BeanValidator.java +++ b/test/java/beans/XMLEncoder/BeanValidator.java @@ -63,6 +63,15 @@ final class BeanValidator { } Class type = object1.getClass(); if (!type.equals(object2.getClass())) { + // resolve different implementations of the Map.Entry interface + if ((object1 instanceof Map.Entry) && (object2 instanceof Map.Entry)) { + log("!!! special case", "Map.Entry"); + Map.Entry entry1 = (Map.Entry) object1; + Map.Entry entry2 = (Map.Entry) object2; + validate(entry1.getKey(), entry2.getKey()); + validate(entry1.getValue(), entry2.getValue()); + return; + } throw new IllegalStateException("could not compare objects with different types"); } // validate elements of arrays @@ -82,10 +91,14 @@ final class BeanValidator { } return; } + // special case for collections: do not use equals + boolean ignore = Collection.class.isAssignableFrom(type) + || Map.Entry.class.isAssignableFrom(type) + || Map.class.isAssignableFrom(type); // validate objects using equals() // we assume that the method equals(Object) can be called, // if the class declares such method - if (isDefined(type, "equals", Object.class)) { + if (!ignore && isDefined(type, "equals", Object.class)) { if (object1.equals(object2)) { return; } @@ -205,27 +218,7 @@ final class BeanValidator { } private void validate(Map map1, Map map2, boolean sorted) { - if (map1.size() != map2.size()) { - throw new IllegalStateException("could not compare maps with different sizes"); - } - if (sorted) { - Iterator first = map1.entrySet().iterator(); - Iterator second = map2.entrySet().iterator(); - int index = 0; - while (first.hasNext() && second.hasNext()) { - log("validate map entry", Integer.valueOf(index++)); - validate(first.next(), second.next()); - } - if (first.hasNext() || second.hasNext()) { - throw new IllegalStateException("one map contains more entries than another one"); - } - } else { - // assume that equals() can be used for keys - for (Object key : map1.keySet()) { - log("validate map value for key", key); - validate(map1.get(key), map2.get(key)); - } - } + validate(map1.entrySet(), map2.entrySet(), sorted); } private boolean isCyclic(Object object1, Object object2) { diff --git a/test/java/beans/XMLEncoder/Test4631471.java b/test/java/beans/XMLEncoder/Test4631471.java index 0b3b107f7c69dde0b7ea6e5963b483f5a4929792..ccaae8295ce0407485d187b669b54815f8e55b1d 100644 --- a/test/java/beans/XMLEncoder/Test4631471.java +++ b/test/java/beans/XMLEncoder/Test4631471.java @@ -28,7 +28,6 @@ * @author Sergey Malenkov, Mark Davidson */ -import java.beans.XMLEncoder; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; @@ -78,10 +77,6 @@ public abstract class Test4631471 extends AbstractTest { // do not any validation } - protected final void initialize(XMLEncoder encoder) { - encoder.setExceptionListener(this); - } - public static TreeNode getRoot() { DefaultMutableTreeNode node = new DefaultMutableTreeNode("root"); DefaultMutableTreeNode first = new DefaultMutableTreeNode("first"); diff --git a/test/java/beans/XMLEncoder/Test4679556.java b/test/java/beans/XMLEncoder/Test4679556.java index a77836e12ee8927e0fbaf8afd7c7eb3ddc602923..3ede526685831c2a787d447cb7249c3410b73714 100644 --- a/test/java/beans/XMLEncoder/Test4679556.java +++ b/test/java/beans/XMLEncoder/Test4679556.java @@ -103,7 +103,6 @@ public class Test4679556 extends AbstractTest { } protected void initialize(XMLEncoder encoder) { - encoder.setExceptionListener(this); encoder.setPersistenceDelegate(C.class, new DefaultPersistenceDelegate() { protected Expression instantiate(Object oldInstance, Encoder out) { C c = (C) oldInstance; diff --git a/test/java/beans/XMLEncoder/java_awt_BorderLayout.java b/test/java/beans/XMLEncoder/java_awt_BorderLayout.java index eed980a83b0b8fce9e3e64795bc83452e47ce2e2..44876d9c9127840ed0b36aff4e89974de3d32ab7 100644 --- a/test/java/beans/XMLEncoder/java_awt_BorderLayout.java +++ b/test/java/beans/XMLEncoder/java_awt_BorderLayout.java @@ -68,11 +68,9 @@ public final class java_awt_BorderLayout extends AbstractTest { @Override protected void validate(BorderLayout before, BorderLayout after) { super.validate(before, after); - - BeanValidator validator = new BeanValidator(); for (String constraint : CONSTRAINTS) { - validator.validate(before.getLayoutComponent(constraint), - after.getLayoutComponent(constraint)); + super.validator.validate(before.getLayoutComponent(constraint), + after.getLayoutComponent(constraint)); } } diff --git a/test/java/beans/XMLEncoder/java_awt_CardLayout.java b/test/java/beans/XMLEncoder/java_awt_CardLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..aa6a3fc5fe33f0e674d30e54d081d6c3c86161aa --- /dev/null +++ b/test/java/beans/XMLEncoder/java_awt_CardLayout.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8007458 + * @summary Tests CardLayout encoding + * @author Sergey Malenkov + */ + +import java.awt.CardLayout; +import java.lang.reflect.Field; +import java.util.Vector; +import javax.swing.JLabel; + +public final class java_awt_CardLayout extends AbstractTest { + private static final Field VECTOR = getField("java.awt.CardLayout.vector"); + private static final Field NAME = getField("java.awt.CardLayout$Card.name"); + private static final Field COMP = getField("java.awt.CardLayout$Card.comp"); + + public static void main(String[] args) throws Exception { + new java_awt_CardLayout().test(true); + } + + @Override + protected CardLayout getObject() { + CardLayout layout = new CardLayout(); + layout.addLayoutComponent(new JLabel("a"), "a"); + layout.addLayoutComponent(new JLabel("b"), "b"); + layout.addLayoutComponent(new JLabel("c"), "c"); + return layout; + } + + @Override + protected CardLayout getAnotherObject() { + CardLayout layout = new CardLayout(); + layout.addLayoutComponent(new JLabel("a"), "a"); + layout.addLayoutComponent(new JLabel("b"), "b"); + layout.addLayoutComponent(new JLabel("c"), "c"); + layout.addLayoutComponent(new JLabel("d"), "d"); + return layout; + } + + @Override + protected void validate(CardLayout before, CardLayout after) { + super.validate(before, after); + try { + Vector a = (Vector) VECTOR.get(after); + Vector b = (Vector) VECTOR.get(before); + int size = a.size(); + if (size != b.size()) { + throw new Error("different content"); + } + for (int i = 0; i < size; i++) { + super.validator.validate(NAME.get(a.get(i)), NAME.get(b.get(i))); + super.validator.validate(COMP.get(a.get(i)), COMP.get(b.get(i))); + } + } + catch (Exception exception) { + throw new Error(exception); + } + } +} diff --git a/test/java/beans/XMLEncoder/java_awt_GridBagLayout.java b/test/java/beans/XMLEncoder/java_awt_GridBagLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..7011dbd739fcec972809f3863038609c3d46ff80 --- /dev/null +++ b/test/java/beans/XMLEncoder/java_awt_GridBagLayout.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8007458 + * @summary Tests GridBagLayout encoding + * @author Sergey Malenkov + */ + +import java.awt.Component; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.lang.reflect.Field; +import java.util.Hashtable; +import java.util.Map; +import javax.swing.JLabel; + +public final class java_awt_GridBagLayout extends AbstractTest { + private static final Field HASHTABLE = getField("java.awt.GridBagLayout.comptable"); + + public static void main(String[] args) { + new java_awt_GridBagLayout().test(true); + } + + @Override + protected GridBagLayout getObject() { + GridBagLayout layout = new GridBagLayout(); + update(layout, "1", 1, 1); + update(layout, "2", 2, 2); + update(layout, "3", 3, 3); + return layout; + } + + @Override + protected GridBagLayout getAnotherObject() { + GridBagLayout layout = new GridBagLayout(); + update(layout, "11", 1, 1); + update(layout, "12", 1, 2); + update(layout, "21", 2, 1); + update(layout, "22", 2, 2); + return layout; + } + + @Override + protected void validate(GridBagLayout before, GridBagLayout after) { + super.validate(before, after); + try { + Hashtable a = (Hashtable) HASHTABLE.get(after); + Hashtable b = (Hashtable) HASHTABLE.get(before); + super.validator.validate(a, b); + +// for (int i = 0; i < size; i++) { +// validator.validate(NAME.get(a.get(i)), NAME.get(b.get(i))); +// validator.validate(COMP.get(a.get(i)), COMP.get(b.get(i))); +// } + } + catch (Exception exception) { + throw new Error(exception); + } + + + +// for (String name : names) { +// validator.validate(getConstraints(before, name), getConstraints(after, name)); +// } + } + + private static void update(GridBagLayout layout, String id, int x, int y) { + GridBagConstraints gbc = new GridBagConstraints(); + gbc.gridx = x; + gbc.gridy = y; + layout.addLayoutComponent(new JLabel(id), gbc); + } + +/* + private static GridBagConstraints getConstraints(GridBagLayout layout, String id) { + return (layout == null) ? null : ((MyGridBagLayout) layout).getConstraints(id); + } +*/ +} diff --git a/test/java/beans/XMLEncoder/javax_swing_DefaultCellEditor.java b/test/java/beans/XMLEncoder/javax_swing_DefaultCellEditor.java index 037588352c0f5ec4fac5e00ba145e3164fa90345..476d64db827e3b429d50abbdd1916ca8a33f987d 100644 --- a/test/java/beans/XMLEncoder/javax_swing_DefaultCellEditor.java +++ b/test/java/beans/XMLEncoder/javax_swing_DefaultCellEditor.java @@ -28,6 +28,7 @@ * @author Sergey Malenkov */ +import java.beans.XMLEncoder; import javax.swing.DefaultCellEditor; import javax.swing.JTextField; import javax.swing.text.JTextComponent; @@ -46,6 +47,11 @@ public final class javax_swing_DefaultCellEditor extends AbstractTest[])null); + AnnotatedType[] t = m.getAnnotatedParameterTypes(); + check(t.length == 0); + + // ONLY ANNOTATED PARAM TYPES + Class[] argsArr = {String.class, String.class, String.class}; + m = Params.class.getDeclaredMethod("onlyAnnotated", (Class[])argsArr); + t = m.getAnnotatedParameterTypes(); + check(t.length == 3); + + check(t[0].getAnnotations().length == 1); + check(t[0].getAnnotation(TypeAnno.class) != null); + check(t[0].getAnnotationsByType(TypeAnno.class)[0].value().equals("1")); + + check(t[1].getAnnotations().length == 1); + check(t[1].getAnnotation(TypeAnno.class) != null); + check(t[1].getAnnotationsByType(TypeAnno.class)[0].value().equals("2")); + + check(t[2].getAnnotations().length == 2); + check(t[2].getAnnotations()[0].annotationType().equals(TypeAnno.class)); + check(t[2].getAnnotation(TypeAnno.class) != null); + check(t[2].getAnnotation(TypeAnno2.class) != null); + check(t[2].getAnnotationsByType(TypeAnno.class)[0].value().equals("3a")); + check(t[2].getAnnotationsByType(TypeAnno2.class)[0].value().equals("3b")); + + // MIXED ANNOTATED PARAM TYPES + m = Params.class.getDeclaredMethod("mixed", (Class[])argsArr); + t = m.getAnnotatedParameterTypes(); + check(t.length == 3); + + check(t[0].getAnnotations().length == 1); + check(t[0].getAnnotation(TypeAnno.class) != null); + check(t[0].getAnnotationsByType(TypeAnno.class)[0].value().equals("1")); + + check(t[1].getAnnotations().length == 0); + check(t[1].getAnnotation(TypeAnno.class) == null); + check(t[1].getAnnotation(TypeAnno2.class) == null); + + check(t[2].getAnnotations().length == 2); + check(t[2].getAnnotations()[0].annotationType().equals(TypeAnno.class)); + check(t[2].getAnnotation(TypeAnno.class) != null); + check(t[2].getAnnotation(TypeAnno2.class) != null); + check(t[2].getAnnotationsByType(TypeAnno.class)[0].value().equals("3a")); + check(t[2].getAnnotationsByType(TypeAnno2.class)[0].value().equals("3b")); + + // NO ANNOTATED PARAM TYPES + m = Params.class.getDeclaredMethod("unAnnotated", (Class[])argsArr); + t = m.getAnnotatedParameterTypes(); + check(t.length == 3); + + check(t[0].getAnnotations().length == 0); + check(t[0].getAnnotation(TypeAnno.class) == null); + check(t[0].getAnnotation(TypeAnno2.class) == null); + + check(t[1].getAnnotations().length == 0); + check(t[1].getAnnotation(TypeAnno.class) == null); + check(t[1].getAnnotation(TypeAnno2.class) == null); + + check(t[2].getAnnotations().length == 0); + check(t[2].getAnnotation(TypeAnno.class) == null); + check(t[2].getAnnotation(TypeAnno2.class) == null); + } + + private static void testParameterType() throws Exception { + // NO PARAMS + Method m = Params.class.getDeclaredMethod("noParams", (Class[])null); + Parameter[] p = m.getParameters(); + check(p.length == 0); + + // ONLY ANNOTATED PARAM TYPES + Class[] argsArr = {String.class, String.class, String.class}; + m = Params.class.getDeclaredMethod("onlyAnnotated", (Class[])argsArr); + p = m.getParameters(); + check(p.length == 3); + AnnotatedType t0 = p[0].getAnnotatedType(); + AnnotatedType t1 = p[1].getAnnotatedType(); + AnnotatedType t2 = p[2].getAnnotatedType(); + + check(t0.getAnnotations().length == 1); + check(t0.getAnnotation(TypeAnno.class) != null); + check(t0.getAnnotationsByType(TypeAnno.class)[0].value().equals("1")); + + check(t1.getAnnotations().length == 1); + check(t1.getAnnotation(TypeAnno.class) != null); + check(t1.getAnnotationsByType(TypeAnno.class)[0].value().equals("2")); + + check(t2.getAnnotations().length == 2); + check(t2.getAnnotations()[0].annotationType().equals(TypeAnno.class)); + check(t2.getAnnotation(TypeAnno.class) != null); + check(t2.getAnnotation(TypeAnno2.class) != null); + check(t2.getAnnotationsByType(TypeAnno.class)[0].value().equals("3a")); + check(t2.getAnnotationsByType(TypeAnno2.class)[0].value().equals("3b")); + + // MIXED ANNOTATED PARAM TYPES + m = Params.class.getDeclaredMethod("mixed", (Class[])argsArr); + p = m.getParameters(); + check(p.length == 3); + + t0 = p[0].getAnnotatedType(); + t1 = p[1].getAnnotatedType(); + t2 = p[2].getAnnotatedType(); + + check(t0.getAnnotations().length == 1); + check(t0.getAnnotation(TypeAnno.class) != null); + check(t0.getAnnotationsByType(TypeAnno.class)[0].value().equals("1")); + + check(t1.getAnnotations().length == 0); + check(t1.getAnnotation(TypeAnno.class) == null); + check(t1.getAnnotation(TypeAnno2.class) == null); + + check(t2.getAnnotations().length == 2); + check(t2.getAnnotations()[0].annotationType().equals(TypeAnno.class)); + check(t2.getAnnotation(TypeAnno.class) != null); + check(t2.getAnnotation(TypeAnno2.class) != null); + check(t2.getAnnotationsByType(TypeAnno.class)[0].value().equals("3a")); + check(t2.getAnnotationsByType(TypeAnno2.class)[0].value().equals("3b")); + + // NO ANNOTATED PARAM TYPES + m = Params.class.getDeclaredMethod("unAnnotated", (Class[])argsArr); + p = m.getParameters(); + check(p.length == 3); + + t0 = p[0].getAnnotatedType(); + t1 = p[1].getAnnotatedType(); + t2 = p[2].getAnnotatedType(); + + check(t0.getAnnotations().length == 0); + check(t0.getAnnotation(TypeAnno.class) == null); + check(t0.getAnnotation(TypeAnno2.class) == null); + + check(t1.getAnnotations().length == 0); + check(t1.getAnnotation(TypeAnno.class) == null); + check(t1.getAnnotation(TypeAnno2.class) == null); + + check(t2.getAnnotations().length == 0); + check(t2.getAnnotation(TypeAnno.class) == null); + check(t2.getAnnotation(TypeAnno2.class) == null); + } +} + +class Params { + public void noParams() {} + public void onlyAnnotated(@TypeAnno("1") String s1, @TypeAnno("2") String s2, @TypeAnno("3a") @TypeAnno2("3b") String s3) {} + public void mixed(@TypeAnno("1") String s1, String s2, @TypeAnno("3a") @TypeAnno2("3b") String s3) {} + public void unAnnotated(String s1, String s2, String s3) {} } abstract class TestWildcardType { diff --git a/test/java/nio/file/Files/NameLimits.java b/test/java/nio/file/Files/NameLimits.java new file mode 100644 index 0000000000000000000000000000000000000000..21f22e0e1a57ddfe2a5a9534261b3225987f061f --- /dev/null +++ b/test/java/nio/file/Files/NameLimits.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8011128 + * @summary Test file and directory name limits. This test is primarily + * intended to test Files.createDirectory on resolved paths at or around + * the short path limit of 248 on Windows. + */ + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class NameLimits { + + static final int MAX_PATH = 255; + static final int MIN_PATH = 8; // arbitrarily chosen + + static Path generatePath(int len) { + if (len < MIN_PATH) + throw new RuntimeException("Attempting to generate path less than MIN_PATH"); + StringBuilder sb = new StringBuilder(len); + sb.append("name"); + while (sb.length() < len) { + sb.append('X'); + } + return Paths.get(sb.toString()); + } + + static boolean tryCreateFile(int len) throws IOException { + Path name = generatePath(len); + try { + Files.createFile(name); + } catch (IOException ioe) { + System.err.format("Unable to create file of length %d (full path %d), %s%n", + name.toString().length(), name.toAbsolutePath().toString().length(), ioe); + return false; + } + Files.delete(name); + return true; + } + + static boolean tryCreateDirectory(int len) throws IOException { + Path name = generatePath(len); + try { + Files.createDirectory(name); + } catch (IOException ioe) { + System.err.format("Unable to create directory of length %d (full path %d), %s%n", + name.toString().length(), name.toAbsolutePath().toString().length(), ioe); + return false; + } + Files.delete(name); + return true; + } + + public static void main(String[] args) throws Exception { + int len; + + // find the maximum file name if MAX_PATH or less + len = MAX_PATH; + while (!tryCreateFile(len)) { + len--; + } + System.out.format("Testing createFile on paths %d .. %d%n", MIN_PATH, len); + while (len >= MIN_PATH) { + if (!tryCreateFile(len--)) + throw new RuntimeException("Test failed"); + } + + // find the maximum directory name if MAX_PATH or less + len = MAX_PATH; + while (!tryCreateDirectory(len)) { + len--; + } + System.out.format("Testing createDirectory on paths %d .. %d%n", MIN_PATH, len); + while (len >= MIN_PATH) { + if (!tryCreateDirectory(len--)) + throw new RuntimeException("Test failed"); + } + } +} diff --git a/test/java/util/regex/RegExTest.java b/test/java/util/regex/RegExTest.java index 8626a5102ea335689817b40ed465a8ffbeb80224..f0563d94e2e7ea8029a83867b0fb14dcf304c796 100644 --- a/test/java/util/regex/RegExTest.java +++ b/test/java/util/regex/RegExTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,7 +33,7 @@ * 5013885 5003322 4988891 5098443 5110268 6173522 4829857 5027748 6376940 * 6358731 6178785 6284152 6231989 6497148 6486934 6233084 6504326 6635133 * 6350801 6676425 6878475 6919132 6931676 6948903 6990617 7014645 7039066 - * 7067045 7014640 7189363 8007395 8013252 8013254 + * 7067045 7014640 7189363 8007395 8013252 8013254 8012646 */ import java.util.regex.*; @@ -41,6 +41,7 @@ import java.util.Random; import java.io.*; import java.util.*; import java.nio.CharBuffer; +import java.util.function.Predicate; /** * This is a test class created to check the operation of @@ -145,6 +146,7 @@ public class RegExTest { linebreakTest(); branchTest(); groupCurlyNotFoundSuppTest(); + patternAsPredicate(); if (failure) { throw new RuntimeException("RegExTest failed, 1st failure: " + @@ -3997,4 +3999,19 @@ public class RegExTest { report("GroupCurly NotFoundSupp"); } + // This test is for 8012646 + private static void patternAsPredicate() throws Exception { + Predicate p = Pattern.compile("[a-z]+").asPredicate(); + + if (p.test("")) { + failCount++; + } + if (!p.test("word")) { + failCount++; + } + if (p.test("1234")) { + failCount++; + } + report("Pattern.asPredicate"); + } } diff --git a/test/javax/swing/JInternalFrame/InternalFrameIsNotCollectedTest.java b/test/javax/swing/JInternalFrame/InternalFrameIsNotCollectedTest.java new file mode 100644 index 0000000000000000000000000000000000000000..182e57eef556d3e0245baf617fd4e9ce42fa5214 --- /dev/null +++ b/test/javax/swing/JInternalFrame/InternalFrameIsNotCollectedTest.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + /* @test + @bug 8012004 + @summary JINTERNALFRAME NOT BEING FINALIZED AFTER CLOSING + @author mcherkas + @run main InternalFrameIsNotCollectedTest + */ + +import sun.awt.SunToolkit; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.beans.PropertyVetoException; +import java.util.Date; + +public class InternalFrameIsNotCollectedTest { + + public static final int waitTime = 10000; + private static Robot robot; + + public static void sync() { + + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + toolkit.realSync(); + } + + public static void main(String[] args) throws Exception { + initRobot(); + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + initUI(); + try { + closeInternalFrame(); + } catch (PropertyVetoException e) { + throw new RuntimeException(e); + } + } + }); + sync(); + invokeGC(); + Thread.sleep(1000); // it's better to wait 1 sec now then 10 sec later + Date startWaiting = new Date(); + synchronized (CustomInternalFrame.waiter) { + // Sync with finalization thread. + Date now = new Date(); + while (now.getTime() - startWaiting.getTime() < waitTime && !CustomInternalFrame.finalized) { + CustomInternalFrame.waiter.wait(waitTime); + now = new Date(); + } + } + if (!CustomInternalFrame.finalized) { + throw new RuntimeException("Closed internal frame wasn't collected"); + } + } + + private static void initRobot() throws AWTException { + robot = new Robot(); + robot.setAutoDelay(100); + } + + private static void closeInternalFrame() throws PropertyVetoException { + robot.keyPress(KeyEvent.VK_CONTROL); + robot.keyPress(KeyEvent.VK_F4); + robot.keyRelease(KeyEvent.VK_F4); + robot.keyRelease(KeyEvent.VK_CONTROL); + } + + private static void initUI() { + JFrame frame = new JFrame("Internal Frame Test"); + frame.getContentPane().setLayout(new BorderLayout()); + JDesktopPane desktopPane = new JDesktopPane(); + desktopPane.setDesktopManager(new DefaultDesktopManager()); + frame.getContentPane().add(desktopPane, BorderLayout.CENTER); + + CustomInternalFrame iFrame = new CustomInternalFrame("Dummy Frame"); + + iFrame.setSize(200, 200); + iFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + desktopPane.add(iFrame); + + frame.setSize(800, 600); + frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + frame.setVisible(true); + iFrame.setVisible(true); + } + + private static void invokeGC() { + System.out.println("Firing garbage collection!"); + try { + StringBuilder sb = new StringBuilder(); + while (true) { + sb.append("any string. some test. a little bit more text." + sb.toString()); + } + } catch (Throwable e) { + // do nothing + } + } + + + public static class CustomInternalFrame extends JInternalFrame { + public static volatile boolean finalized = false; + public static Object waiter = new Object(); + + public CustomInternalFrame(String title) { + super(title, true, true, true, true); + } + + protected void finalize() { + System.out.println("Finalized!"); + finalized = true; + waiter.notifyAll(); + } + } +} \ No newline at end of file diff --git a/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java b/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java index 47761ec13d2c77a2fc58cedde5794aca26c9c01b..4cf1c750da56461712722f2d6432e4a8670637f8 100644 --- a/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java +++ b/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,43 +35,72 @@ import java.awt.event.*; import javax.swing.*; public class ActionListenerCalledTwiceTest { + static String menuItems[] = { "Item1", "Item2" }; + static KeyStroke keyStrokes[] = { + KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.META_MASK), + KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0) + }; + static volatile int listenerCallCounter = 0; public static void main(String[] args) throws Exception { if (sun.awt.OSInfo.getOSType() != sun.awt.OSInfo.OSType.MACOSX) { System.out.println("This test is for MacOS only. Automatically passed on other platforms."); return; } + System.setProperty("apple.laf.useScreenMenuBar", "true"); SwingUtilities.invokeAndWait(new Runnable() { public void run() { createAndShowGUI(); } }); + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); Robot robot = new Robot(); robot.setAutoDelay(100); - robot.keyPress(KeyEvent.VK_META); - robot.keyPress(KeyEvent.VK_E); - robot.keyRelease(KeyEvent.VK_E); - robot.keyRelease(KeyEvent.VK_META); - toolkit.realSync(); - if (listenerCallCounter != 1) { - throw new Exception("Test failed: ActionListener called " + listenerCallCounter + " times instead of 1!"); + + for (int i = 0; i < menuItems.length; ++i) { + KeyStroke ks = keyStrokes[i]; + int modKeyCode = getModKeyCode(ks.getModifiers()); + + if (modKeyCode != 0) { + robot.keyPress(modKeyCode); + } + + robot.keyPress(ks.getKeyCode()); + robot.keyRelease(ks.getKeyCode()); + + if (modKeyCode != 0) { + robot.keyRelease(modKeyCode); + } + + toolkit.realSync(); + + if (listenerCallCounter != 1) { + throw new Exception("Test failed: ActionListener for " + menuItems[i] + + " called " + listenerCallCounter + " times instead of 1!"); + } + + listenerCallCounter = 0; } } private static void createAndShowGUI() { - JMenuItem newItem = new JMenuItem("Exit"); - newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.META_MASK)); - newItem.addActionListener( - new ActionListener(){ - public void actionPerformed(ActionEvent e) { - listenerCallCounter++; - } - } - ); JMenu menu = new JMenu("Menu"); - menu.add(newItem); + + for (int i = 0; i < menuItems.length; ++i) { + JMenuItem newItem = new JMenuItem(menuItems[i]); + newItem.setAccelerator(keyStrokes[i]); + newItem.addActionListener( + new ActionListener(){ + public void actionPerformed(ActionEvent e) { + listenerCallCounter++; + } + } + ); + menu.add(newItem); + } + JMenuBar bar = new JMenuBar(); bar.add(menu); JFrame frame = new JFrame("Test"); @@ -80,4 +109,24 @@ public class ActionListenerCalledTwiceTest { frame.pack(); frame.setVisible(true); } + + private static int getModKeyCode(int mod) { + if ((mod & (InputEvent.SHIFT_DOWN_MASK | InputEvent.SHIFT_MASK)) != 0) { + return KeyEvent.VK_SHIFT; + } + + if ((mod & (InputEvent.CTRL_DOWN_MASK | InputEvent.CTRL_MASK)) != 0) { + return KeyEvent.VK_CONTROL; + } + + if ((mod & (InputEvent.ALT_DOWN_MASK | InputEvent.ALT_MASK)) != 0) { + return KeyEvent.VK_ALT; + } + + if ((mod & (InputEvent.META_DOWN_MASK | InputEvent.META_MASK)) != 0) { + return KeyEvent.VK_META; + } + + return 0; + } } diff --git a/test/sun/security/provider/certpath/X509CertPath/ForwardBuildCompromised.java b/test/sun/security/provider/certpath/X509CertPath/ForwardBuildCompromised.java deleted file mode 100644 index 9ee45b7076dd1b1a2855a521d0f1058e528d2832..0000000000000000000000000000000000000000 --- a/test/sun/security/provider/certpath/X509CertPath/ForwardBuildCompromised.java +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 7123519 - * @summary Problem with java/classes_security - */ - -import java.net.*; -import java.util.*; -import java.io.*; -import javax.net.ssl.*; -import java.security.KeyStore; -import java.security.cert.*; -import java.security.spec.*; -import java.security.interfaces.*; - -public class ForwardBuildCompromised { - // DigiNotar Root CA, untrusted root certificate - static String trustedCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\n" + - "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\n" + - "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\n" + - "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\n" + - "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1\n" + - "MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE\n" + - "ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j\n" + - "b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF\n" + - "bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg\n" + - "U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA\n" + - "A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/\n" + - "I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3\n" + - "wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC\n" + - "AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb\n" + - "oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5\n" + - "BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p\n" + - "dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk\n" + - "MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp\n" + - "b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu\n" + - "dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0\n" + - "MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi\n" + - "E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa\n" + - "MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI\n" + - "hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN\n" + - "95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd\n" + - "2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=\n" + - "-----END CERTIFICATE-----"; - - // DigiNotar Root CA, untrusted cross-certificate - static String untrustedCrossCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIFSDCCBLGgAwIBAgIERpwsrzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\n" + - "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\n" + - "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\n" + - "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\n" + - "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzA3\n" + - "MjYxNTU3MzlaFw0xMzA4MjYxNjI3MzlaMF8xCzAJBgNVBAYTAk5MMRIwEAYDVQQK\n" + - "EwlEaWdpTm90YXIxGjAYBgNVBAMTEURpZ2lOb3RhciBSb290IENBMSAwHgYJKoZI\n" + - "hvcNAQkBFhFpbmZvQGRpZ2lub3Rhci5ubDCCAiIwDQYJKoZIhvcNAQEBBQADggIP\n" + - "ADCCAgoCggIBAKywWMEAvdghCAsrmv5uVjAFnxt3kBBBXMMNhxF3joHxynzpjGrt\n" + - "OHQ1u9rf+bvACTe0lnOBfTMamDn3k2+Vfz25sXWHulFI6ItwPpUExdi2wxbZiLCx\n" + - "hx1w2oa0DxSLes8Q0XQ2ohJ7d4ZKeeZ73wIRaKVOhq40WJskE3hWIiUeAYtLUXH7\n" + - "gsxZlmmIWmhTxbkNAjfLS7xmSpB+KgsFB+0WX1WQddhGyRuD4gi+8SPMmR3WKg+D\n" + - "IBVYJ4Iu+uIiwkmxuQGBap1tnUB3aHZOISpthECFTnaZfILz87cCWdQmARuO361T\n" + - "BtGuGN3isjrL14g4jqxbKbkZ05j5GAPPSIKGZgsbaQ/J6ziIeiYaBUyS1yTUlvKs\n" + - "Ui2jR9VS9j/+zoQGcKaqPqLytlY0GFei5IFt58rwatPHkWsCg0F8Fe9rmmRe49A8\n" + - "5bHre12G+8vmd0nNo2Xc97mcuOQLX5PPzDAaMhzOHGOVpfnq4XSLnukrqTB7oBgf\n" + - "DhgL5Vup09FsHgdnj5FLqYq80maqkwGIspH6MVzVpsFSCAnNCmOi0yKm6KHZOQaX\n" + - "9W6NApCMFHs/gM0bnLrEWHIjr7ZWn8Z6QjMpBz+CyeYfBQ3NTCg2i9PIPhzGiO9e\n" + - "7olk6R3r2ol+MqZp0d3MiJ/R0MlmIdwGZ8WUepptYkx9zOBkgLKeR46jAgMBAAGj\n" + - "ggEmMIIBIjASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMB\n" + - "BggrBgEFBQcDAgYIKwYBBQUHAwQwEQYDVR0gBAowCDAGBgRVHSAAMDMGCCsGAQUF\n" + - "BwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYD\n" + - "VR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5lbnRydXN0Lm5ldC9zZXJ2ZXIxLmNy\n" + - "bDAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wCwYDVR0PBAQDAgEGMB8G\n" + - "A1UdIwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMBkGCSqGSIb2fQdBAAQMMAob\n" + - "BFY3LjEDAgCBMA0GCSqGSIb3DQEBBQUAA4GBAEa6RcDNcEIGUlkDJUY/pWTds4zh\n" + - "xbVkp3wSmpwPFhx5fxTyF4HD2L60jl3aqjTB7gPpsL2Pk5QZlNsi3t4UkCV70UOd\n" + - "ueJRN3o/LOtk4+bjXY2lC0qTHbN80VMLqPjmaf9ghSA9hwhskdtMgRsgfd90q5QP\n" + - "ZFdYf+hthc3m6IcJ\n" + - "-----END CERTIFICATE-----"; - - // DigiNotar Root CA, compromised certificate - static String compromisedCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBf\n" + - "MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdp\n" + - "Tm90YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmww\n" + - "HhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgxOTIxWjBfMQswCQYDVQQGEwJOTDES\n" + - "MBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEg\n" + - "MB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3DQEB\n" + - "AQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B\n" + - "8cp86Yxq7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXY\n" + - "tsMW2YiwsYcdcNqGtA8Ui3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIl\n" + - "HgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8ZkqQfioLBQftFl9VkHXYRskbg+IIvvEj\n" + - "zJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEqbYRAhU52mXyC8/O3AlnU\n" + - "JgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4iHomGgVM\n" + - "ktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXv\n" + - "a5pkXuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57p\n" + - "K6kwe6AYHw4YC+VbqdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMi\n" + - "puih2TkGl/VujQKQjBR7P4DNG5y6xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovT\n" + - "yD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHcBmfFlHqabWJMfczgZICynkeO\n" + - "owIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV\n" + - "HQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC\n" + - "jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXy\n" + - "fJ9oHbtdzno5wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBo\n" + - "Y6pFITlIYXg23PFDk9Qlx/KAZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHo\n" + - "M/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedTFLJgQT2EkTFoPSdE2+Xe9PpjRchM\n" + - "Ppj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKfyvBovWsdst+Nbwed\n" + - "2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoAZbwH\n" + - "/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQl\n" + - "nQ7KN+ZQ/YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jE\n" + - "O1hZibCMjFCz2IbLaKPECudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU\n" + - "9jQZjHkJNsphFyUXC4KYcwx3dMPVDceoEkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9\n" + - "j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr\n" + - "-----END CERTIFICATE-----"; - - // DigiNotar Public CA 2025, intermediate certificate - static String intermediateCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIGAzCCA+ugAwIBAgIQHn16Uz1FMEGWQA9xSB9FBDANBgkqhkiG9w0BAQUFADBf\n" + - "MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdp\n" + - "Tm90YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmww\n" + - "HhcNMDYwMjA2MTYwNzAyWhcNMjUwMzI4MTYwNzAyWjBmMQswCQYDVQQGEwJOTDES\n" + - "MBAGA1UEChMJRGlnaU5vdGFyMSEwHwYDVQQDExhEaWdpTm90YXIgUHVibGljIENB\n" + - "IDIwMjUxIDAeBgkqhkiG9w0BCQEWEWluZm9AZGlnaW5vdGFyLm5sMIIBIjANBgkq\n" + - "hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs/2eu/I5fMG8lbvPph3e8zfJpZQtg/72\n" + - "Yx29+ivtKehiF6A3n785XyoY6IT3vlCrhy1CbMOY3M0x1n4YQlv17B0XZ/DqHyBA\n" + - "SQvnDNbkM9j4NoSy/sRtGsP6PetIFFjrhE9whZuvuSUC1PY4PruEEJp8zOCx4+wU\n" + - "Zt9xvjy4Xra+bSia5rwccQ/R5FYTGKrYCthOy9C9ud5Fhd++rlVhgdA/78w+Cs2s\n" + - "xS4i0MAxG75P3/e/bATJKepbydHdDjkyz9o3RW/wdPUXhzEw4EwUjYg6XJrDzMad\n" + - "6aL9M/eaxDjgz6o48EaWRDrGptaE2uJRuErVz7oOO0p/wYKq/BU+/wIDAQABo4IB\n" + - "sjCCAa4wOgYIKwYBBQUHAQEELjAsMCoGCCsGAQUFBzABhh5odHRwOi8vdmFsaWRh\n" + - "dGlvbi5kaWdpbm90YXIubmwwHwYDVR0jBBgwFoAUiGi/4I41xDs4a2L3KDuEgcgM\n" + - "100wEgYDVR0TAQH/BAgwBgEB/wIBADCBxgYDVR0gBIG+MIG7MIG4Bg5ghBABh2kB\n" + - "AQEBBQIGBDCBpTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpbm90YXIubmwv\n" + - "Y3BzMHoGCCsGAQUFBwICMG4abENvbmRpdGlvbnMsIGFzIG1lbnRpb25lZCBvbiBv\n" + - "dXIgd2Vic2l0ZSAod3d3LmRpZ2lub3Rhci5ubCksIGFyZSBhcHBsaWNhYmxlIHRv\n" + - "IGFsbCBvdXIgcHJvZHVjdHMgYW5kIHNlcnZpY2VzLjBDBgNVHR8EPDA6MDigNqA0\n" + - "hjJodHRwOi8vc2VydmljZS5kaWdpbm90YXIubmwvY3JsL3Jvb3QvbGF0ZXN0Q1JM\n" + - "LmNybDAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFN8zwK+S/jf8ttgWFtDZsZHV\n" + - "+m6lMA0GCSqGSIb3DQEBBQUAA4ICAQCfV1rmBd9QStEyQ40lT0tqby0/3ez0STuJ\n" + - "ESBQLQD56XYdb4VFSuqA6xTtiuSVHLoiv2xyISN9FvX3A5VtifkJ00JEaLQJiSsE\n" + - "wGDkYGl1DT7SsqtAVKdMAuCM+e0j0/RV3hZ6kcrM7/wFccHwM+/TiurR9lgZDzB4\n" + - "a7++A4XrYyKx9vc9ZwBEnD1nrAe7++gg9cuZgP7e+QL0FBHMjpw+gnCDjr2dzBZC\n" + - "4r+b8SOqlbPRPexBuNghlc7PfcPIyFis2LJXDRMWiAd3TcfdALwRsuKMR/T+cwyr\n" + - "asy69OEGHplLT57otQ524BDctDXNzlH9bHEh52QzqkWvIDqs42910IUy1nYNPIUG\n" + - "yYJV/T7H8Jb6vfMZWe47iUFvtNZCi8+b542gRUwdi+ca+hGviBC9Qr4Wv1pl7CBQ\n" + - "Hy1axTkHiQawUo/hgmoetCpftugl9yJTfvsBorUV1ZMxn9B1JLSGtWnbUsFRla7G\n" + - "fNa0IsUkzmmha8XCzvNu0d1PDGtcQyUqmDOE1Hx4cIBeuF8ipuIXkrVCr9zAZ4ZC\n" + - "hgz6aA1gDTW8whSRJqYEYEQ0pcMEFLyXE+Nz3O8NinO2AuxqKhjMk13203xA7lPY\n" + - "MnBQ0v7S3qqbp/pvPMiUhOz/VaYted6QmOY5EATBnFiLCuw87JXoAyp382eJ3WX1\n" + - "hOiR4IX9Tg==\n" + - "-----END CERTIFICATE-----"; - - // The fraudulent certificate issued by above compromised CA - static String targetCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIFKDCCBBCgAwIBAgIQBeLmpM0J6lTWZbB1/iKiVjANBgkqhkiG9w0BAQUFADBm\n" + - "MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMSEwHwYDVQQDExhEaWdp\n" + - "Tm90YXIgUHVibGljIENBIDIwMjUxIDAeBgkqhkiG9w0BCQEWEWluZm9AZGlnaW5v\n" + - "dGFyLm5sMB4XDTExMDcxMDE5MDYzMFoXDTEzMDcwOTE5MDYzMFowajELMAkGA1UE\n" + - "BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxFjAUBgNVBAcTDU1vdW50YWluIFZp\n" + - "ZXcxFzAVBgNVBAUTDlBLMDAwMjI5MjAwMDAyMRUwEwYDVQQDEwwqLmdvb2dsZS5j\n" + - "b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNbeKubCV0aCxhOiOS\n" + - "CSQ/w9HXTYuD5BLKuiqXNw3setdTymeJz2L8aWOHo3nicFNDVwWTgwWomGNr2J6Q\n" + - "7g1iINNSW0rR4E1l2szRkcnAY6c6i/Eke93nF4i2hDsnIBveolF5yjpuRm73uQQD\n" + - "ulHjA3BFRF/PTi0fw2/Yt+8ieoMuNcMWN6Eou5Gqt5YZkWv176ofeCbsBmMrP87x\n" + - "OhhtTDckCapk4VQZG2XrfzZcV6tdzCp5TI8uHdu17cdzXm1imZ8tyvzFeiCEOQN8\n" + - "vPNzB/fIr3CJQ5q4uM5aKT3DD5PeVzf4rfJKQNgCTWiIBc9XcWEUuszwAsnmg7e2\n" + - "EJRdAgMBAAGjggHMMIIByDA6BggrBgEFBQcBAQQuMCwwKgYIKwYBBQUHMAGGHmh0\n" + - "dHA6Ly92YWxpZGF0aW9uLmRpZ2lub3Rhci5ubDAfBgNVHSMEGDAWgBTfM8Cvkv43\n" + - "/LbYFhbQ2bGR1fpupTAJBgNVHRMEAjAAMIHGBgNVHSAEgb4wgbswgbgGDmCEEAGH\n" + - "aQEBAQIEAQICMIGlMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2lub3Rhci5u\n" + - "bC9jcHMwegYIKwYBBQUHAgIwbhpsQ29uZGl0aW9ucywgYXMgbWVudGlvbmVkIG9u\n" + - "IG91ciB3ZWJzaXRlICh3d3cuZGlnaW5vdGFyLm5sKSwgYXJlIGFwcGxpY2FibGUg\n" + - "dG8gYWxsIG91ciBwcm9kdWN0cyBhbmQgc2VydmljZXMuMEkGA1UdHwRCMEAwPqA8\n" + - "oDqGOGh0dHA6Ly9zZXJ2aWNlLmRpZ2lub3Rhci5ubC9jcmwvcHVibGljMjAyNS9s\n" + - "YXRlc3RDUkwuY3JsMA4GA1UdDwEB/wQEAwIEsDAbBgNVHREEFDASgRBhZG1pbkBn\n" + - "b29nbGUuY29tMB0GA1UdDgQWBBQHSn0WJzIo0eMBMQUNsMqN6eF/7TANBgkqhkiG\n" + - "9w0BAQUFAAOCAQEAAs5dL7N9wzRJkI4Aq4lC5t8j5ZadqnqUcgYLADzSv4ExytNH\n" + - "UY2nH6iVTihC0UPSsILWraoeApdT7Rphz/8DLQEBRGdeKWAptNM3EbiXtQaZT2uB\n" + - "pidL8UoafX0kch3f71Y1scpBEjvu5ZZLnjg0A8AL0tnsereOVdDpU98bKqdbbrnM\n" + - "FRmBlSf7xdaNca6JJHeEpga4E9Ty683CmccrSGXdU2tTCuHEJww+iOAUtPIZcsum\n" + - "U7/eYeY1pMyGLyIjbNgRY7nDzRwvM/BsbL9eh4/mSQj/4nncqJd22sVQpCggQiVK\n" + - "baB2sVGcVNBkK55bT8gPqnx8JypubyUvayzZGg==\n" + - "-----END CERTIFICATE-----"; - - public static void main(String args[]) throws Exception { - - Exception reservedException = null; - try { - build(); - } catch (CertPathBuilderException cpbe) { - reservedException = cpbe; - } - - if (reservedException == null) { - throw new Exception("Unable to block fraudulent certificate"); - } - - System.out.println( - "The expected untrusted cert exception: " + reservedException); - } - - private static X509CertSelector generateSelector() throws Exception { - - // generate certificate from cert strings - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - X509Certificate target = null; - try (ByteArrayInputStream is = - new ByteArrayInputStream(targetCertStr.getBytes())) { - target = (X509Certificate)cf.generateCertificate(is); - } - - X509CertSelector selector = new X509CertSelector(); - selector.setCertificate(target); - - return selector; - } - - - private static CertStore generateCertificateStore() throws Exception { - - // generate certificate from cert strings - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - // generate certification path - Set entries = new HashSet(); - - try (ByteArrayInputStream is = - new ByteArrayInputStream(targetCertStr.getBytes())) { - entries.add(cf.generateCertificate(is)); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(intermediateCertStr.getBytes())) { - entries.add(cf.generateCertificate(is)); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(compromisedCertStr.getBytes())) { - entries.add(cf.generateCertificate(is)); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(untrustedCrossCertStr.getBytes())) { - entries.add(cf.generateCertificate(is)); - } - - return CertStore.getInstance("Collection", - new CollectionCertStoreParameters(entries)); - } - - private static Set generateTrustAnchors() - throws CertificateException, IOException { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - Certificate trustedCert = null; - try (ByteArrayInputStream is = - new ByteArrayInputStream(trustedCertStr.getBytes())) { - trustedCert = cf.generateCertificate(is); - } - - // generate a trust anchor - TrustAnchor anchor = - new TrustAnchor((X509Certificate)trustedCert, null); - - return Collections.singleton(anchor); - } - - private static void build() throws Exception { - X509CertSelector selector = generateSelector(); - Set anchors = generateTrustAnchors(); - CertStore certs = generateCertificateStore(); - - PKIXBuilderParameters params = - new PKIXBuilderParameters(anchors, selector); - params.addCertStore(certs); - params.setRevocationEnabled(false); - params.setDate(new Date(111, 11, 25)); // 2011-12-25 - - CertPathBuilder builder = CertPathBuilder.getInstance("PKIX"); - PKIXCertPathBuilderResult result = - (PKIXCertPathBuilderResult)builder.build(params); - } -} - diff --git a/test/sun/security/provider/certpath/X509CertPath/ReverseBuildCompromised.java b/test/sun/security/provider/certpath/X509CertPath/ReverseBuildCompromised.java deleted file mode 100644 index 845a14971373ea2de792d5baa8584112ca15d2dc..0000000000000000000000000000000000000000 --- a/test/sun/security/provider/certpath/X509CertPath/ReverseBuildCompromised.java +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 7123519 - * @summary Problem with java/classes_security - */ - -import java.net.*; -import java.util.*; -import java.io.*; -import javax.net.ssl.*; -import java.security.KeyStore; -import java.security.cert.*; -import java.security.spec.*; -import java.security.interfaces.*; -import sun.security.provider.certpath.SunCertPathBuilderParameters; - -public class ReverseBuildCompromised { - // DigiNotar Root CA, untrusted root certificate - static String trustedCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\n" + - "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\n" + - "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\n" + - "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\n" + - "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1\n" + - "MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE\n" + - "ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j\n" + - "b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF\n" + - "bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg\n" + - "U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA\n" + - "A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/\n" + - "I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3\n" + - "wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC\n" + - "AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb\n" + - "oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5\n" + - "BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p\n" + - "dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk\n" + - "MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp\n" + - "b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu\n" + - "dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0\n" + - "MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi\n" + - "E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa\n" + - "MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI\n" + - "hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN\n" + - "95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd\n" + - "2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=\n" + - "-----END CERTIFICATE-----"; - - // DigiNotar Root CA, untrusted cross-certificate - static String untrustedCrossCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIFSDCCBLGgAwIBAgIERpwsrzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\n" + - "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\n" + - "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\n" + - "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\n" + - "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzA3\n" + - "MjYxNTU3MzlaFw0xMzA4MjYxNjI3MzlaMF8xCzAJBgNVBAYTAk5MMRIwEAYDVQQK\n" + - "EwlEaWdpTm90YXIxGjAYBgNVBAMTEURpZ2lOb3RhciBSb290IENBMSAwHgYJKoZI\n" + - "hvcNAQkBFhFpbmZvQGRpZ2lub3Rhci5ubDCCAiIwDQYJKoZIhvcNAQEBBQADggIP\n" + - "ADCCAgoCggIBAKywWMEAvdghCAsrmv5uVjAFnxt3kBBBXMMNhxF3joHxynzpjGrt\n" + - "OHQ1u9rf+bvACTe0lnOBfTMamDn3k2+Vfz25sXWHulFI6ItwPpUExdi2wxbZiLCx\n" + - "hx1w2oa0DxSLes8Q0XQ2ohJ7d4ZKeeZ73wIRaKVOhq40WJskE3hWIiUeAYtLUXH7\n" + - "gsxZlmmIWmhTxbkNAjfLS7xmSpB+KgsFB+0WX1WQddhGyRuD4gi+8SPMmR3WKg+D\n" + - "IBVYJ4Iu+uIiwkmxuQGBap1tnUB3aHZOISpthECFTnaZfILz87cCWdQmARuO361T\n" + - "BtGuGN3isjrL14g4jqxbKbkZ05j5GAPPSIKGZgsbaQ/J6ziIeiYaBUyS1yTUlvKs\n" + - "Ui2jR9VS9j/+zoQGcKaqPqLytlY0GFei5IFt58rwatPHkWsCg0F8Fe9rmmRe49A8\n" + - "5bHre12G+8vmd0nNo2Xc97mcuOQLX5PPzDAaMhzOHGOVpfnq4XSLnukrqTB7oBgf\n" + - "DhgL5Vup09FsHgdnj5FLqYq80maqkwGIspH6MVzVpsFSCAnNCmOi0yKm6KHZOQaX\n" + - "9W6NApCMFHs/gM0bnLrEWHIjr7ZWn8Z6QjMpBz+CyeYfBQ3NTCg2i9PIPhzGiO9e\n" + - "7olk6R3r2ol+MqZp0d3MiJ/R0MlmIdwGZ8WUepptYkx9zOBkgLKeR46jAgMBAAGj\n" + - "ggEmMIIBIjASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMB\n" + - "BggrBgEFBQcDAgYIKwYBBQUHAwQwEQYDVR0gBAowCDAGBgRVHSAAMDMGCCsGAQUF\n" + - "BwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYD\n" + - "VR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5lbnRydXN0Lm5ldC9zZXJ2ZXIxLmNy\n" + - "bDAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wCwYDVR0PBAQDAgEGMB8G\n" + - "A1UdIwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMBkGCSqGSIb2fQdBAAQMMAob\n" + - "BFY3LjEDAgCBMA0GCSqGSIb3DQEBBQUAA4GBAEa6RcDNcEIGUlkDJUY/pWTds4zh\n" + - "xbVkp3wSmpwPFhx5fxTyF4HD2L60jl3aqjTB7gPpsL2Pk5QZlNsi3t4UkCV70UOd\n" + - "ueJRN3o/LOtk4+bjXY2lC0qTHbN80VMLqPjmaf9ghSA9hwhskdtMgRsgfd90q5QP\n" + - "ZFdYf+hthc3m6IcJ\n" + - "-----END CERTIFICATE-----"; - - // DigiNotar Root CA, compromised certificate - static String compromisedCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBf\n" + - "MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdp\n" + - "Tm90YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmww\n" + - "HhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgxOTIxWjBfMQswCQYDVQQGEwJOTDES\n" + - "MBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEg\n" + - "MB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3DQEB\n" + - "AQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B\n" + - "8cp86Yxq7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXY\n" + - "tsMW2YiwsYcdcNqGtA8Ui3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIl\n" + - "HgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8ZkqQfioLBQftFl9VkHXYRskbg+IIvvEj\n" + - "zJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEqbYRAhU52mXyC8/O3AlnU\n" + - "JgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4iHomGgVM\n" + - "ktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXv\n" + - "a5pkXuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57p\n" + - "K6kwe6AYHw4YC+VbqdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMi\n" + - "puih2TkGl/VujQKQjBR7P4DNG5y6xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovT\n" + - "yD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHcBmfFlHqabWJMfczgZICynkeO\n" + - "owIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV\n" + - "HQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC\n" + - "jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXy\n" + - "fJ9oHbtdzno5wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBo\n" + - "Y6pFITlIYXg23PFDk9Qlx/KAZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHo\n" + - "M/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedTFLJgQT2EkTFoPSdE2+Xe9PpjRchM\n" + - "Ppj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKfyvBovWsdst+Nbwed\n" + - "2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoAZbwH\n" + - "/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQl\n" + - "nQ7KN+ZQ/YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jE\n" + - "O1hZibCMjFCz2IbLaKPECudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU\n" + - "9jQZjHkJNsphFyUXC4KYcwx3dMPVDceoEkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9\n" + - "j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr\n" + - "-----END CERTIFICATE-----"; - - // DigiNotar Public CA 2025, intermediate certificate - static String intermediateCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIGAzCCA+ugAwIBAgIQHn16Uz1FMEGWQA9xSB9FBDANBgkqhkiG9w0BAQUFADBf\n" + - "MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdp\n" + - "Tm90YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmww\n" + - "HhcNMDYwMjA2MTYwNzAyWhcNMjUwMzI4MTYwNzAyWjBmMQswCQYDVQQGEwJOTDES\n" + - "MBAGA1UEChMJRGlnaU5vdGFyMSEwHwYDVQQDExhEaWdpTm90YXIgUHVibGljIENB\n" + - "IDIwMjUxIDAeBgkqhkiG9w0BCQEWEWluZm9AZGlnaW5vdGFyLm5sMIIBIjANBgkq\n" + - "hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs/2eu/I5fMG8lbvPph3e8zfJpZQtg/72\n" + - "Yx29+ivtKehiF6A3n785XyoY6IT3vlCrhy1CbMOY3M0x1n4YQlv17B0XZ/DqHyBA\n" + - "SQvnDNbkM9j4NoSy/sRtGsP6PetIFFjrhE9whZuvuSUC1PY4PruEEJp8zOCx4+wU\n" + - "Zt9xvjy4Xra+bSia5rwccQ/R5FYTGKrYCthOy9C9ud5Fhd++rlVhgdA/78w+Cs2s\n" + - "xS4i0MAxG75P3/e/bATJKepbydHdDjkyz9o3RW/wdPUXhzEw4EwUjYg6XJrDzMad\n" + - "6aL9M/eaxDjgz6o48EaWRDrGptaE2uJRuErVz7oOO0p/wYKq/BU+/wIDAQABo4IB\n" + - "sjCCAa4wOgYIKwYBBQUHAQEELjAsMCoGCCsGAQUFBzABhh5odHRwOi8vdmFsaWRh\n" + - "dGlvbi5kaWdpbm90YXIubmwwHwYDVR0jBBgwFoAUiGi/4I41xDs4a2L3KDuEgcgM\n" + - "100wEgYDVR0TAQH/BAgwBgEB/wIBADCBxgYDVR0gBIG+MIG7MIG4Bg5ghBABh2kB\n" + - "AQEBBQIGBDCBpTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpbm90YXIubmwv\n" + - "Y3BzMHoGCCsGAQUFBwICMG4abENvbmRpdGlvbnMsIGFzIG1lbnRpb25lZCBvbiBv\n" + - "dXIgd2Vic2l0ZSAod3d3LmRpZ2lub3Rhci5ubCksIGFyZSBhcHBsaWNhYmxlIHRv\n" + - "IGFsbCBvdXIgcHJvZHVjdHMgYW5kIHNlcnZpY2VzLjBDBgNVHR8EPDA6MDigNqA0\n" + - "hjJodHRwOi8vc2VydmljZS5kaWdpbm90YXIubmwvY3JsL3Jvb3QvbGF0ZXN0Q1JM\n" + - "LmNybDAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFN8zwK+S/jf8ttgWFtDZsZHV\n" + - "+m6lMA0GCSqGSIb3DQEBBQUAA4ICAQCfV1rmBd9QStEyQ40lT0tqby0/3ez0STuJ\n" + - "ESBQLQD56XYdb4VFSuqA6xTtiuSVHLoiv2xyISN9FvX3A5VtifkJ00JEaLQJiSsE\n" + - "wGDkYGl1DT7SsqtAVKdMAuCM+e0j0/RV3hZ6kcrM7/wFccHwM+/TiurR9lgZDzB4\n" + - "a7++A4XrYyKx9vc9ZwBEnD1nrAe7++gg9cuZgP7e+QL0FBHMjpw+gnCDjr2dzBZC\n" + - "4r+b8SOqlbPRPexBuNghlc7PfcPIyFis2LJXDRMWiAd3TcfdALwRsuKMR/T+cwyr\n" + - "asy69OEGHplLT57otQ524BDctDXNzlH9bHEh52QzqkWvIDqs42910IUy1nYNPIUG\n" + - "yYJV/T7H8Jb6vfMZWe47iUFvtNZCi8+b542gRUwdi+ca+hGviBC9Qr4Wv1pl7CBQ\n" + - "Hy1axTkHiQawUo/hgmoetCpftugl9yJTfvsBorUV1ZMxn9B1JLSGtWnbUsFRla7G\n" + - "fNa0IsUkzmmha8XCzvNu0d1PDGtcQyUqmDOE1Hx4cIBeuF8ipuIXkrVCr9zAZ4ZC\n" + - "hgz6aA1gDTW8whSRJqYEYEQ0pcMEFLyXE+Nz3O8NinO2AuxqKhjMk13203xA7lPY\n" + - "MnBQ0v7S3qqbp/pvPMiUhOz/VaYted6QmOY5EATBnFiLCuw87JXoAyp382eJ3WX1\n" + - "hOiR4IX9Tg==\n" + - "-----END CERTIFICATE-----"; - - // The fraudulent certificate issued by above compromised CA - static String targetCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIFKDCCBBCgAwIBAgIQBeLmpM0J6lTWZbB1/iKiVjANBgkqhkiG9w0BAQUFADBm\n" + - "MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMSEwHwYDVQQDExhEaWdp\n" + - "Tm90YXIgUHVibGljIENBIDIwMjUxIDAeBgkqhkiG9w0BCQEWEWluZm9AZGlnaW5v\n" + - "dGFyLm5sMB4XDTExMDcxMDE5MDYzMFoXDTEzMDcwOTE5MDYzMFowajELMAkGA1UE\n" + - "BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxFjAUBgNVBAcTDU1vdW50YWluIFZp\n" + - "ZXcxFzAVBgNVBAUTDlBLMDAwMjI5MjAwMDAyMRUwEwYDVQQDEwwqLmdvb2dsZS5j\n" + - "b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNbeKubCV0aCxhOiOS\n" + - "CSQ/w9HXTYuD5BLKuiqXNw3setdTymeJz2L8aWOHo3nicFNDVwWTgwWomGNr2J6Q\n" + - "7g1iINNSW0rR4E1l2szRkcnAY6c6i/Eke93nF4i2hDsnIBveolF5yjpuRm73uQQD\n" + - "ulHjA3BFRF/PTi0fw2/Yt+8ieoMuNcMWN6Eou5Gqt5YZkWv176ofeCbsBmMrP87x\n" + - "OhhtTDckCapk4VQZG2XrfzZcV6tdzCp5TI8uHdu17cdzXm1imZ8tyvzFeiCEOQN8\n" + - "vPNzB/fIr3CJQ5q4uM5aKT3DD5PeVzf4rfJKQNgCTWiIBc9XcWEUuszwAsnmg7e2\n" + - "EJRdAgMBAAGjggHMMIIByDA6BggrBgEFBQcBAQQuMCwwKgYIKwYBBQUHMAGGHmh0\n" + - "dHA6Ly92YWxpZGF0aW9uLmRpZ2lub3Rhci5ubDAfBgNVHSMEGDAWgBTfM8Cvkv43\n" + - "/LbYFhbQ2bGR1fpupTAJBgNVHRMEAjAAMIHGBgNVHSAEgb4wgbswgbgGDmCEEAGH\n" + - "aQEBAQIEAQICMIGlMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2lub3Rhci5u\n" + - "bC9jcHMwegYIKwYBBQUHAgIwbhpsQ29uZGl0aW9ucywgYXMgbWVudGlvbmVkIG9u\n" + - "IG91ciB3ZWJzaXRlICh3d3cuZGlnaW5vdGFyLm5sKSwgYXJlIGFwcGxpY2FibGUg\n" + - "dG8gYWxsIG91ciBwcm9kdWN0cyBhbmQgc2VydmljZXMuMEkGA1UdHwRCMEAwPqA8\n" + - "oDqGOGh0dHA6Ly9zZXJ2aWNlLmRpZ2lub3Rhci5ubC9jcmwvcHVibGljMjAyNS9s\n" + - "YXRlc3RDUkwuY3JsMA4GA1UdDwEB/wQEAwIEsDAbBgNVHREEFDASgRBhZG1pbkBn\n" + - "b29nbGUuY29tMB0GA1UdDgQWBBQHSn0WJzIo0eMBMQUNsMqN6eF/7TANBgkqhkiG\n" + - "9w0BAQUFAAOCAQEAAs5dL7N9wzRJkI4Aq4lC5t8j5ZadqnqUcgYLADzSv4ExytNH\n" + - "UY2nH6iVTihC0UPSsILWraoeApdT7Rphz/8DLQEBRGdeKWAptNM3EbiXtQaZT2uB\n" + - "pidL8UoafX0kch3f71Y1scpBEjvu5ZZLnjg0A8AL0tnsereOVdDpU98bKqdbbrnM\n" + - "FRmBlSf7xdaNca6JJHeEpga4E9Ty683CmccrSGXdU2tTCuHEJww+iOAUtPIZcsum\n" + - "U7/eYeY1pMyGLyIjbNgRY7nDzRwvM/BsbL9eh4/mSQj/4nncqJd22sVQpCggQiVK\n" + - "baB2sVGcVNBkK55bT8gPqnx8JypubyUvayzZGg==\n" + - "-----END CERTIFICATE-----"; - - public static void main(String args[]) throws Exception { - - Exception reservedException = null; - try { - build(); - } catch (CertPathBuilderException cpbe) { - reservedException = cpbe; - } - - if (reservedException == null) { - throw new Exception("Unable to block fraudulent certificate"); - } - - System.out.println( - "The expected untrusted cert exception: " + reservedException); - } - - private static X509CertSelector generateSelector() throws Exception { - - // generate certificate from cert strings - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - X509Certificate target = null; - try (ByteArrayInputStream is = - new ByteArrayInputStream(targetCertStr.getBytes())) { - target = (X509Certificate)cf.generateCertificate(is); - } - - X509CertSelector selector = new X509CertSelector(); - selector.setCertificate(target); - selector.setSubject(target.getSubjectX500Principal()); - - return selector; - } - - - private static CertStore generateCertificateStore() throws Exception { - - // generate certificate from cert strings - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - // generate certification path - Set entries = new HashSet(); - - try (ByteArrayInputStream is = - new ByteArrayInputStream(targetCertStr.getBytes())) { - entries.add(cf.generateCertificate(is)); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(intermediateCertStr.getBytes())) { - entries.add(cf.generateCertificate(is)); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(compromisedCertStr.getBytes())) { - entries.add(cf.generateCertificate(is)); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(untrustedCrossCertStr.getBytes())) { - entries.add(cf.generateCertificate(is)); - } - - return CertStore.getInstance("Collection", - new CollectionCertStoreParameters(entries)); - } - - private static Set generateTrustAnchors() - throws CertificateException, IOException { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - Certificate trustedCert = null; - try (ByteArrayInputStream is = - new ByteArrayInputStream(trustedCertStr.getBytes())) { - trustedCert = cf.generateCertificate(is); - } - - // generate a trust anchor - TrustAnchor anchor = - new TrustAnchor((X509Certificate)trustedCert, null); - - return Collections.singleton(anchor); - } - - private static void build() throws Exception { - X509CertSelector selector = generateSelector(); - Set anchors = generateTrustAnchors(); - CertStore certs = generateCertificateStore(); - - SunCertPathBuilderParameters params = - new SunCertPathBuilderParameters(anchors, selector); - params.setBuildForward(false); - params.addCertStore(certs); - params.setRevocationEnabled(false); - params.setDate(new Date(111, 11, 25)); // 2011-12-25 - - CertPathBuilder builder = CertPathBuilder.getInstance("PKIX"); - PKIXCertPathBuilderResult result = - (PKIXCertPathBuilderResult)builder.build(params); - } -} - diff --git a/test/sun/security/provider/certpath/X509CertPath/ValidateCompromised.java b/test/sun/security/provider/certpath/X509CertPath/ValidateCompromised.java deleted file mode 100644 index 42cb005bf58ed7849adf90af5c6e2defe3776ce7..0000000000000000000000000000000000000000 --- a/test/sun/security/provider/certpath/X509CertPath/ValidateCompromised.java +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 7123519 - * @summary Problem with java/classes_security - */ - -import java.net.*; -import java.util.*; -import java.io.*; -import javax.net.ssl.*; -import java.security.KeyStore; -import java.security.cert.*; -import java.security.spec.*; -import java.security.interfaces.*; - -public class ValidateCompromised { - // DigiNotar Root CA, untrusted root certificate - static String trustedCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\n" + - "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\n" + - "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\n" + - "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\n" + - "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1\n" + - "MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE\n" + - "ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j\n" + - "b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF\n" + - "bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg\n" + - "U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA\n" + - "A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/\n" + - "I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3\n" + - "wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC\n" + - "AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb\n" + - "oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5\n" + - "BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p\n" + - "dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk\n" + - "MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp\n" + - "b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu\n" + - "dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0\n" + - "MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi\n" + - "E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa\n" + - "MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI\n" + - "hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN\n" + - "95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd\n" + - "2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=\n" + - "-----END CERTIFICATE-----"; - - // DigiNotar Root CA, untrusted cross-certificate - static String untrustedCrossCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIFSDCCBLGgAwIBAgIERpwsrzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\n" + - "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\n" + - "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\n" + - "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\n" + - "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzA3\n" + - "MjYxNTU3MzlaFw0xMzA4MjYxNjI3MzlaMF8xCzAJBgNVBAYTAk5MMRIwEAYDVQQK\n" + - "EwlEaWdpTm90YXIxGjAYBgNVBAMTEURpZ2lOb3RhciBSb290IENBMSAwHgYJKoZI\n" + - "hvcNAQkBFhFpbmZvQGRpZ2lub3Rhci5ubDCCAiIwDQYJKoZIhvcNAQEBBQADggIP\n" + - "ADCCAgoCggIBAKywWMEAvdghCAsrmv5uVjAFnxt3kBBBXMMNhxF3joHxynzpjGrt\n" + - "OHQ1u9rf+bvACTe0lnOBfTMamDn3k2+Vfz25sXWHulFI6ItwPpUExdi2wxbZiLCx\n" + - "hx1w2oa0DxSLes8Q0XQ2ohJ7d4ZKeeZ73wIRaKVOhq40WJskE3hWIiUeAYtLUXH7\n" + - "gsxZlmmIWmhTxbkNAjfLS7xmSpB+KgsFB+0WX1WQddhGyRuD4gi+8SPMmR3WKg+D\n" + - "IBVYJ4Iu+uIiwkmxuQGBap1tnUB3aHZOISpthECFTnaZfILz87cCWdQmARuO361T\n" + - "BtGuGN3isjrL14g4jqxbKbkZ05j5GAPPSIKGZgsbaQ/J6ziIeiYaBUyS1yTUlvKs\n" + - "Ui2jR9VS9j/+zoQGcKaqPqLytlY0GFei5IFt58rwatPHkWsCg0F8Fe9rmmRe49A8\n" + - "5bHre12G+8vmd0nNo2Xc97mcuOQLX5PPzDAaMhzOHGOVpfnq4XSLnukrqTB7oBgf\n" + - "DhgL5Vup09FsHgdnj5FLqYq80maqkwGIspH6MVzVpsFSCAnNCmOi0yKm6KHZOQaX\n" + - "9W6NApCMFHs/gM0bnLrEWHIjr7ZWn8Z6QjMpBz+CyeYfBQ3NTCg2i9PIPhzGiO9e\n" + - "7olk6R3r2ol+MqZp0d3MiJ/R0MlmIdwGZ8WUepptYkx9zOBkgLKeR46jAgMBAAGj\n" + - "ggEmMIIBIjASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMB\n" + - "BggrBgEFBQcDAgYIKwYBBQUHAwQwEQYDVR0gBAowCDAGBgRVHSAAMDMGCCsGAQUF\n" + - "BwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYD\n" + - "VR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5lbnRydXN0Lm5ldC9zZXJ2ZXIxLmNy\n" + - "bDAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wCwYDVR0PBAQDAgEGMB8G\n" + - "A1UdIwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMBkGCSqGSIb2fQdBAAQMMAob\n" + - "BFY3LjEDAgCBMA0GCSqGSIb3DQEBBQUAA4GBAEa6RcDNcEIGUlkDJUY/pWTds4zh\n" + - "xbVkp3wSmpwPFhx5fxTyF4HD2L60jl3aqjTB7gPpsL2Pk5QZlNsi3t4UkCV70UOd\n" + - "ueJRN3o/LOtk4+bjXY2lC0qTHbN80VMLqPjmaf9ghSA9hwhskdtMgRsgfd90q5QP\n" + - "ZFdYf+hthc3m6IcJ\n" + - "-----END CERTIFICATE-----"; - - // DigiNotar Root CA, compromised certificate - static String compromisedCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBf\n" + - "MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdp\n" + - "Tm90YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmww\n" + - "HhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgxOTIxWjBfMQswCQYDVQQGEwJOTDES\n" + - "MBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEg\n" + - "MB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3DQEB\n" + - "AQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B\n" + - "8cp86Yxq7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXY\n" + - "tsMW2YiwsYcdcNqGtA8Ui3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIl\n" + - "HgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8ZkqQfioLBQftFl9VkHXYRskbg+IIvvEj\n" + - "zJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEqbYRAhU52mXyC8/O3AlnU\n" + - "JgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4iHomGgVM\n" + - "ktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXv\n" + - "a5pkXuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57p\n" + - "K6kwe6AYHw4YC+VbqdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMi\n" + - "puih2TkGl/VujQKQjBR7P4DNG5y6xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovT\n" + - "yD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHcBmfFlHqabWJMfczgZICynkeO\n" + - "owIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV\n" + - "HQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC\n" + - "jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXy\n" + - "fJ9oHbtdzno5wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBo\n" + - "Y6pFITlIYXg23PFDk9Qlx/KAZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHo\n" + - "M/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedTFLJgQT2EkTFoPSdE2+Xe9PpjRchM\n" + - "Ppj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKfyvBovWsdst+Nbwed\n" + - "2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoAZbwH\n" + - "/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQl\n" + - "nQ7KN+ZQ/YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jE\n" + - "O1hZibCMjFCz2IbLaKPECudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU\n" + - "9jQZjHkJNsphFyUXC4KYcwx3dMPVDceoEkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9\n" + - "j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr\n" + - "-----END CERTIFICATE-----"; - - // DigiNotar Public CA 2025, intermediate certificate - static String intermediateCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIGAzCCA+ugAwIBAgIQHn16Uz1FMEGWQA9xSB9FBDANBgkqhkiG9w0BAQUFADBf\n" + - "MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdp\n" + - "Tm90YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmww\n" + - "HhcNMDYwMjA2MTYwNzAyWhcNMjUwMzI4MTYwNzAyWjBmMQswCQYDVQQGEwJOTDES\n" + - "MBAGA1UEChMJRGlnaU5vdGFyMSEwHwYDVQQDExhEaWdpTm90YXIgUHVibGljIENB\n" + - "IDIwMjUxIDAeBgkqhkiG9w0BCQEWEWluZm9AZGlnaW5vdGFyLm5sMIIBIjANBgkq\n" + - "hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs/2eu/I5fMG8lbvPph3e8zfJpZQtg/72\n" + - "Yx29+ivtKehiF6A3n785XyoY6IT3vlCrhy1CbMOY3M0x1n4YQlv17B0XZ/DqHyBA\n" + - "SQvnDNbkM9j4NoSy/sRtGsP6PetIFFjrhE9whZuvuSUC1PY4PruEEJp8zOCx4+wU\n" + - "Zt9xvjy4Xra+bSia5rwccQ/R5FYTGKrYCthOy9C9ud5Fhd++rlVhgdA/78w+Cs2s\n" + - "xS4i0MAxG75P3/e/bATJKepbydHdDjkyz9o3RW/wdPUXhzEw4EwUjYg6XJrDzMad\n" + - "6aL9M/eaxDjgz6o48EaWRDrGptaE2uJRuErVz7oOO0p/wYKq/BU+/wIDAQABo4IB\n" + - "sjCCAa4wOgYIKwYBBQUHAQEELjAsMCoGCCsGAQUFBzABhh5odHRwOi8vdmFsaWRh\n" + - "dGlvbi5kaWdpbm90YXIubmwwHwYDVR0jBBgwFoAUiGi/4I41xDs4a2L3KDuEgcgM\n" + - "100wEgYDVR0TAQH/BAgwBgEB/wIBADCBxgYDVR0gBIG+MIG7MIG4Bg5ghBABh2kB\n" + - "AQEBBQIGBDCBpTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpbm90YXIubmwv\n" + - "Y3BzMHoGCCsGAQUFBwICMG4abENvbmRpdGlvbnMsIGFzIG1lbnRpb25lZCBvbiBv\n" + - "dXIgd2Vic2l0ZSAod3d3LmRpZ2lub3Rhci5ubCksIGFyZSBhcHBsaWNhYmxlIHRv\n" + - "IGFsbCBvdXIgcHJvZHVjdHMgYW5kIHNlcnZpY2VzLjBDBgNVHR8EPDA6MDigNqA0\n" + - "hjJodHRwOi8vc2VydmljZS5kaWdpbm90YXIubmwvY3JsL3Jvb3QvbGF0ZXN0Q1JM\n" + - "LmNybDAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFN8zwK+S/jf8ttgWFtDZsZHV\n" + - "+m6lMA0GCSqGSIb3DQEBBQUAA4ICAQCfV1rmBd9QStEyQ40lT0tqby0/3ez0STuJ\n" + - "ESBQLQD56XYdb4VFSuqA6xTtiuSVHLoiv2xyISN9FvX3A5VtifkJ00JEaLQJiSsE\n" + - "wGDkYGl1DT7SsqtAVKdMAuCM+e0j0/RV3hZ6kcrM7/wFccHwM+/TiurR9lgZDzB4\n" + - "a7++A4XrYyKx9vc9ZwBEnD1nrAe7++gg9cuZgP7e+QL0FBHMjpw+gnCDjr2dzBZC\n" + - "4r+b8SOqlbPRPexBuNghlc7PfcPIyFis2LJXDRMWiAd3TcfdALwRsuKMR/T+cwyr\n" + - "asy69OEGHplLT57otQ524BDctDXNzlH9bHEh52QzqkWvIDqs42910IUy1nYNPIUG\n" + - "yYJV/T7H8Jb6vfMZWe47iUFvtNZCi8+b542gRUwdi+ca+hGviBC9Qr4Wv1pl7CBQ\n" + - "Hy1axTkHiQawUo/hgmoetCpftugl9yJTfvsBorUV1ZMxn9B1JLSGtWnbUsFRla7G\n" + - "fNa0IsUkzmmha8XCzvNu0d1PDGtcQyUqmDOE1Hx4cIBeuF8ipuIXkrVCr9zAZ4ZC\n" + - "hgz6aA1gDTW8whSRJqYEYEQ0pcMEFLyXE+Nz3O8NinO2AuxqKhjMk13203xA7lPY\n" + - "MnBQ0v7S3qqbp/pvPMiUhOz/VaYted6QmOY5EATBnFiLCuw87JXoAyp382eJ3WX1\n" + - "hOiR4IX9Tg==\n" + - "-----END CERTIFICATE-----"; - - // The fraudulent certificate issued by above compromised CA - static String targetCertStr = - "-----BEGIN CERTIFICATE-----\n" + - "MIIFKDCCBBCgAwIBAgIQBeLmpM0J6lTWZbB1/iKiVjANBgkqhkiG9w0BAQUFADBm\n" + - "MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMSEwHwYDVQQDExhEaWdp\n" + - "Tm90YXIgUHVibGljIENBIDIwMjUxIDAeBgkqhkiG9w0BCQEWEWluZm9AZGlnaW5v\n" + - "dGFyLm5sMB4XDTExMDcxMDE5MDYzMFoXDTEzMDcwOTE5MDYzMFowajELMAkGA1UE\n" + - "BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxFjAUBgNVBAcTDU1vdW50YWluIFZp\n" + - "ZXcxFzAVBgNVBAUTDlBLMDAwMjI5MjAwMDAyMRUwEwYDVQQDEwwqLmdvb2dsZS5j\n" + - "b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNbeKubCV0aCxhOiOS\n" + - "CSQ/w9HXTYuD5BLKuiqXNw3setdTymeJz2L8aWOHo3nicFNDVwWTgwWomGNr2J6Q\n" + - "7g1iINNSW0rR4E1l2szRkcnAY6c6i/Eke93nF4i2hDsnIBveolF5yjpuRm73uQQD\n" + - "ulHjA3BFRF/PTi0fw2/Yt+8ieoMuNcMWN6Eou5Gqt5YZkWv176ofeCbsBmMrP87x\n" + - "OhhtTDckCapk4VQZG2XrfzZcV6tdzCp5TI8uHdu17cdzXm1imZ8tyvzFeiCEOQN8\n" + - "vPNzB/fIr3CJQ5q4uM5aKT3DD5PeVzf4rfJKQNgCTWiIBc9XcWEUuszwAsnmg7e2\n" + - "EJRdAgMBAAGjggHMMIIByDA6BggrBgEFBQcBAQQuMCwwKgYIKwYBBQUHMAGGHmh0\n" + - "dHA6Ly92YWxpZGF0aW9uLmRpZ2lub3Rhci5ubDAfBgNVHSMEGDAWgBTfM8Cvkv43\n" + - "/LbYFhbQ2bGR1fpupTAJBgNVHRMEAjAAMIHGBgNVHSAEgb4wgbswgbgGDmCEEAGH\n" + - "aQEBAQIEAQICMIGlMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2lub3Rhci5u\n" + - "bC9jcHMwegYIKwYBBQUHAgIwbhpsQ29uZGl0aW9ucywgYXMgbWVudGlvbmVkIG9u\n" + - "IG91ciB3ZWJzaXRlICh3d3cuZGlnaW5vdGFyLm5sKSwgYXJlIGFwcGxpY2FibGUg\n" + - "dG8gYWxsIG91ciBwcm9kdWN0cyBhbmQgc2VydmljZXMuMEkGA1UdHwRCMEAwPqA8\n" + - "oDqGOGh0dHA6Ly9zZXJ2aWNlLmRpZ2lub3Rhci5ubC9jcmwvcHVibGljMjAyNS9s\n" + - "YXRlc3RDUkwuY3JsMA4GA1UdDwEB/wQEAwIEsDAbBgNVHREEFDASgRBhZG1pbkBn\n" + - "b29nbGUuY29tMB0GA1UdDgQWBBQHSn0WJzIo0eMBMQUNsMqN6eF/7TANBgkqhkiG\n" + - "9w0BAQUFAAOCAQEAAs5dL7N9wzRJkI4Aq4lC5t8j5ZadqnqUcgYLADzSv4ExytNH\n" + - "UY2nH6iVTihC0UPSsILWraoeApdT7Rphz/8DLQEBRGdeKWAptNM3EbiXtQaZT2uB\n" + - "pidL8UoafX0kch3f71Y1scpBEjvu5ZZLnjg0A8AL0tnsereOVdDpU98bKqdbbrnM\n" + - "FRmBlSf7xdaNca6JJHeEpga4E9Ty683CmccrSGXdU2tTCuHEJww+iOAUtPIZcsum\n" + - "U7/eYeY1pMyGLyIjbNgRY7nDzRwvM/BsbL9eh4/mSQj/4nncqJd22sVQpCggQiVK\n" + - "baB2sVGcVNBkK55bT8gPqnx8JypubyUvayzZGg==\n" + - "-----END CERTIFICATE-----"; - - public static void main(String args[]) throws Exception { - - Exception reservedException = null; - try { - validate(); - } catch (CertPathValidatorException cpve) { - reservedException = cpve; - } - - if (reservedException == null) { - throw new Exception("Unable to block fraudulent certificate"); - } - - System.out.println( - "The expected untrusted cert exception: " + reservedException); - } - - private static CertPath generateCertificatePath() - throws CertificateException, IOException { - - // generate certificate from cert strings - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - // generate certification path - List list = new ArrayList(); - - try (ByteArrayInputStream is = - new ByteArrayInputStream(targetCertStr.getBytes())) { - list.add(cf.generateCertificate(is)); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(intermediateCertStr.getBytes())) { - list.add(cf.generateCertificate(is)); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(compromisedCertStr.getBytes())) { - list.add(cf.generateCertificate(is)); - } - - try (ByteArrayInputStream is = - new ByteArrayInputStream(untrustedCrossCertStr.getBytes())) { - list.add(cf.generateCertificate(is)); - } - - return cf.generateCertPath(list); - } - - private static Set generateTrustAnchors() - throws CertificateException, IOException { - // generate certificate from cert string - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - - Certificate trustedCert = null; - try (ByteArrayInputStream is = - new ByteArrayInputStream(trustedCertStr.getBytes())) { - trustedCert = cf.generateCertificate(is); - } - - // generate a trust anchor - TrustAnchor anchor = - new TrustAnchor((X509Certificate)trustedCert, null); - - return Collections.singleton(anchor); - } - - private static void validate() - throws CertPathValidatorException, Exception { - - CertPath path = generateCertificatePath(); - Set anchors = generateTrustAnchors(); - - PKIXParameters params = new PKIXParameters(anchors); - - // disable certificate revocation checking - params.setRevocationEnabled(false); - - // set the validation time - params.setDate(new Date(111, 11, 25)); // 2011-12-25 - - CertPathValidator validator = CertPathValidator.getInstance("PKIX"); - - validator.validate(path, params); - } -} -