OpenJDK / bsd-port / jdk9 / jdk
changeset 10846:cdcf2e599e42 jdk9-b36
Merge
author | lana |
---|---|
date | Thu, 16 Oct 2014 14:14:57 -0700 |
parents | d0a14815b48b 882f47790152 |
children | c8efbf0a974b a0ee740e01a5 |
files | test/java/security/cert/CertificateFactory/invalidEncodedCerts/invalidcert.pem test/javax/xml/jaxp/testng/validation/8037819/BaseTest.java test/javax/xml/jaxp/testng/validation/8037819/BasicTest.java test/javax/xml/jaxp/testng/validation/8037819/FixedAttrTest.java test/javax/xml/jaxp/testng/validation/8037819/IdIdrefCheckingTest.java test/javax/xml/jaxp/testng/validation/8037819/IdentityConstraintCheckingTest.java test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_A_A.java test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_A_C.java test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_C_A.java test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_C_AC.java test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_C_C.java test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_C_CA.java test/javax/xml/jaxp/testng/validation/8037819/RootTypeDefinitionTest.java test/javax/xml/jaxp/testng/validation/8037819/SpecialCaseErrorHandler.java test/javax/xml/jaxp/testng/validation/8037819/TEST.properties test/javax/xml/jaxp/testng/validation/8037819/UnparsedEntityCheckingTest.java test/javax/xml/jaxp/testng/validation/8037819/UseGrammarPoolOnlyTest_False.java test/javax/xml/jaxp/testng/validation/8037819/UseGrammarPoolOnlyTest_True.java test/javax/xml/jaxp/testng/validation/8037819/base.xml test/javax/xml/jaxp/testng/validation/8037819/base.xsd test/javax/xml/jaxp/testng/validation/8037819/fixedAttr.xml test/javax/xml/jaxp/testng/validation/8037819/idIdref.xml test/javax/xml/jaxp/testng/validation/8037819/idc.xml test/javax/xml/jaxp/testng/validation/8037819/idc.xsd test/javax/xml/jaxp/testng/validation/8037819/otherNamespace.xml test/javax/xml/jaxp/testng/validation/8037819/otherNamespace.xsd test/javax/xml/jaxp/testng/validation/8037819/unparsedEntity.dtd test/javax/xml/jaxp/testng/validation/8037819/unparsedEntity.xml test/javax/xml/jaxp/testng/validation/8037819/xsitype_A_A.xml test/javax/xml/jaxp/testng/validation/8037819/xsitype_A_C.xml test/javax/xml/jaxp/testng/validation/8037819/xsitype_C_A.xml test/javax/xml/jaxp/testng/validation/8037819/xsitype_C_AC.xml test/javax/xml/jaxp/testng/validation/8037819/xsitype_C_C.xml test/javax/xml/jaxp/testng/validation/8037819/xsitype_C_CA.xml test/tools/jar/normalize/TestNormal.java |
diffstat | 207 files changed, 7896 insertions(+), 3726 deletions(-) [+] |
line wrap: on
line diff
--- a/make/gensrc/Gensrc-java.base.gmk Thu Oct 16 12:02:05 2014 -0700 +++ b/make/gensrc/Gensrc-java.base.gmk Thu Oct 16 14:14:57 2014 -0700 @@ -25,10 +25,6 @@ include GensrcCommon.gmk -# TODO: maybe split into separate modules? -include GensrcProperties.gmk -GENSRC_JAVA_BASE += $(GENSRC_PROPERTIES) - include GensrcLocaleData.gmk include GensrcCharacterData.gmk include GensrcMisc.gmk @@ -37,6 +33,34 @@ include GensrcBuffer.gmk include GensrcExceptions.gmk +################################################################################ + +include GensrcProperties.gmk + +$(eval $(call SetupCompileProperties,LIST_RESOURCE_BUNDLE, \ + $(filter %.properties, \ + $(call CacheFind, $(JDK_TOPDIR)/src/java.base/share/classes/sun/launcher/resources)), \ + ListResourceBundle)) + +$(eval $(call SetupCompileProperties,SUN_UTIL, \ + $(filter %.properties, \ + $(call CacheFind, $(JDK_TOPDIR)/src/java.base/share/classes/sun/util/resources)), \ + sun.util.resources.LocaleNamesBundle)) + +GENSRC_JAVA_BASE += $(LIST_RESOURCE_BUNDLE) $(SUN_UTIL) + +# Some resources bundles are already present as java files but still need to be +# copied to zh_HK locale. +$(eval $(call SetupCopy-zh_HK,COPY_ZH_HK, \ + $(addprefix $(JDK_TOPDIR)/src/java.base/share/classes/, \ + sun/misc/resources/Messages_zh_TW.java \ + sun/security/util/AuthResources_zh_TW.java \ + sun/security/util/Resources_zh_TW.java))) + +GENSRC_JAVA_BASE += $(COPY_ZH_HK) + +################################################################################ + java.base: $(GENSRC_JAVA_BASE) all: java.base
--- a/make/gensrc/Gensrc-java.desktop.gmk Thu Oct 16 12:02:05 2014 -0700 +++ b/make/gensrc/Gensrc-java.desktop.gmk Thu Oct 16 14:14:57 2014 -0700 @@ -38,6 +38,48 @@ include GensrcSwing.gmk +################################################################################ + +include GensrcProperties.gmk + +PROP_SRC_DIRS := \ + $(JDK_TOPDIR)/src/java.desktop/share/classes/sun/awt/resources \ + $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/accessibility/internal/resources \ + $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/resources \ + $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/resources \ + $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/basic/resources \ + $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/metal/resources \ + $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/synth/resources \ + $(JDK_TOPDIR)/src/java.desktop/share/classes/sun/print/resources \ + # + +ifeq ($(OPENJDK_TARGET_OS), macosx) + PROP_SRC_DIRS += \ + $(JDK_TOPDIR)/src/java.desktop/macosx/classes/com/apple/laf/resources \ + $(JDK_TOPDIR)/src/java.desktop/macosx/classes/sun/awt/resources \ + # +endif + +ifeq ($(OPENJDK_TARGET_OS), windows) + PROP_SRC_DIRS += $(JDK_TOPDIR)/src/java.desktop/windows/classes/sun/awt/windows +else + PROP_SRC_DIRS += $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/resources +endif + +$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \ + $(filter %.properties, $(call CacheFind, $(PROP_SRC_DIRS))), ListResourceBundle)) + +GENSRC_JAVA_DESKTOP += $(COMPILE_PROPERTIES) + +# Some resources bundles are already present as java files but still need to be +# copied to zh_HK locale. +$(eval $(call SetupCopy-zh_HK,COPY_ZH_HK, \ + $(JDK_TOPDIR)/src/java.desktop/share/classes/sun/applet/resources/MsgAppletViewer_zh_TW.java)) + +GENSRC_JAVA_DESKTOP += $(COPY_ZH_HK) + +################################################################################ + java.desktop: $(GENSRC_JAVA_DESKTOP) all: java.desktop
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/gensrc/Gensrc-java.logging.gmk Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,43 @@ +# +# Copyright (c) 2014, 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. +# + +include GensrcCommon.gmk + +################################################################################ + +include GensrcProperties.gmk + +$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \ + $(filter %.properties, \ + $(call CacheFind, $(JDK_TOPDIR)/src/java.logging/share/classes/sun/util/logging/resources)), \ + ListResourceBundle)) + +TARGETS += $(COMPILE_PROPERTIES) + +################################################################################ + +all: $(TARGETS) + +.PHONY: all
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/gensrc/Gensrc-java.management.gmk Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,43 @@ +# +# 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 +# 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. +# + +include GensrcCommon.gmk + +################################################################################ + +include GensrcProperties.gmk + +$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \ + $(filter %.properties, \ + $(call CacheFind, $(JDK_TOPDIR)/src/java.management/share/classes/sun/management/resources)), \ + ListResourceBundle)) + +TARGETS += $(COMPILE_PROPERTIES) + +################################################################################ + +all: $(TARGETS) + +.PHONY: all
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/gensrc/Gensrc-jdk.dev.gmk Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,43 @@ +# +# Copyright (c) 2014, 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. +# + +include GensrcCommon.gmk + +################################################################################ + +include GensrcProperties.gmk + +$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \ + $(filter %.properties, \ + $(call CacheFind, $(JDK_TOPDIR)/src/jdk.dev/share/classes/sun/tools/jar/resources)), \ + ListResourceBundle)) + +TARGETS += $(COMPILE_PROPERTIES) + +################################################################################ + +all: $(TARGETS) + +.PHONY: all
--- a/make/gensrc/Gensrc-jdk.jdi.gmk Thu Oct 16 12:02:05 2014 -0700 +++ b/make/gensrc/Gensrc-jdk.jdi.gmk Thu Oct 16 14:14:57 2014 -0700 @@ -69,6 +69,17 @@ ################################################################################ +include GensrcProperties.gmk + +$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \ + $(filter %.properties, \ + $(call CacheFind, $(JDK_TOPDIR)/src/jdk.jdi/share/classes/com/sun/tools/jdi/resources)), \ + ListResourceBundle)) + +GENSRC_JDK_JDI += $(COMPILE_PROPERTIES) + +################################################################################ + jdk.jdi: $(GENSRC_JDK_JDI) all: jdk.jdi
--- a/make/gensrc/Gensrc-jdk.localedata.gmk Thu Oct 16 12:02:05 2014 -0700 +++ b/make/gensrc/Gensrc-jdk.localedata.gmk Thu Oct 16 14:14:57 2014 -0700 @@ -31,6 +31,20 @@ include GensrcLocaleData.gmk include GensrcCLDR.gmk +################################################################################ + +include GensrcProperties.gmk + +$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \ + $(filter %.properties, \ + $(call CacheFind, $(JDK_TOPDIR)/src/jdk.localedata/share/classes/sun/util/resources)), \ + sun.util.resources.LocaleNamesBundle)) + +# Skip generating zh_HK from zh_TW for this module. +GENSRC_JDK_LOCALEDATA += $(filter-out %_zh_HK.java, $(COMPILE_PROPERTIES)) + +################################################################################ + jdk.localedata: $(GENSRC_JDK_LOCALEDATA) all: jdk.localedata
--- a/make/gensrc/GensrcProperties.gmk Thu Oct 16 12:02:05 2014 -0700 +++ b/make/gensrc/GensrcProperties.gmk Thu Oct 16 14:14:57 2014 -0700 @@ -23,132 +23,81 @@ # questions. # -# All .properties files to be compiled are appended to this variable. -ALL_COMPILED_PROPSOURCES := -# All generated .java files from compilation are appended to this variable. -ALL_COMPILED_PROPJAVAS := -# The (very long) command line for compilation, stored in a file, prior to use. -COMPILE_PROPCMDLINE := +# This file defines macros that sets up rules for generating java classes +# from resource bundle properties files. -define add_properties_to_compile - # $1 is the name of the properties group - # $2 is the files belonging to this group - # $3 is the super class for the generated java file. +################################################################################ +# Helper macro for SetupCopy-zh_HK. +define SetupOneCopy-zh_HK + $1_$2_TARGET := $$(patsubst $(JDK_TOPDIR)/src/$(MODULE)/share/classes/%, \ + $(JDK_OUTPUTDIR)/gensrc/$(MODULE)/%, \ + $$(subst _zh_TW,_zh_HK, $2)) - # Convert <root>/jdk/src/<module>/share/classes/sun/util/resources/CurrencyNames_sv.properties - # to <build>/jdk/gensrc/<module/sun/util/resources/CurrencyNames_sv.java - $1_PROPJAVAS := $$(patsubst $(JDK_TOPDIR)/src/%.properties, \ - $(JDK_OUTPUTDIR)/gensrc/%.java, \ - $$(subst /share/classes,, \ - $$(subst /$(OPENJDK_TARGET_OS_API_DIR)/classes,, \ - $$(subst /$(OPENJDK_TARGET_OS)/classes,, $2)))) + $$($1_$2_TARGET): $2 + $(MKDIR) -p $$(@D) + $(CAT) $$< | $(SED) -e '/class/s/_zh_TW/_zh_HK/' > $$@ - # Accumulate all found properties files. - ALL_COMPILED_PROPSOURCES += $2 - - # Generate the list of to be created java files. - ALL_COMPILED_PROPJAVAS += $$($1_PROPJAVAS) - - # Now generate a sequence of - # "-compile ...CurrencyNames_sv.properties ...CurrencyNames_sv.java ListResourceBundle" - # suitable to be fed into the CompileProperties command. - COMPILE_PROPCMDLINE += $$(subst _SPACE_,$(SPACE),$$(join $$(addprefix -compile_SPACE_, $2), \ - $$(addsuffix _SPACE_$(strip $3), \ - $$(addprefix _SPACE_, $$($1_PROPJAVAS))))) + $1 += $$($1_$2_TARGET) endef ################################################################################ -# Some packages have properties that need to be converted to java source files. -COMPILE_PROP_SRC_FILES := \ - $(filter %.properties, $(call CacheFind, \ - $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/accessibility/internal/resources \ - $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/resources \ - $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/resources \ - $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/basic/resources \ - $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/metal/resources \ - $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/synth/resources \ - $(JDK_TOPDIR)/src/jdk.jdi/share/classes/com/sun/tools/jdi/resources \ - $(JDK_TOPDIR)/src/java.desktop/share/classes/sun/awt/resources \ - $(JDK_TOPDIR)/src/java.base/share/classes/sun/launcher/resources \ - $(JDK_TOPDIR)/src/java.management/share/classes/sun/management/resources \ - $(JDK_TOPDIR)/src/java.desktop/share/classes/sun/print/resources \ - $(JDK_TOPDIR)/src/jdk.dev/share/classes/sun/tools/jar/resources \ - $(JDK_TOPDIR)/src/java.logging/share/classes/sun/util/logging/resources)) \ - # - -ifeq ($(OPENJDK_TARGET_OS), macosx) - COMPILE_PROP_SRC_FILES += \ - $(filter %.properties, $(call CacheFind, \ - $(JDK_TOPDIR)/src/java.desktop/macosx/classes/com/apple/laf/resources \ - $(JDK_TOPDIR)/src/java.desktop/macosx/classes/sun/awt/resources)) \ - # -endif - -ifeq ($(OPENJDK_TARGET_OS), windows) - COMPILE_PROP_SRC_FILES += \ - $(filter %.properties, $(call CacheFind, \ - $(JDK_TOPDIR)/src/java.desktop/windows/classes/sun/awt/windows)) \ - # -else # ! windows - COMPILE_PROP_SRC_FILES += \ - $(filter %.properties, $(call CacheFind, \ - $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/resources)) \ - # -endif - -$(eval $(call add_properties_to_compile,LIST_RESOURCE_BUNDLE, \ - $(COMPILE_PROP_SRC_FILES), ListResourceBundle)) - -# sun/util/resources -$(eval $(call add_properties_to_compile,SUN_UTIL, \ - $(filter %.properties, \ - $(call CacheFind, $(JDK_TOPDIR)/src/java.base/share/classes/sun/util/resources) \ - $(call CacheFind, $(JDK_TOPDIR)/src/jdk.localedata/share/classes/sun/util/resources)), \ - sun.util.resources.LocaleNamesBundle)) +# Creates rules for copying zh_TW resources to zh_HK. +# Param 1 - Variable to add targets to +# Param 2 - Files to copy from +define SetupCopy-zh_HK + $$(foreach f, $2, $$(eval $$(call SetupOneCopy-zh_HK,$1,$$f))) +endef ################################################################################ -# Now setup the rule for the generation of the resource bundles. -$(JDK_OUTPUTDIR)/gensrc/_the.compiled_properties: $(ALL_COMPILED_PROPSOURCES) $(BUILD_TOOLS_JDK) - # Generate all output directories in advance since the build tool does not do that... - $(MKDIR) -p $(sort $(dir $(ALL_COMPILED_PROPJAVAS))) - $(ECHO) Compiling $(words $(ALL_COMPILED_PROPSOURCES)) properties into resource bundles - $(call ListPathsSafely,COMPILE_PROPCMDLINE,\n, >> $(JDK_OUTPUTDIR)/gensrc/_the.cmdline) - $(TOOL_COMPILEPROPERTIES) -quiet @$(JDK_OUTPUTDIR)/gensrc/_the.cmdline - $(TOUCH) $@ +# Creates a rule that runs CompileProperties on a set of properties files. +# Param 1 - Variable to add targets to, must not contain space +# Param 2 - Properties files to process +# Param 3 - The super class for the generated classes +define SetupCompileProperties + $1_SRCS := $2 + $1_CLASS := $3 -$(ALL_COMPILED_PROPJAVAS): $(JDK_OUTPUTDIR)/gensrc/_the.compiled_properties + # Convert .../src/<module>/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties + # to .../langtools/gensrc/<module>/com/sun/tools/javac/resources/javac_zh_CN.java + # Strip away prefix and suffix, leaving for example only: + # "<module>/share/classes/com/sun/tools/javac/resources/javac_zh_CN" + $1_JAVAS := $$(patsubst $(JDK_TOPDIR)/src/%, \ + $(JDK_OUTPUTDIR)/gensrc/%, \ + $$(patsubst %.properties, %.java, \ + $$(subst /share/classes,, $$($1_SRCS)))) + + # Generate the package dirs for the to be generated java files. Sort to remove + # duplicates. + $1_DIRS := $$(sort $$(dir $$($1_JAVAS))) + + # Now generate a sequence of: + # "-compile ...javac_zh_CN.properties ...javac_zh_CN.java java.util.ListResourceBundle" + # suitable to be fed into the CompileProperties command. + $1_CMDLINE := $$(subst _SPACE_, $(SPACE), \ + $$(join $$(addprefix -compile_SPACE_, $$($1_SRCS)), \ + $$(addsuffix _SPACE_$$($1_CLASS), \ + $$(addprefix _SPACE_, $$($1_JAVAS))))) + + $1_TARGET := $(JDK_OUTPUTDIR)/gensrc/$(MODULE)/_the.$1.done + $1_CMDLINE_FILE := $(JDK_OUTPUTDIR)/gensrc/$(MODULE)/_the.$1.cmdline + + # Now setup the rule for the generation of the resource bundles. + $$($1_TARGET): $$($1_SRCS) $$($1_JAVAS) $(BUILD_TOOLS_JDK) + $(MKDIR) -p $$(@D) $$($1_DIRS) + $(ECHO) Compiling $$(words $$($1_SRCS)) properties into resource bundles for $(MODULE) + $(RM) $$($1_CMDLINE_FILE) + $$(call ListPathsSafely,$1_CMDLINE,\n, >> $$($1_CMDLINE_FILE)) + $(TOOL_COMPILEPROPERTIES) -quiet @$$($1_CMDLINE_FILE) + $(TOUCH) $$@ + + $$($1_JAVAS): $$($1_SRCS) + + # Create zh_HK versions of all zh_TW files created above + $$(eval $$(call SetupCopy-zh_HK,$1_HK,$$(filter %_zh_TW.java, $$($1_JAVAS)))) + # The zh_HK copy must wait for the compile properties tool to run + $$($1_HK): $$($1_TARGET) + + $1 += $$($1_JAVAS) $$($1_TARGET) $$($1_HK) +endef ################################################################################ -# Some zh_HK resources are just copies of zh_TW - -define convert_tw_to_hk - $(MKDIR) -p $(@D) - $(CAT) $< | $(SED) -e '/class/s/_zh_TW/_zh_HK/' > $@ -endef - -# Some are copies of existing sources -$(JDK_OUTPUTDIR)/gensrc/java.desktop/%_zh_HK.java: \ - $(JDK_TOPDIR)/src/java.desktop/share/classes/%_zh_TW.java - $(call convert_tw_to_hk) - -$(JDK_OUTPUTDIR)/gensrc/java.base/%_zh_HK.java: \ - $(JDK_TOPDIR)/src/java.base/share/classes/%_zh_TW.java - $(call convert_tw_to_hk) - -# Others are copies of sources generated by this makefile -$(JDK_OUTPUTDIR)/gensrc/%_zh_HK.java: $(JDK_OUTPUTDIR)/gensrc/%_zh_TW.java - $(call convert_tw_to_hk) - -# The existing sources -ZH_HK_JAVA := java.desktop/sun/applet/resources/MsgAppletViewer_zh_HK.java \ - java.base/sun/misc/resources/Messages_zh_HK.java \ - java.base/sun/security/util/AuthResources_zh_HK.java \ - java.base/sun/security/util/Resources_zh_HK.java - -ZH_HK_JAVA_FILES := $(addprefix $(JDK_OUTPUTDIR)/gensrc/, $(ZH_HK_JAVA)) \ - $(filter-out $(JDK_OUTPUTDIR)/gensrc/jdk.localedata/sun/util/resources/zh/%, \ - $(subst _zh_TW,_zh_HK,$(filter %_zh_TW.java, $(ALL_COMPILED_PROPJAVAS)))) - -################################################################################ - -GENSRC_PROPERTIES := $(ALL_COMPILED_PROPJAVAS) $(ZH_HK_JAVA_FILES)
--- a/make/lib/CoreLibraries.gmk Thu Oct 16 12:02:05 2014 -0700 +++ b/make/lib/CoreLibraries.gmk Thu Oct 16 14:14:57 2014 -0700 @@ -224,7 +224,7 @@ $(call SET_SHARED_LIBRARY_ORIGIN) \ $(EXPORT_ZIP_FUNCS), \ LDFLAGS_windows := -export:ZIP_Open -export:ZIP_Close -export:ZIP_FindEntry \ - -export:ZIP_ReadEntry -export:ZIP_GetNextEntry jvm.lib \ + -export:ZIP_ReadEntry -export:ZIP_GetNextEntry -export:ZIP_CRC32 jvm.lib \ $(WIN_JAVA_LIB), \ LDFLAGS_SUFFIX_linux := -ljvm -ljava $(LIBZ), \ LDFLAGS_SUFFIX_solaris := -ljvm -ljava $(LIBZ) -lc, \
--- a/make/mapfiles/libjfr/mapfile-vers Thu Oct 16 12:02:05 2014 -0700 +++ b/make/mapfiles/libjfr/mapfile-vers Thu Oct 16 14:14:57 2014 -0700 @@ -10,8 +10,13 @@ Java_oracle_jrockit_jfr_Process_getpid; Java_oracle_jrockit_jfr_Timing_counterTime; Java_oracle_jrockit_jfr_Timing_init; - Java_oracle_jrockit_jfr_NativeLogger_output0; - Java_oracle_jrockit_jfr_VMJFR_isEnabled; + Java_oracle_jrockit_jfr_Logger_output0; + Java_oracle_jrockit_jfr_JFR_isCommercialFeaturesUnlocked; + Java_oracle_jrockit_jfr_JFR_isStarted; + Java_oracle_jrockit_jfr_JFR_isSupportedInVM; + Java_oracle_jrockit_jfr_JFR_startFlightRecorder; + Java_oracle_jrockit_jfr_JFR_isDisabledOnCommandLine; + Java_oracle_jrockit_jfr_JFR_isEnabled; Java_oracle_jrockit_jfr_VMJFR_options; Java_oracle_jrockit_jfr_VMJFR_init; Java_oracle_jrockit_jfr_VMJFR_addConstPool; @@ -33,7 +38,6 @@ Java_oracle_jrockit_jfr_VMJFR_setPeriod; Java_oracle_jrockit_jfr_VMJFR_getPeriod; Java_oracle_jrockit_jfr_VMJFR_descriptors; - Java_oracle_jrockit_jfr_VMJFR_redefineClass0; Java_oracle_jrockit_jfr_VMJFR_retransformClasses0; JNI_OnLoad; local:
--- a/make/mapfiles/libnet/mapfile-vers Thu Oct 16 12:02:05 2014 -0700 +++ b/make/mapfiles/libnet/mapfile-vers Thu Oct 16 14:14:57 2014 -0700 @@ -28,6 +28,8 @@ SUNWprivate_1.1 { global: JNI_OnLoad; + Java_java_net_AbstractPlainDatagramSocketImpl_init; + Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable; Java_java_net_PlainSocketImpl_socketListen; Java_java_net_PlainDatagramSocketImpl_getTTL; Java_java_net_PlainDatagramSocketImpl_init;
--- a/make/src/classes/build/tools/module/GenModulesList.java Thu Oct 16 12:02:05 2014 -0700 +++ b/make/src/classes/build/tools/module/GenModulesList.java Thu Oct 16 14:14:57 2014 -0700 @@ -112,8 +112,7 @@ } static final List<String> AGGREGATORS = Arrays.asList(new String[] { - "java.se", "java.compact1", "java.compact2", - "java.compact3", "jdk.compact3"}); + "java.se", "java.compact1", "java.compact2", "java.compact3"}); class TopoSorter { final Deque<Module> result = new LinkedList<>();
--- a/src/java.base/share/classes/java/lang/Class.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/lang/Class.java Thu Oct 16 14:14:57 2014 -0700 @@ -262,8 +262,8 @@ @CallerSensitive public static Class<?> forName(String className) throws ClassNotFoundException { - return forName0(className, true, - ClassLoader.getClassLoader(Reflection.getCallerClass())); + Class<?> caller = Reflection.getCallerClass(); + return forName0(className, true, ClassLoader.getClassLoader(caller), caller); } @@ -333,22 +333,27 @@ ClassLoader loader) throws ClassNotFoundException { - if (sun.misc.VM.isSystemDomainLoader(loader)) { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - ClassLoader ccl = ClassLoader.getClassLoader(Reflection.getCallerClass()); + Class<?> caller = null; + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + // Reflective call to get caller class is only needed if a security manager + // is present. Avoid the overhead of making this call otherwise. + caller = Reflection.getCallerClass(); + if (sun.misc.VM.isSystemDomainLoader(loader)) { + ClassLoader ccl = ClassLoader.getClassLoader(caller); if (!sun.misc.VM.isSystemDomainLoader(ccl)) { sm.checkPermission( SecurityConstants.GET_CLASSLOADER_PERMISSION); } } } - return forName0(name, initialize, loader); + return forName0(name, initialize, loader, caller); } - /** Called after security checks have been made. */ + /** Called after security check for system loader access checks have been made. */ private static native Class<?> forName0(String name, boolean initialize, - ClassLoader loader) + ClassLoader loader, + Class<?> caller) throws ClassNotFoundException; /**
--- a/src/java.base/share/classes/java/lang/String.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/lang/String.java Thu Oct 16 14:14:57 2014 -0700 @@ -1045,8 +1045,9 @@ } } // Argument is a String - if (cs.equals(this)) - return true; + if (cs instanceof String) { + return equals(cs); + } // Argument is a generic CharSequence char v1[] = value; int n = v1.length;
--- a/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java Thu Oct 16 14:14:57 2014 -0700 @@ -594,6 +594,9 @@ static class Lazy { private static final Class<?> MHI = MethodHandleImpl.class; + private static final MethodHandle[] ARRAYS; + private static final MethodHandle[] FILL_ARRAYS; + static final NamedFunction NF_checkSpreadArgument; static final NamedFunction NF_guardWithCatch; static final NamedFunction NF_throwException; @@ -606,6 +609,9 @@ static final MethodHandle MH_arrayIdentity; static { + ARRAYS = makeArrays(); + FILL_ARRAYS = makeFillArrays(); + try { NF_checkSpreadArgument = new NamedFunction(MHI.getDeclaredMethod("checkSpreadArgument", Object.class, int.class)); NF_guardWithCatch = new NamedFunction(MHI.getDeclaredMethod("guardWithCatch", MethodHandle.class, Class.class, @@ -1268,7 +1274,6 @@ assert(mhs.size() == 11); // current number of methods return mhs.toArray(new MethodHandle[MAX_ARITY+1]); } - private static final MethodHandle[] ARRAYS = makeArrays(); // filling versions of the above: // using Integer len instead of int len and no varargs to avoid bootstrapping problems @@ -1315,6 +1320,9 @@ Object a4, Object a5, Object a6, Object a7, Object a8, Object a9) { fillWithArguments(a, pos, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); return a; } + + private static final int FILL_ARRAYS_COUNT = 11; // current number of fillArray methods + private static MethodHandle[] makeFillArrays() { ArrayList<MethodHandle> mhs = new ArrayList<>(); mhs.add(null); // there is no empty fill; at least a0 is required @@ -1323,10 +1331,9 @@ if (mh == null) break; mhs.add(mh); } - assert(mhs.size() == 11); // current number of methods + assert(mhs.size() == FILL_ARRAYS_COUNT); return mhs.toArray(new MethodHandle[0]); } - private static final MethodHandle[] FILL_ARRAYS = makeFillArrays(); private static Object copyAsPrimitiveArray(Wrapper w, Object... boxes) { Object a = w.makeArray(boxes.length); @@ -1338,15 +1345,15 @@ * arguments and returns an Object array of them, as if for varargs. */ static MethodHandle varargsArray(int nargs) { - MethodHandle mh = ARRAYS[nargs]; + MethodHandle mh = Lazy.ARRAYS[nargs]; if (mh != null) return mh; mh = findCollector("array", nargs, Object[].class); if (mh != null) mh = makeIntrinsic(mh, Intrinsic.NEW_ARRAY); - if (mh != null) return ARRAYS[nargs] = mh; + if (mh != null) return Lazy.ARRAYS[nargs] = mh; mh = buildVarargsArray(Lazy.MH_fillNewArray, Lazy.MH_arrayIdentity, nargs); assert(assertCorrectArity(mh, nargs)); mh = makeIntrinsic(mh, Intrinsic.NEW_ARRAY); - return ARRAYS[nargs] = mh; + return Lazy.ARRAYS[nargs] = mh; } private static boolean assertCorrectArity(MethodHandle mh, int arity) { @@ -1382,7 +1389,7 @@ return mh; } - private static final int LEFT_ARGS = (FILL_ARRAYS.length - 1); + private static final int LEFT_ARGS = FILL_ARRAYS_COUNT - 1; private static final MethodHandle[] FILL_ARRAY_TO_RIGHT = new MethodHandle[MAX_ARITY+1]; /** fill_array_to_right(N).invoke(a, argL..arg[N-1]) * fills a[L]..a[N-1] with corresponding arguments, @@ -1413,7 +1420,7 @@ if (midLen < LEFT_ARGS) rightLen = nargs - (midLen = LEFT_ARGS); assert(rightLen > 0); MethodHandle midFill = fillToRight(midLen); // recursive fill - MethodHandle rightFill = FILL_ARRAYS[rightLen].bindTo(midLen); // [midLen..nargs-1] + MethodHandle rightFill = Lazy.FILL_ARRAYS[rightLen].bindTo(midLen); // [midLen..nargs-1] assert(midFill.type().parameterCount() == 1 + midLen - LEFT_ARGS); assert(rightFill.type().parameterCount() == 1 + rightLen);
--- a/src/java.base/share/classes/java/lang/invoke/MethodType.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/lang/invoke/MethodType.java Thu Oct 16 14:14:57 2014 -0700 @@ -727,7 +727,7 @@ * @return the parameter types (as an immutable list) */ public List<Class<?>> parameterList() { - return Collections.unmodifiableList(Arrays.asList(ptypes)); + return Collections.unmodifiableList(Arrays.asList(ptypes.clone())); } /*non-public*/ Class<?> lastParameterType() {
--- a/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Thu Oct 16 14:14:57 2014 -0700 @@ -68,6 +68,7 @@ return null; } }); + init(); } /** @@ -362,4 +363,7 @@ protected boolean nativeConnectDisabled() { return connectDisabled; } + + native int dataAvailable(); + private static native void init(); }
--- a/src/java.base/share/classes/java/net/DatagramSocket.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/net/DatagramSocket.java Thu Oct 16 14:14:57 2014 -0700 @@ -85,6 +85,17 @@ */ boolean oldImpl = false; + /** + * Set when a socket is ST_CONNECTED until we are certain + * that any packets which might have been received prior + * to calling connect() but not read by the application + * have been read. During this time we check the source + * address of all packets received to be sure they are from + * the connected destination. Other packets are read but + * silently dropped. + */ + private boolean explicitFilter = false; + private int bytesLeftToFilter; /* * Connection state: * ST_NOT_CONNECTED = socket not connected @@ -144,6 +155,15 @@ // socket is now connected by the impl connectState = ST_CONNECTED; + // Do we need to filter some packets? + int avail = getImpl().dataAvailable(); + if (avail == -1) { + throw new SocketException(); + } + explicitFilter = avail > 0; + if (explicitFilter) { + bytesLeftToFilter = getReceiveBufferSize(); + } } catch (SocketException se) { // connection will be emulated by DatagramSocket @@ -492,6 +512,7 @@ connectedAddress = null; connectedPort = -1; connectState = ST_NOT_CONNECTED; + explicitFilter = false; } } @@ -750,10 +771,12 @@ } // end of while } } - if (connectState == ST_CONNECTED_NO_IMPL) { + if ((connectState == ST_CONNECTED_NO_IMPL) || explicitFilter) { // We have to do the filtering the old fashioned way since // the native impl doesn't support connect or the connect - // via the impl failed. + // via the impl failed, or .. "explicitFilter" may be set when + // a socket is connected via the impl, for a period of time + // when packets from other sources might be queued on socket. boolean stop = false; while (!stop) { InetAddress peekAddress = null; @@ -772,8 +795,12 @@ if ((!connectedAddress.equals(peekAddress)) || (connectedPort != peekPort)) { // throw the packet away and silently continue - DatagramPacket tmp = new DatagramPacket(new byte[1], 1); + DatagramPacket tmp = new DatagramPacket( + new byte[1024], 1024); getImpl().receive(tmp); + if (explicitFilter) { + bytesLeftToFilter -= tmp.getLength(); + } } else { stop = true; } @@ -782,6 +809,15 @@ // If the security check succeeds, or the datagram is // connected then receive the packet getImpl().receive(p); + if (explicitFilter) { + bytesLeftToFilter -= p.getLength(); + if (bytesLeftToFilter <= 0) { + explicitFilter = false; + } else { + // break out of filter, if there is no more data queued + explicitFilter = getImpl().dataAvailable() > 0; + } + } } }
--- a/src/java.base/share/classes/java/net/DatagramSocketImpl.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/net/DatagramSocketImpl.java Thu Oct 16 14:14:57 2014 -0700 @@ -63,6 +63,12 @@ return socket; } + int dataAvailable() { + // default impl returns zero, which disables the calling + // functionality + return 0; + } + /** * Creates a datagram socket. * @exception SocketException if there is an error in the
--- a/src/java.base/share/classes/java/security/Signature.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/security/Signature.java Thu Oct 16 14:14:57 2014 -0700 @@ -604,9 +604,13 @@ * @return the number of bytes placed into {@code outbuf}. * * @exception SignatureException if this signature object is not - * initialized properly, if this signature algorithm is unable to - * process the input data provided, or if {@code len} is less - * than the actual signature length. + * initialized properly, if this signature algorithm is unable to + * process the input data provided, or if {@code len} is less + * than the actual signature length. + * @exception IllegalArgumentException if {@code outbuf} is {@code null}, + * or {@code offset} or {@code len} is less than 0, or the sum of + * {@code offset} and {@code len} is greater than the length of + * {@code outbuf}. * * @since 1.2 */ @@ -615,6 +619,9 @@ if (outbuf == null) { throw new IllegalArgumentException("No output buffer given"); } + if (offset < 0 || len < 0) { + throw new IllegalArgumentException("offset or len is less than 0"); + } if (outbuf.length - offset < len) { throw new IllegalArgumentException ("Output buffer too small for specified offset and length"); @@ -683,9 +690,16 @@ public final boolean verify(byte[] signature, int offset, int length) throws SignatureException { if (state == VERIFY) { - if ((signature == null) || (offset < 0) || (length < 0) || - (length > signature.length - offset)) { - throw new IllegalArgumentException("Bad arguments"); + if (signature == null) { + throw new IllegalArgumentException("signature is null"); + } + if (offset < 0 || length < 0) { + throw new IllegalArgumentException + ("offset or length is less than 0"); + } + if (signature.length - offset < length) { + throw new IllegalArgumentException + ("signature too small for specified offset and length"); } return engineVerify(signature, offset, length); @@ -733,11 +747,25 @@ * @param len the number of bytes to use, starting at offset. * * @exception SignatureException if this signature object is not - * initialized properly. + * initialized properly. + * @exception IllegalArgumentException if {@code data} is {@code null}, + * or {@code off} or {@code len} is less than 0, or the sum of + * {@code off} and {@code len} is greater than the length of + * {@code data}. */ public final void update(byte[] data, int off, int len) throws SignatureException { if (state == SIGN || state == VERIFY) { + if (data == null) { + throw new IllegalArgumentException("data is null"); + } + if (off < 0 || len < 0) { + throw new IllegalArgumentException("off or len is less than 0"); + } + if (data.length - off < len) { + throw new IllegalArgumentException + ("data too small for specified offset and length"); + } engineUpdate(data, off, len); } else { throw new SignatureException("object not initialized for "
--- a/src/java.base/share/classes/java/security/cert/CertificateRevokedException.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/security/cert/CertificateRevokedException.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2014, 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 @@ -84,6 +84,8 @@ * @throws NullPointerException if {@code revocationDate}, * {@code reason}, {@code authority}, or * {@code extensions} is {@code null} + * @throws ClassCastException if {@code extensions} contains an incorrectly + * typed key or value */ public CertificateRevokedException(Date revocationDate, CRLReason reason, X500Principal authority, Map<String, Extension> extensions) { @@ -94,7 +96,10 @@ this.revocationDate = new Date(revocationDate.getTime()); this.reason = reason; this.authority = authority; - this.extensions = new HashMap<String, Extension>(extensions); + // make sure Map only contains correct types + this.extensions = Collections.checkedMap(new HashMap<>(), + String.class, Extension.class); + this.extensions.putAll(extensions); } /** @@ -172,7 +177,8 @@ public String getMessage() { return "Certificate has been revoked, reason: " + reason + ", revocation date: " + revocationDate - + ", authority: " + authority + ", extensions: " + extensions; + + ", authority: " + authority + ", extension OIDs: " + + extensions.keySet(); } /**
--- a/src/java.base/share/classes/java/text/DigitList.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/text/DigitList.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2014, 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 @@ -290,25 +290,26 @@ FloatingDecimal.BinaryToASCIIConverter fdConverter = FloatingDecimal.getBinaryToASCIIConverter(source); boolean hasBeenRoundedUp = fdConverter.digitsRoundedUp(); - boolean allDecimalDigits = fdConverter.decimalDigitsExact(); + boolean valueExactAsDecimal = fdConverter.decimalDigitsExact(); assert !fdConverter.isExceptional(); String digitsString = fdConverter.toJavaFormatString(); set(isNegative, digitsString, - hasBeenRoundedUp, allDecimalDigits, + hasBeenRoundedUp, valueExactAsDecimal, maximumDigits, fixedPoint); } /** * Generate a representation of the form DDDDD, DDDDD.DDDDD, or * DDDDDE+/-DDDDD. - * @param roundedUp Boolean value indicating if the s digits were rounded-up. - * @param allDecimalDigits Boolean value indicating if the digits in s are - * an exact decimal representation of the double that was passed. + * @param roundedUp whether or not rounding up has already happened. + * @param valueExactAsDecimal whether or not collected digits provide + * an exact decimal representation of the value. */ private void set(boolean isNegative, String s, - boolean roundedUp, boolean allDecimalDigits, + boolean roundedUp, boolean valueExactAsDecimal, int maximumDigits, boolean fixedPoint) { + this.isNegative = isNegative; int len = s.length(); char[] source = getDataChars(len); @@ -361,7 +362,7 @@ } else if (-decimalAt == maximumDigits) { // If we round 0.0009 to 3 fractional digits, then we have to // create a new one digit in the least significant location. - if (shouldRoundUp(0, roundedUp, allDecimalDigits)) { + if (shouldRoundUp(0, roundedUp, valueExactAsDecimal)) { count = 1; ++decimalAt; digits[0] = '1'; @@ -381,25 +382,26 @@ // Eliminate digits beyond maximum digits to be displayed. // Round up if appropriate. round(fixedPoint ? (maximumDigits + decimalAt) : maximumDigits, - roundedUp, allDecimalDigits); - } + roundedUp, valueExactAsDecimal); + + } /** * Round the representation to the given number of digits. * @param maximumDigits The maximum number of digits to be shown. - * @param alreadyRounded Boolean indicating if rounding up already happened. - * @param allDecimalDigits Boolean indicating if the digits provide an exact - * representation of the value. + * @param alreadyRounded whether or not rounding up has already happened. + * @param valueExactAsDecimal whether or not collected digits provide + * an exact decimal representation of the value. * * Upon return, count will be less than or equal to maximumDigits. */ private final void round(int maximumDigits, boolean alreadyRounded, - boolean allDecimalDigits) { + boolean valueExactAsDecimal) { // Eliminate digits beyond maximum digits to be displayed. // Round up if appropriate. if (maximumDigits >= 0 && maximumDigits < count) { - if (shouldRoundUp(maximumDigits, alreadyRounded, allDecimalDigits)) { + if (shouldRoundUp(maximumDigits, alreadyRounded, valueExactAsDecimal)) { // Rounding up involved incrementing digits from LSD to MSD. // In most cases this is simple, but in a worst case situation // (9999..99) we have to adjust the decimalAt value. @@ -440,6 +442,9 @@ * <code>count-1</code>. If 0, then all digits are rounded away, and * this method returns true if a one should be generated (e.g., formatting * 0.09 with "#.#"). + * @param alreadyRounded whether or not rounding up has already happened. + * @param valueExactAsDecimal whether or not collected digits provide + * an exact decimal representation of the value. * @exception ArithmeticException if rounding is needed with rounding * mode being set to RoundingMode.UNNECESSARY * @return true if digit <code>maximumDigits-1</code> should be @@ -447,7 +452,7 @@ */ private boolean shouldRoundUp(int maximumDigits, boolean alreadyRounded, - boolean allDecimalDigits) { + boolean valueExactAsDecimal) { if (maximumDigits < count) { /* * To avoid erroneous double-rounding or truncation when converting @@ -460,7 +465,7 @@ * account what FloatingDecimal has done in the binary to decimal * conversion. * - * Considering the tie cases, FloatingDecimal may round-up the + * Considering the tie cases, FloatingDecimal may round up the * value (returning decimal digits equal to tie when it is below), * or "truncate" the value to the tie while value is above it, * or provide the exact decimal digits when the binary value can be @@ -490,7 +495,7 @@ * * - For other numbers that are always converted to exact digits * (like BigInteger, Long, ...), the passed alreadyRounded boolean - * have to be set to false, and allDecimalDigits has to be set to + * have to be set to false, and valueExactAsDecimal has to be set to * true in the upper DigitList call stack, providing the right state * for those situations.. */ @@ -520,42 +525,31 @@ } break; case HALF_UP: - if (digits[maximumDigits] >= '5') { - // We should not round up if the rounding digits position is - // exactly the last index and if digits were already rounded. - if ((maximumDigits == (count - 1)) && - (alreadyRounded)) - return false; - - // Value was exactly at or was above tie. We must round up. - return true; - } - break; case HALF_DOWN: if (digits[maximumDigits] > '5') { + // Value is above tie ==> must round up return true; - } else if (digits[maximumDigits] == '5' ) { - if (maximumDigits == (count - 1)) { - // The rounding position is exactly the last index. - if (allDecimalDigits || alreadyRounded) - /* FloatingDecimal rounded up (value was below tie), - * or provided the exact list of digits (value was - * an exact tie). We should not round up, following - * the HALF_DOWN rounding rule. - */ - return false; - else - // Value was above the tie, we must round up. - return true; - } - - // We must round up if it gives a non null digit after '5'. - for (int i=maximumDigits+1; i<count; ++i) { - if (digits[i] != '0') { - return true; + } else if (digits[maximumDigits] == '5') { + // Digit at rounding position is a '5'. Tie cases. + if (maximumDigits != (count - 1)) { + // There are remaining digits. Above tie => must round up + return true; + } else { + // Digit at rounding position is the last one ! + if (valueExactAsDecimal) { + // Exact binary representation. On the tie. + // Apply rounding given by roundingMode. + return roundingMode == RoundingMode.HALF_UP; + } else { + // Not an exact binary representation. + // Digit sequence either rounded up or truncated. + // Round up only if it was truncated. + return !alreadyRounded; } } } + // Digit at rounding position is < '5' ==> no round up. + // Just let do the default, which is no round up (thus break). break; case HALF_EVEN: // Implement IEEE half-even rounding @@ -569,7 +563,7 @@ // then we should not round up again. return false; - if (!allDecimalDigits) + if (!valueExactAsDecimal) // Otherwise if the digits don't represent exact value, // value was above tie and FloatingDecimal truncated // digits to tie. We must round up.
--- a/src/java.base/share/classes/java/util/ResourceBundle.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/util/ResourceBundle.java Thu Oct 16 14:14:57 2014 -0700 @@ -2646,7 +2646,10 @@ } catch (ClassNotFoundException e) { } } else if (format.equals("java.properties")) { - final String resourceName = toResourceName(bundleName, "properties"); + final String resourceName = toResourceName0(bundleName, "properties"); + if (resourceName == null) { + return bundle; + } final ClassLoader classLoader = loader; final boolean reloadFlag = reload; InputStream stream = null; @@ -2800,7 +2803,10 @@ } boolean result = false; try { - String resourceName = toResourceName(toBundleName(baseName, locale), format); + String resourceName = toResourceName0(toBundleName(baseName, locale), format); + if (resourceName == null) { + return result; + } URL url = loader.getResource(resourceName); if (url != null) { long lastModified = 0; @@ -2934,6 +2940,15 @@ sb.append(bundleName.replace('.', '/')).append('.').append(suffix); return sb.toString(); } + + private String toResourceName0(String bundleName, String suffix) { + // application protocol check + if (bundleName.contains("://")) { + return null; + } else { + return toResourceName(bundleName, suffix); + } + } } private static class SingleFormatControl extends Control {
--- a/src/java.base/share/classes/java/util/concurrent/FutureTask.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/java/util/concurrent/FutureTask.java Thu Oct 16 14:14:57 2014 -0700 @@ -163,7 +163,7 @@ public boolean cancel(boolean mayInterruptIfRunning) { if (!(state == NEW && - UNSAFE.compareAndSwapInt(this, stateOffset, NEW, + U.compareAndSwapInt(this, STATE, NEW, mayInterruptIfRunning ? INTERRUPTING : CANCELLED))) return false; try { // in case call to interrupt throws exception @@ -173,7 +173,7 @@ if (t != null) t.interrupt(); } finally { // final state - UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED); + U.putOrderedInt(this, STATE, INTERRUPTED); } } } finally { @@ -227,9 +227,9 @@ * @param v the value */ protected void set(V v) { - if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) { + if (U.compareAndSwapInt(this, STATE, NEW, COMPLETING)) { outcome = v; - UNSAFE.putOrderedInt(this, stateOffset, NORMAL); // final state + U.putOrderedInt(this, STATE, NORMAL); // final state finishCompletion(); } } @@ -245,17 +245,16 @@ * @param t the cause of failure */ protected void setException(Throwable t) { - if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) { + if (U.compareAndSwapInt(this, STATE, NEW, COMPLETING)) { outcome = t; - UNSAFE.putOrderedInt(this, stateOffset, EXCEPTIONAL); // final state + U.putOrderedInt(this, STATE, EXCEPTIONAL); // final state finishCompletion(); } } public void run() { if (state != NEW || - !UNSAFE.compareAndSwapObject(this, runnerOffset, - null, Thread.currentThread())) + !U.compareAndSwapObject(this, RUNNER, null, Thread.currentThread())) return; try { Callable<V> c = callable; @@ -296,8 +295,7 @@ */ protected boolean runAndReset() { if (state != NEW || - !UNSAFE.compareAndSwapObject(this, runnerOffset, - null, Thread.currentThread())) + !U.compareAndSwapObject(this, RUNNER, null, Thread.currentThread())) return false; boolean ran = false; int s = state; @@ -364,7 +362,7 @@ private void finishCompletion() { // assert state > COMPLETING; for (WaitNode q; (q = waiters) != null;) { - if (UNSAFE.compareAndSwapObject(this, waitersOffset, q, null)) { + if (U.compareAndSwapObject(this, WAITERS, q, null)) { for (;;) { Thread t = q.thread; if (t != null) { @@ -391,11 +389,18 @@ * * @param timed true if use timed waits * @param nanos time to wait, if timed - * @return state upon completion + * @return state upon completion or at timeout */ private int awaitDone(boolean timed, long nanos) throws InterruptedException { - final long deadline = timed ? System.nanoTime() + nanos : 0L; + // The code below is very delicate, to achieve these goals: + // - call nanoTime exactly once for each call to park + // - if nanos <= 0, return promptly without allocation or nanoTime + // - if nanos == Long.MIN_VALUE, don't underflow + // - if nanos == Long.MAX_VALUE, and nanoTime is non-monotonic + // and we suffer a spurious wakeup, we will do no worse than + // to park-spin for a while + long startTime = 0L; // Special value 0L means not yet parked WaitNode q = null; boolean queued = false; for (;;) { @@ -412,18 +417,30 @@ } else if (s == COMPLETING) // cannot time out yet Thread.yield(); - else if (q == null) + else if (q == null) { + if (timed && nanos <= 0L) + return s; q = new WaitNode(); + } else if (!queued) - queued = UNSAFE.compareAndSwapObject(this, waitersOffset, - q.next = waiters, q); + queued = U.compareAndSwapObject(this, WAITERS, + q.next = waiters, q); else if (timed) { - nanos = deadline - System.nanoTime(); - if (nanos <= 0L) { - removeWaiter(q); - return state; + final long parkNanos; + if (startTime == 0L) { // first time + startTime = System.nanoTime(); + if (startTime == 0L) + startTime = 1L; + parkNanos = nanos; + } else { + long elapsed = System.nanoTime() - startTime; + if (elapsed >= nanos) { + removeWaiter(q); + return state; + } + parkNanos = nanos - elapsed; } - LockSupport.parkNanos(this, nanos); + LockSupport.parkNanos(this, parkNanos); } else LockSupport.park(this); @@ -454,8 +471,7 @@ if (pred.thread == null) // check for race continue retry; } - else if (!UNSAFE.compareAndSwapObject(this, waitersOffset, - q, s)) + else if (!U.compareAndSwapObject(this, WAITERS, q, s)) continue retry; } break; @@ -464,20 +480,17 @@ } // Unsafe mechanics - private static final sun.misc.Unsafe UNSAFE; - private static final long stateOffset; - private static final long runnerOffset; - private static final long waitersOffset; + private static final sun.misc.Unsafe U; + private static final long STATE; + private static final long RUNNER; + private static final long WAITERS; static { try { - UNSAFE = sun.misc.Unsafe.getUnsafe(); + U = sun.misc.Unsafe.getUnsafe(); Class<?> k = FutureTask.class; - stateOffset = UNSAFE.objectFieldOffset - (k.getDeclaredField("state")); - runnerOffset = UNSAFE.objectFieldOffset - (k.getDeclaredField("runner")); - waitersOffset = UNSAFE.objectFieldOffset - (k.getDeclaredField("waiters")); + STATE = U.objectFieldOffset(k.getDeclaredField("state")); + RUNNER = U.objectFieldOffset(k.getDeclaredField("runner")); + WAITERS = U.objectFieldOffset(k.getDeclaredField("waiters")); } catch (Exception e) { throw new Error(e); }
--- a/src/java.base/share/classes/javax/crypto/CipherInputStream.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/javax/crypto/CipherInputStream.java Thu Oct 16 14:14:57 2014 -0700 @@ -107,9 +107,10 @@ done = true; try { obuffer = cipher.doFinal(); + } catch (IllegalBlockSizeException | BadPaddingException e) { + obuffer = null; + throw new IOException(e); } - catch (IllegalBlockSizeException e) {obuffer = null;} - catch (BadPaddingException e) {obuffer = null;} if (obuffer == null) return -1; else { @@ -120,7 +121,10 @@ } try { obuffer = cipher.update(ibuffer, 0, readin); - } catch (IllegalStateException e) {obuffer = null;}; + } catch (IllegalStateException e) { + obuffer = null; + throw e; + } ostart = 0; if (obuffer == null) ofinish = 0; @@ -302,6 +306,7 @@ } } catch (BadPaddingException | IllegalBlockSizeException ex) { + throw new IOException(ex); } ostart = 0; ofinish = 0;
--- a/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java Thu Oct 16 14:14:57 2014 -0700 @@ -102,19 +102,24 @@ case PUBLIC: return true; // already checked above case PROTECTED: + assert !defc.isInterface(); // protected members aren't allowed in interfaces if ((allowedModes & PROTECTED_OR_PACKAGE_ALLOWED) != 0 && isSamePackage(defc, lookupClass)) return true; if ((allowedModes & PROTECTED) == 0) return false; + // Protected members are accessible by subclasses, which does not include interfaces. + // Interfaces are types, not classes. They should not have access to + // protected members in j.l.Object, even though it is their superclass. if ((mods & STATIC) != 0 && !isRelatedClass(refc, lookupClass)) return false; if ((allowedModes & PROTECTED) != 0 && - isSuperClass(defc, lookupClass)) + isSubClass(lookupClass, defc)) return true; return false; case PACKAGE_ONLY: // That is, zero. Unmarked member is package-only access. + assert !defc.isInterface(); // package-private members aren't allowed in interfaces return ((allowedModes & PACKAGE_ALLOWED) != 0 && isSamePackage(defc, lookupClass)); case PRIVATE: @@ -129,12 +134,13 @@ static boolean isRelatedClass(Class<?> refc, Class<?> lookupClass) { return (refc == lookupClass || - refc.isAssignableFrom(lookupClass) || - lookupClass.isAssignableFrom(refc)); + isSubClass(refc, lookupClass) || + isSubClass(lookupClass, refc)); } - static boolean isSuperClass(Class<?> defc, Class<?> lookupClass) { - return defc.isAssignableFrom(lookupClass); + static boolean isSubClass(Class<?> lookupClass, Class<?> defc) { + return defc.isAssignableFrom(lookupClass) && + !lookupClass.isInterface(); // interfaces are types, not classes. } static int getClassModifiers(Class<?> c) {
--- a/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java Thu Oct 16 14:14:57 2014 -0700 @@ -740,6 +740,25 @@ // set or refresh local address localAddress = Net.localAddress(fd); + + // flush any packets already received. + boolean blocking = false; + synchronized (blockingLock()) { + try { + blocking = isBlocking(); + ByteBuffer tmpBuf = ByteBuffer.allocate(100); + if (blocking) { + configureBlocking(false); + } + do { + tmpBuf.clear(); + } while (read(tmpBuf) > 0); + } finally { + if (blocking) { + configureBlocking(true); + } + } + } } } }
--- a/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, 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 @@ -29,7 +29,6 @@ import java.lang.reflect.*; import java.io.Serializable; import java.util.*; -import java.lang.annotation.*; import java.security.AccessController; import java.security.PrivilegedAction; @@ -45,6 +44,11 @@ private final Map<String, Object> memberValues; AnnotationInvocationHandler(Class<? extends Annotation> type, Map<String, Object> memberValues) { + Class<?>[] superInterfaces = type.getInterfaces(); + if (!type.isAnnotation() || + superInterfaces.length != 1 || + superInterfaces[0] != java.lang.annotation.Annotation.class) + throw new AnnotationFormatError("Attempt to create proxy for a non-annotation type."); this.type = type; this.memberValues = memberValues; } @@ -57,13 +61,17 @@ if (member.equals("equals") && paramTypes.length == 1 && paramTypes[0] == Object.class) return equalsImpl(args[0]); - assert paramTypes.length == 0; - if (member.equals("toString")) + if (paramTypes.length != 0) + throw new AssertionError("Too many parameters for an annotation method"); + + switch(member) { + case "toString": return toStringImpl(); - if (member.equals("hashCode")) + case "hashCode": return hashCodeImpl(); - if (member.equals("annotationType")) + case "annotationType": return type; + } // Handle annotation member accessors Object result = memberValues.get(member); @@ -129,7 +137,7 @@ * Implementation of dynamicProxy.toString() */ private String toStringImpl() { - StringBuffer result = new StringBuffer(128); + StringBuilder result = new StringBuilder(128); result.append('@'); result.append(type.getName()); result.append('('); @@ -277,6 +285,7 @@ new PrivilegedAction<Method[]>() { public Method[] run() { final Method[] mm = type.getDeclaredMethods(); + validateAnnotationMethods(mm); AccessibleObject.setAccessible(mm, true); return mm; } @@ -287,6 +296,94 @@ private transient volatile Method[] memberMethods = null; /** + * Validates that a method is structurally appropriate for an + * annotation type. As of Java SE 8, annotation types cannot + * contain static methods and the declared methods of an + * annotation type must take zero arguments and there are + * restrictions on the return type. + */ + private void validateAnnotationMethods(Method[] memberMethods) { + /* + * Specification citations below are from JLS + * 9.6.1. Annotation Type Elements + */ + boolean valid = true; + for(Method method : memberMethods) { + /* + * "By virtue of the AnnotationTypeElementDeclaration + * production, a method declaration in an annotation type + * declaration cannot have formal parameters, type + * parameters, or a throws clause. + * + * "By virtue of the AnnotationTypeElementModifier + * production, a method declaration in an annotation type + * declaration cannot be default or static." + */ + if (method.getModifiers() != (Modifier.PUBLIC | Modifier.ABSTRACT) || + method.isDefault() || + method.getParameterCount() != 0 || + method.getExceptionTypes().length != 0) { + valid = false; + break; + } + + /* + * "It is a compile-time error if the return type of a + * method declared in an annotation type is not one of the + * following: a primitive type, String, Class, any + * parameterized invocation of Class, an enum type + * (section 8.9), an annotation type, or an array type + * (chapter 10) whose element type is one of the preceding + * types." + */ + Class<?> returnType = method.getReturnType(); + if (returnType.isArray()) { + returnType = returnType.getComponentType(); + if (returnType.isArray()) { // Only single dimensional arrays + valid = false; + break; + } + } + + if (!((returnType.isPrimitive() && returnType != void.class) || + returnType == java.lang.String.class || + returnType == java.lang.Class.class || + returnType.isEnum() || + returnType.isAnnotation())) { + valid = false; + break; + } + + /* + * "It is a compile-time error if any method declared in an + * annotation type has a signature that is + * override-equivalent to that of any public or protected + * method declared in class Object or in the interface + * java.lang.annotation.Annotation." + * + * The methods in Object or Annotation meeting the other + * criteria (no arguments, contrained return type, etc.) + * above are: + * + * String toString() + * int hashCode() + * Class<? extends Annotation> annotationType() + */ + String methodName = method.getName(); + if ((methodName.equals("toString") && returnType == java.lang.String.class) || + (methodName.equals("hashCode") && returnType == int.class) || + (methodName.equals("annotationType") && returnType == java.lang.Class.class)) { + valid = false; + break; + } + } + if (valid) + return; + else + throw new AnnotationFormatError("Malformed method on an annotation type"); + } + + /** * Implementation of dynamicProxy.hashCode() */ private int hashCodeImpl() { @@ -330,7 +427,6 @@ throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); - // Check to make sure that types have not evolved incompatibly AnnotationType annotationType = null; @@ -343,7 +439,6 @@ Map<String, Class<?>> memberTypes = annotationType.memberTypes(); - // If there are annotation members without values, that // situation is handled by the invoke method. for (Map.Entry<String, Object> memberValue : memberValues.entrySet()) {
--- a/src/java.base/share/classes/sun/security/provider/X509Factory.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/sun/security/provider/X509Factory.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, 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 @@ -80,6 +80,7 @@ * * @exception CertificateException on parsing errors. */ + @Override public Certificate engineGenerateCertificate(InputStream is) throws CertificateException { @@ -103,8 +104,8 @@ throw new IOException("Empty input"); } } catch (IOException ioe) { - throw (CertificateException)new CertificateException - ("Could not parse certificate: " + ioe.toString()).initCause(ioe); + throw new CertificateException("Could not parse certificate: " + + ioe.toString(), ioe); } } @@ -140,6 +141,12 @@ * It is useful for certificates that cannot be created via * generateCertificate() and for converting other X509Certificate * implementations to an X509CertImpl. + * + * @param c The source X509Certificate + * @return An X509CertImpl object that is either a cached certificate or a + * newly built X509CertImpl from the provided X509Certificate + * @throws CertificateException if failures occur while obtaining the DER + * encoding for certificate data. */ public static synchronized X509CertImpl intern(X509Certificate c) throws CertificateException { @@ -170,6 +177,12 @@ /** * Return an interned X509CRLImpl for the given certificate. * For more information, see intern(X509Certificate). + * + * @param c The source X509CRL + * @return An X509CRLImpl object that is either a cached CRL or a + * newly built X509CRLImpl from the provided X509CRL + * @throws CRLException if failures occur while obtaining the DER + * encoding for CRL data. */ public static synchronized X509CRLImpl intern(X509CRL c) throws CRLException { @@ -229,6 +242,7 @@ * @exception CertificateException if an exception occurs while decoding * @since 1.4 */ + @Override public CertPath engineGenerateCertPath(InputStream inStream) throws CertificateException { @@ -260,6 +274,7 @@ * the encoding requested is not supported * @since 1.4 */ + @Override public CertPath engineGenerateCertPath(InputStream inStream, String encoding) throws CertificateException { @@ -292,6 +307,7 @@ * @exception CertificateException if an exception occurs * @since 1.4 */ + @Override public CertPath engineGenerateCertPath(List<? extends Certificate> certificates) throws CertificateException @@ -311,6 +327,7 @@ * <code>CertPath</code> encodings (as <code>String</code>s) * @since 1.4 */ + @Override public Iterator<String> engineGetCertPathEncodings() { return(X509CertPath.getEncodingsStatic()); } @@ -326,6 +343,7 @@ * * @exception CertificateException on parsing errors. */ + @Override public Collection<? extends java.security.cert.Certificate> engineGenerateCertificates(InputStream is) throws CertificateException { @@ -351,6 +369,7 @@ * * @exception CRLException on parsing errors. */ + @Override public CRL engineGenerateCRL(InputStream is) throws CRLException { @@ -388,6 +407,7 @@ * * @exception CRLException on parsing errors. */ + @Override public Collection<? extends java.security.cert.CRL> engineGenerateCRLs( InputStream is) throws CRLException { @@ -410,11 +430,30 @@ parseX509orPKCS7Cert(InputStream is) throws CertificateException, IOException { + int peekByte; + byte[] data; + PushbackInputStream pbis = new PushbackInputStream(is); Collection<X509CertImpl> coll = new ArrayList<>(); - byte[] data = readOneBlock(is); + + // Test the InputStream for end-of-stream. If the stream's + // initial state is already at end-of-stream then return + // an empty collection. Otherwise, push the byte back into the + // stream and let readOneBlock look for the first certificate. + peekByte = pbis.read(); + if (peekByte == -1) { + return new ArrayList<>(0); + } else { + pbis.unread(peekByte); + data = readOneBlock(pbis); + } + + // If we end up with a null value after reading the first block + // then we know the end-of-stream has been reached and no certificate + // data has been found. if (data == null) { - return new ArrayList<>(0); + throw new CertificateException("No certificate data found"); } + try { PKCS7 pkcs7 = new PKCS7(data); X509Certificate[] certs = pkcs7.getCertificates(); @@ -422,13 +461,13 @@ if (certs != null) { return Arrays.asList(certs); } else { - // no crls provided + // no certificates provided return new ArrayList<>(0); } } catch (ParsingException e) { while (data != null) { coll.add(new X509CertImpl(data)); - data = readOneBlock(is); + data = readOneBlock(pbis); } } return coll; @@ -443,11 +482,30 @@ parseX509orPKCS7CRL(InputStream is) throws CRLException, IOException { + int peekByte; + byte[] data; + PushbackInputStream pbis = new PushbackInputStream(is); Collection<X509CRLImpl> coll = new ArrayList<>(); - byte[] data = readOneBlock(is); + + // Test the InputStream for end-of-stream. If the stream's + // initial state is already at end-of-stream then return + // an empty collection. Otherwise, push the byte back into the + // stream and let readOneBlock look for the first CRL. + peekByte = pbis.read(); + if (peekByte == -1) { + return new ArrayList<>(0); + } else { + pbis.unread(peekByte); + data = readOneBlock(pbis); + } + + // If we end up with a null value after reading the first block + // then we know the end-of-stream has been reached and no CRL + // data has been found. if (data == null) { - return new ArrayList<>(0); + throw new CRLException("No CRL data found"); } + try { PKCS7 pkcs7 = new PKCS7(data); X509CRL[] crls = pkcs7.getCRLs(); @@ -461,7 +519,7 @@ } catch (ParsingException e) { while (data != null) { coll.add(new X509CRLImpl(data)); - data = readOneBlock(is); + data = readOneBlock(pbis); } } return coll; @@ -623,7 +681,7 @@ int n = is.read(); if (n == -1) { - throw new IOException("BER/DER length info ansent"); + throw new IOException("BER/DER length info absent"); } bout.write(n);
--- a/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2014, 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 @@ -36,6 +36,8 @@ import java.security.cert.X509Certificate; import java.security.cert.CertificateException; +import java.security.cert.CertificateParsingException; +import javax.security.auth.x500.X500Principal; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; @@ -89,12 +91,66 @@ private final static boolean enableSNIExtension = Debug.getBooleanProperty("jsse.enableSNIExtension", true); + /* + * Allow unsafe server certificate change? + * + * Server certificate change during SSL/TLS renegotiation may be considered + * unsafe, as described in the Triple Handshake attacks: + * + * https://secure-resumption.com/tlsauth.pdf + * + * Endpoint identification (See + * SSLParameters.getEndpointIdentificationAlgorithm()) is a pretty nice + * guarantee that the server certificate change in renegotiation is legal. + * However, endpoing identification is only enabled for HTTPS and LDAP + * over SSL/TLS by default. It is not enough to protect SSL/TLS + * connections other than HTTPS and LDAP. + * + * The renegotiation indication extension (See RFC 5764) is a pretty + * strong guarantee that the endpoints on both client and server sides + * are identical on the same connection. However, the Triple Handshake + * attacks can bypass this guarantee if there is a session-resumption + * handshake between the initial full handshake and the renegotiation + * full handshake. + * + * Server certificate change may be unsafe and should be restricted if + * endpoint identification is not enabled and the previous handshake is + * a session-resumption abbreviated initial handshake, unless the + * identities represented by both certificates can be regraded as the + * same (See isIdentityEquivalent()). + * + * Considering the compatibility impact and the actual requirements to + * support server certificate change in practice, the system property, + * jdk.tls.allowUnsafeServerCertChange, is used to define whether unsafe + * server certificate change in renegotiation is allowed or not. The + * default value of the system property is "false". To mitigate the + * compactibility impact, applications may want to set the system + * property to "true" at their own risk. + * + * If the value of the system property is "false", server certificate + * change in renegotiation after a session-resumption abbreviated initial + * handshake is restricted (See isIdentityEquivalent()). + * + * If the system property is set to "true" explicitly, the restriction on + * server certificate change in renegotiation is disabled. + */ + private final static boolean allowUnsafeServerCertChange = + Debug.getBooleanProperty("jdk.tls.allowUnsafeServerCertChange", false); + private List<SNIServerName> requestedServerNames = Collections.<SNIServerName>emptyList(); private boolean serverNamesAccepted = false; /* + * the reserved server certificate chain in previous handshaking + * + * The server certificate chain is only reserved if the previous + * handshake is a session-resumption abbreviated initial handshake. + */ + private X509Certificate[] reservedServerCerts = null; + + /* * Constructors */ ClientHandshaker(SSLSocketImpl socket, SSLContextImpl context, @@ -555,14 +611,19 @@ // we wanted to resume, but the server refused session = null; if (!enableNewSession) { - throw new SSLException - ("New session creation is disabled"); + throw new SSLException("New session creation is disabled"); } } } if (resumingSession && session != null) { setHandshakeSessionSE(session); + // Reserve the handshake state if this is a session-resumption + // abbreviated initial handshake. + if (isInitialHandshake) { + session.setAsSessionResumption(true); + } + return; } @@ -1064,6 +1125,13 @@ } /* + * Reset the handshake state if this is not an initial handshake. + */ + if (!isInitialHandshake) { + session.setAsSessionResumption(false); + } + + /* * OK, it verified. If we're doing the fast handshake, add that * "Finished" message to the hash of handshake messages, then send * our own change_cipher_spec and Finished message for the server @@ -1161,8 +1229,23 @@ System.out.println("%% No cached client session"); } } - if ((session != null) && (session.isRejoinable() == false)) { - session = null; + if (session != null) { + // If unsafe server certificate change is not allowed, reserve + // current server certificates if the previous handshake is a + // session-resumption abbreviated initial handshake. + if (!allowUnsafeServerCertChange && session.isSessionResumption()) { + try { + // If existing, peer certificate chain cannot be null. + reservedServerCerts = + (X509Certificate[])session.getPeerCertificates(); + } catch (SSLPeerUnverifiedException puve) { + // Maybe not certificate-based, ignore the exception. + } + } + + if (!session.isRejoinable()) { + session = null; + } } if (session != null) { @@ -1331,9 +1414,28 @@ } X509Certificate[] peerCerts = mesg.getCertificateChain(); if (peerCerts.length == 0) { - fatalSE(Alerts.alert_bad_certificate, - "empty certificate chain"); + fatalSE(Alerts.alert_bad_certificate, "empty certificate chain"); } + + // Allow server certificate change in client side during renegotiation + // after a session-resumption abbreviated initial handshake? + // + // DO NOT need to check allowUnsafeServerCertChange here. We only + // reserve server certificates when allowUnsafeServerCertChange is + // flase. + if (reservedServerCerts != null) { + // It is not necessary to check the certificate update if endpoint + // identification is enabled. + String identityAlg = getEndpointIdentificationAlgorithmSE(); + if ((identityAlg == null || identityAlg.length() == 0) && + !isIdentityEquivalent(peerCerts[0], reservedServerCerts[0])) { + + fatalSE(Alerts.alert_bad_certificate, + "server certificate change is restricted " + + "during renegotiation"); + } + } + // ask the trust manager to verify the chain X509TrustManager tm = sslContext.getX509TrustManager(); try { @@ -1370,4 +1472,81 @@ } session.setPeerCertificates(peerCerts); } + + /* + * Whether the certificates can represent the same identity? + * + * The certificates can be used to represent the same identity: + * 1. If the subject alternative names of IP address are present in + * both certificates, they should be identical; otherwise, + * 2. if the subject alternative names of DNS name are present in + * both certificates, they should be identical; otherwise, + * 3. if the subject fields are present in both certificates, the + * certificate subjects and issuers should be identical. + */ + private static boolean isIdentityEquivalent(X509Certificate thisCert, + X509Certificate prevCert) { + if (thisCert.equals(prevCert)) { + return true; + } + + // check the iPAddress field in subjectAltName extension + Object thisIPAddress = getSubjectAltName(thisCert, 7); // 7: iPAddress + Object prevIPAddress = getSubjectAltName(prevCert, 7); + if (thisIPAddress != null && prevIPAddress!= null) { + // only allow the exactly match + return Objects.equals(thisIPAddress, prevIPAddress); + } + + // check the dNSName field in subjectAltName extension + Object thisDNSName = getSubjectAltName(thisCert, 2); // 2: dNSName + Object prevDNSName = getSubjectAltName(prevCert, 2); + if (thisDNSName != null && prevDNSName!= null) { + // only allow the exactly match + return Objects.equals(thisDNSName, prevDNSName); + } + + // check the certificate subject and issuer + X500Principal thisSubject = thisCert.getSubjectX500Principal(); + X500Principal prevSubject = prevCert.getSubjectX500Principal(); + X500Principal thisIssuer = thisCert.getIssuerX500Principal(); + X500Principal prevIssuer = prevCert.getIssuerX500Principal(); + if (!thisSubject.getName().isEmpty() && + !prevSubject.getName().isEmpty() && + thisSubject.equals(prevSubject) && + thisIssuer.equals(prevIssuer)) { + return true; + } + + return false; + } + + /* + * Returns the subject alternative name of the specified type in the + * subjectAltNames extension of a certificate. + */ + private static Object getSubjectAltName(X509Certificate cert, int type) { + Collection<List<?>> subjectAltNames; + + try { + subjectAltNames = cert.getSubjectAlternativeNames(); + } catch (CertificateParsingException cpe) { + if (debug != null && Debug.isOn("handshake")) { + System.out.println( + "Attempt to obtain subjectAltNames extension failed!"); + } + return null; + } + + if (subjectAltNames != null) { + for (List<?> subjectAltName : subjectAltNames) { + int subjectAltNameType = (Integer)subjectAltName.get(0); + if (subjectAltNameType == type) { + return subjectAltName.get(1); + } + } + } + + return null; + } }
--- a/src/java.base/share/classes/sun/security/ssl/Handshaker.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/sun/security/ssl/Handshaker.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2014, 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 @@ -359,6 +359,17 @@ } } + String getEndpointIdentificationAlgorithmSE() { + SSLParameters paras; + if (conn != null) { + paras = conn.getSSLParameters(); + } else { + paras = engine.getSSLParameters(); + } + + return paras.getEndpointIdentificationAlgorithm(); + } + private void setVersionSE(ProtocolVersion protocolVersion) { if (conn != null) { conn.setVersion(protocolVersion);
--- a/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/sun/security/ssl/SSLSessionImpl.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2014, 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 @@ -115,6 +115,14 @@ private Principal localPrincipal; /* + * Is the session currently re-established with a session-resumption + * abbreviated initial handshake? + * + * Note that currently we only set this variable in client side. + */ + private boolean isSessionResumption = false; + + /* * We count session creations, eventually for statistical data but * also since counters make shorter debugging IDs than the big ones * we use in the protocol for uniqueness-over-time. @@ -325,6 +333,22 @@ } /** + * Return true if the session is currently re-established with a + * session-resumption abbreviated initial handshake. + */ + boolean isSessionResumption() { + return isSessionResumption; + } + + /** + * Resets whether the session is re-established with a session-resumption + * abbreviated initial handshake. + */ + void setAsSessionResumption(boolean flag) { + isSessionResumption = flag; + } + + /** * Returns the name of the cipher suite in use on this session */ @Override
--- a/src/java.base/share/classes/sun/security/tools/keytool/Main.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/sun/security/tools/keytool/Main.java Thu Oct 16 14:14:57 2014 -0700 @@ -64,6 +64,7 @@ import javax.security.auth.x500.X500Principal; import java.util.Base64; +import sun.security.util.KeyUtil; import sun.security.util.ObjectIdentifier; import sun.security.pkcs10.PKCS10; import sun.security.pkcs10.PKCS10Attribute; @@ -1103,8 +1104,13 @@ doChangeKeyPasswd(alias); kssave = true; } else if (command == LIST) { + if (storePass == null + && !KeyStoreUtil.isWindowsKeyStore(storetype)) { + printWarning(); + } + if (alias != null) { - doPrintEntry(alias, out, true); + doPrintEntry(alias, out); } else { doPrintEntries(out); } @@ -1765,15 +1771,9 @@ /** * Prints a single keystore entry. */ - private void doPrintEntry(String alias, PrintStream out, - boolean printWarning) + private void doPrintEntry(String alias, PrintStream out) throws Exception { - if (storePass == null && printWarning - && !KeyStoreUtil.isWindowsKeyStore(storetype)) { - printWarning(); - } - if (keyStore.containsAlias(alias) == false) { MessageFormat form = new MessageFormat (rb.getString("Alias.alias.does.not.exist")); @@ -2090,13 +2090,6 @@ private void doPrintEntries(PrintStream out) throws Exception { - if (storePass == null - && !KeyStoreUtil.isWindowsKeyStore(storetype)) { - printWarning(); - } else { - out.println(); - } - out.println(rb.getString("Keystore.type.") + keyStore.getType()); out.println(rb.getString("Keystore.provider.") + keyStore.getProvider().getName()); @@ -2115,7 +2108,7 @@ for (Enumeration<String> e = keyStore.aliases(); e.hasMoreElements(); ) { String alias = e.nextElement(); - doPrintEntry(alias, out, false); + doPrintEntry(alias, out); if (verbose || rfc) { out.println(rb.getString("NEWLINE")); out.println(rb.getString @@ -2922,6 +2915,7 @@ MessageFormat form = new MessageFormat (rb.getString(".PATTERN.printX509Cert")); + PublicKey pkey = cert.getPublicKey(); Object[] source = {cert.getSubjectDN().toString(), cert.getIssuerDN().toString(), cert.getSerialNumber().toString(16), @@ -2931,7 +2925,9 @@ getCertFingerPrint("SHA1", cert), getCertFingerPrint("SHA-256", cert), cert.getSigAlgName(), - cert.getVersion() + pkey.getAlgorithm(), + KeyUtil.getKeySize(pkey), + cert.getVersion(), }; out.println(form.format(source));
--- a/src/java.base/share/classes/sun/security/tools/keytool/Resources.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/sun/security/tools/keytool/Resources.java Thu Oct 16 14:14:57 2014 -0700 @@ -347,7 +347,7 @@ {".RETURN.if.same.as.for.otherAlias.", "\t(RETURN if same as for <{0}>)"}, {".PATTERN.printX509Cert", - "Owner: {0}\nIssuer: {1}\nSerial number: {2}\nValid from: {3} until: {4}\nCertificate fingerprints:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Signature algorithm name: {8}\n\t Version: {9}"}, + "Owner: {0}\nIssuer: {1}\nSerial number: {2}\nValid from: {3} until: {4}\nCertificate fingerprints:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\nSignature algorithm name: {8}\nSubject Public Key Algorithm: {9} ({10,number,#})\nVersion: {11}"}, {"What.is.your.first.and.last.name.", "What is your first and last name?"}, {"What.is.the.name.of.your.organizational.unit.",
--- a/src/java.base/share/classes/sun/util/locale/BaseLocale.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/sun/util/locale/BaseLocale.java Thu Oct 16 14:14:57 2014 -0700 @@ -31,6 +31,7 @@ */ package sun.util.locale; +import java.lang.ref.SoftReference; import java.util.StringJoiner; @@ -151,11 +152,11 @@ return h; } - private static final class Key implements Comparable<Key> { - private final String lang; - private final String scrt; - private final String regn; - private final String vart; + private static final class Key { + private final SoftReference<String> lang; + private final SoftReference<String> scrt; + private final SoftReference<String> regn; + private final SoftReference<String> vart; private final boolean normalized; private final int hash; @@ -167,10 +168,10 @@ assert language.intern() == language && region.intern() == region; - lang = language; - scrt = ""; - regn = region; - vart = ""; + lang = new SoftReference<>(language); + scrt = new SoftReference<>(""); + regn = new SoftReference<>(region); + vart = new SoftReference<>(""); this.normalized = true; int h = language.hashCode(); @@ -191,40 +192,40 @@ String variant, boolean normalized) { int h = 0; if (language != null) { - lang = language; + lang = new SoftReference<>(language); int len = language.length(); for (int i = 0; i < len; i++) { h = 31*h + LocaleUtils.toLower(language.charAt(i)); } } else { - lang = ""; + lang = new SoftReference<>(""); } if (script != null) { - scrt = script; + scrt = new SoftReference<>(script); int len = script.length(); for (int i = 0; i < len; i++) { h = 31*h + LocaleUtils.toLower(script.charAt(i)); } } else { - scrt = ""; + scrt = new SoftReference<>(""); } if (region != null) { - regn = region; + regn = new SoftReference<>(region); int len = region.length(); for (int i = 0; i < len; i++) { h = 31*h + LocaleUtils.toLower(region.charAt(i)); } } else { - regn = ""; + regn = new SoftReference<>(""); } if (variant != null) { - vart = variant; + vart = new SoftReference<>(variant); int len = variant.length(); for (int i = 0; i < len; i++) { h = 31*h + variant.charAt(i); } } else { - vart = ""; + vart = new SoftReference<>(""); } hash = h; this.normalized = normalized; @@ -232,28 +233,31 @@ @Override public boolean equals(Object obj) { - return (this == obj) || - (obj instanceof Key) - && this.hash == ((Key)obj).hash - && LocaleUtils.caseIgnoreMatch(((Key)obj).lang, this.lang) - && LocaleUtils.caseIgnoreMatch(((Key)obj).scrt, this.scrt) - && LocaleUtils.caseIgnoreMatch(((Key)obj).regn, this.regn) - && ((Key)obj).vart.equals(vart); // variant is case sensitive in JDK! - } + if (this == obj) { + return true; + } - @Override - public int compareTo(Key other) { - int res = LocaleUtils.caseIgnoreCompare(this.lang, other.lang); - if (res == 0) { - res = LocaleUtils.caseIgnoreCompare(this.scrt, other.scrt); - if (res == 0) { - res = LocaleUtils.caseIgnoreCompare(this.regn, other.regn); - if (res == 0) { - res = this.vart.compareTo(other.vart); + if (obj instanceof Key && this.hash == ((Key)obj).hash) { + String tl = this.lang.get(); + String ol = ((Key)obj).lang.get(); + if (tl != null && ol != null && + LocaleUtils.caseIgnoreMatch(ol, tl)) { + String ts = this.scrt.get(); + String os = ((Key)obj).scrt.get(); + if (ts != null && os != null && + LocaleUtils.caseIgnoreMatch(os, ts)) { + String tr = this.regn.get(); + String or = ((Key)obj).regn.get(); + if (tr != null && or != null && + LocaleUtils.caseIgnoreMatch(or, tr)) { + String tv = this.vart.get(); + String ov = ((Key)obj).vart.get(); + return (ov != null && ov.equals(tv)); + } } } } - return res; + return false; } @Override @@ -266,10 +270,10 @@ return key; } - String lang = LocaleUtils.toLowerString(key.lang).intern(); - String scrt = LocaleUtils.toTitleString(key.scrt).intern(); - String regn = LocaleUtils.toUpperString(key.regn).intern(); - String vart = key.vart.intern(); // preserve upper/lower cases + String lang = LocaleUtils.toLowerString(key.lang.get()).intern(); + String scrt = LocaleUtils.toTitleString(key.scrt.get()).intern(); + String regn = LocaleUtils.toUpperString(key.regn.get()).intern(); + String vart = key.vart.get().intern(); // preserve upper/lower cases return new Key(lang, scrt, regn, vart, true); } @@ -282,12 +286,18 @@ @Override protected Key normalizeKey(Key key) { + assert key.lang.get() != null && + key.scrt.get() != null && + key.regn.get() != null && + key.vart.get() != null; + return Key.normalize(key); } @Override protected BaseLocale createObject(Key key) { - return new BaseLocale(key.lang, key.scrt, key.regn, key.vart); + return new BaseLocale(key.lang.get(), key.scrt.get(), + key.regn.get(), key.vart.get()); } } }
--- a/src/java.base/share/classes/sun/util/locale/LocaleObjectCache.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/classes/sun/util/locale/LocaleObjectCache.java Thu Oct 16 14:14:57 2014 -0700 @@ -57,8 +57,10 @@ value = entry.get(); } if (value == null) { + V newVal = createObject(key); + // make sure key is normalized *after* the object creation + // so that newVal is assured to be created from a valid key. key = normalizeKey(key); - V newVal = createObject(key); if (key == null || newVal == null) { // subclass must return non-null key/value object return null;
--- a/src/java.base/share/native/include/jvm.h Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/native/include/jvm.h Thu Oct 16 14:14:57 2014 -0700 @@ -386,6 +386,19 @@ JVM_FindClassFromBootLoader(JNIEnv *env, const char *name); /* + * Find a class from a given class loader. Throws ClassNotFoundException. + * name: name of class + * init: whether initialization is done + * loader: class loader to look up the class. This may not be the same as the caller's + * class loader. + * caller: initiating class. The initiating class may be null when a security + * manager is not installed. + */ +JNIEXPORT jclass JNICALL +JVM_FindClassFromCaller(JNIEnv *env, const char *name, jboolean init, + jobject loader, jclass caller); + +/* * Find a class from a given class loader. Throw ClassNotFoundException * or NoClassDefFoundError depending on the value of the last * argument.
--- a/src/java.base/share/native/libjava/Class.c Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/native/libjava/Class.c Thu Oct 16 14:14:57 2014 -0700 @@ -93,7 +93,7 @@ JNIEXPORT jclass JNICALL Java_java_lang_Class_forName0(JNIEnv *env, jclass this, jstring classname, - jboolean initialize, jobject loader) + jboolean initialize, jobject loader, jclass caller) { char *clname; jclass cls = 0; @@ -131,8 +131,7 @@ goto done; } - cls = JVM_FindClassFromClassLoader(env, clname, initialize, - loader, JNI_FALSE); + cls = JVM_FindClassFromCaller(env, clname, initialize, loader, caller); done: if (clname != buf) {
--- a/src/java.base/share/native/libzip/CRC32.c Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/native/libzip/CRC32.c Thu Oct 16 14:14:57 2014 -0700 @@ -54,7 +54,8 @@ return crc; } -JNIEXPORT jint ZIP_CRC32(jint crc, const jbyte *buf, jint len) +JNIEXPORT jint JNICALL +ZIP_CRC32(jint crc, const jbyte *buf, jint len) { return crc32(crc, (Bytef*)buf, len); }
--- a/src/java.base/share/native/libzip/ZipFile.c Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/native/libzip/ZipFile.c Thu Oct 16 14:14:57 2014 -0700 @@ -174,11 +174,7 @@ } (*env)->GetByteArrayRegion(env, name, 0, ulen, (jbyte *)path); path[ulen] = '\0'; - if (addSlash == JNI_FALSE) { - ze = ZIP_GetEntry(zip, path, 0); - } else { - ze = ZIP_GetEntry(zip, path, (jint)ulen); - } + ze = ZIP_GetEntry2(zip, path, (jint)ulen, addSlash); if (path != buf) { free(path); } @@ -271,7 +267,7 @@ switch (type) { case java_util_zip_ZipFile_JZENTRY_NAME: if (ze->name != 0) { - len = (int)strlen(ze->name); + len = (int)ze->nlen; // Unlike for extra and comment, we never return null for // an (extremely rarely seen) empty name if ((jba = (*env)->NewByteArray(env, len)) == NULL)
--- a/src/java.base/share/native/libzip/zip_util.c Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/native/libzip/zip_util.c Thu Oct 16 14:14:57 2014 -0700 @@ -1021,6 +1021,7 @@ if ((ze->name = malloc(nlen + 1)) == NULL) goto Catch; memcpy(ze->name, cen + CENHDR, nlen); ze->name[nlen] = '\0'; + ze->nlen = nlen; if (elen > 0) { char *extra = cen + CENHDR + nlen; @@ -1118,7 +1119,34 @@ jzentry * ZIP_GetEntry(jzfile *zip, char *name, jint ulen) { - unsigned int hsh = hash(name); + if (ulen == 0) { + return ZIP_GetEntry2(zip, name, strlen(name), JNI_FALSE); + } + return ZIP_GetEntry2(zip, name, ulen, JNI_TRUE); +} + +jboolean equals(char* name1, int len1, char* name2, int len2) { + if (len1 != len2) { + return JNI_FALSE; + } + while (len1-- > 0) { + if (*name1++ != *name2++) { + return JNI_FALSE; + } + } + return JNI_TRUE; +} + +/* + * Returns the zip entry corresponding to the specified name, or + * NULL if not found. + * This method supports embedded null character in "name", use ulen + * for the length of "name". + */ +jzentry * +ZIP_GetEntry2(jzfile *zip, char *name, jint ulen, jboolean addSlash) +{ + unsigned int hsh = hashN(name, ulen); jint idx; jzentry *ze = 0; @@ -1139,7 +1167,7 @@ /* Check the cached entry first */ ze = zip->cache; - if (ze && strcmp(ze->name,name) == 0) { + if (ze && equals(ze->name, ze->nlen, name, ulen)) { /* Cache hit! Remove and return the cached entry. */ zip->cache = 0; ZIP_Unlock(zip); @@ -1165,7 +1193,7 @@ * we keep searching. */ ze = newEntry(zip, zc, ACCESS_RANDOM); - if (ze && strcmp(ze->name, name)==0) { + if (ze && equals(ze->name, ze->nlen, name, ulen)) { break; } if (ze != 0) { @@ -1184,8 +1212,8 @@ break; } - /* If no real length was passed in, we are done */ - if (ulen == 0) { + /* If no need to try appending slash, we are done */ + if (!addSlash) { break; } @@ -1195,11 +1223,11 @@ } /* Add slash and try once more */ - name[ulen] = '/'; - name[ulen+1] = '\0'; + name[ulen++] = '/'; + name[ulen] = '\0'; hsh = hash_append(hsh, '/'); idx = zip->table[hsh % zip->tablelen]; - ulen = 0; + addSlash = JNI_FALSE; } Finally:
--- a/src/java.base/share/native/libzip/zip_util.h Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/share/native/libzip/zip_util.h Thu Oct 16 14:14:57 2014 -0700 @@ -154,6 +154,7 @@ * - If pos <= 0 then it is the position of entry LOC header. * If pos > 0 then it is the position of entry data. * pos should not be accessed directly, but only by ZIP_GetEntryDataOffset. + * - entry name may include embedded null character, use nlen for length */ typedef struct jzentry { /* Zip file entry */ @@ -166,6 +167,7 @@ jbyte *extra; /* optional extra data */ jlong pos; /* position of LOC header or entry data */ jint flag; /* general purpose flag */ + jint nlen; /* length of the entry name */ } jzentry; /* @@ -269,5 +271,5 @@ jint ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len); void ZIP_FreeEntry(jzfile *zip, jzentry *ze); jlong ZIP_GetEntryDataOffset(jzfile *zip, jzentry *entry); - +jzentry * ZIP_GetEntry2(jzfile *zip, char *name, jint ulen, jboolean addSlash); #endif /* !_ZIP_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java.base/unix/native/libnet/AbstractPlainDatagramSocketImpl.c Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2014, 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. + */ + +#include <sys/types.h> +#include <sys/socket.h> + +#ifdef __solaris__ +#include <unistd.h> +#include <stropts.h> + +#ifndef BSD_COMP +#define BSD_COMP +#endif + +#endif + +#include <sys/ioctl.h> + +#include "jvm.h" +#include "jni_util.h" +#include "net_util.h" + +#include "java_net_AbstractPlainDatagramSocketImpl.h" + +static jfieldID IO_fd_fdID; + +static jfieldID apdsi_fdID; + + +/* + * Class: java_net_AbstractPlainDatagramSocketImpl + * Method: init + * Signature: ()V + */ +JNIEXPORT void JNICALL +Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) { + + apdsi_fdID = (*env)->GetFieldID(env, cls, "fd", + "Ljava/io/FileDescriptor;"); + CHECK_NULL(apdsi_fdID); + + IO_fd_fdID = NET_GetFileDescriptorID(env); +} + +/* + * Class: java_net_AbstractPlainDatagramSocketImpl + * Method: dataAvailable + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable +(JNIEnv *env, jobject this) { + int fd, retval; + + jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID); + + if (IS_NULL(fdObj)) { + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", + "Socket closed"); + return -1; + } + fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID); + + if (ioctl(fd, FIONREAD, &retval) < 0) { + return -1; + } + return retval; +}
--- a/src/java.base/windows/conf/tzmappings Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.base/windows/conf/tzmappings Thu Oct 16 14:14:57 2014 -0700 @@ -193,5 +193,10 @@ Turkey Standard Time:926,926::Asia/Istanbul: Bahia Standard Time:927,927::America/Bahia: Libya Standard Time:928,928:LY:Africa/Tripoli: -Western Brazilian Standard Time:929,929:BR:America/Rio_Branco: -Armenian Standard Time:930,930:AM:Asia/Yerevan: +Belarus Standard Time:929,929:BY:Europe/Minsk: +Line Islands Standard Time:930,930::Pacific/Kiritimati: +Russia Time Zone 10:931,931::Asia/Srednekolymsk: +Russia Time Zone 11:932,932::Asia/Anadyr: +Russia Time Zone 3:933,933::Europe/Samara: +Western Brazilian Standard Time:934,934:BR:America/Rio_Branco: +Armenian Standard Time:935,935:AM:Asia/Yerevan:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/java.base/windows/native/libnet/AbstractPlainDatagramSocketImpl.c Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2014, 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. + */ + +#include <windows.h> +#include <winsock2.h> + +#include "jvm.h" +#include "jni_util.h" +#include "net_util.h" + +#include "java_net_AbstractPlainDatagramSocketImpl.h" + +static jfieldID IO_fd_fdID; + +static jfieldID apdsi_fdID; + + +/* + * Class: java_net_AbstractPlainDatagramSocketImpl + * Method: init + * Signature: ()V + */ +JNIEXPORT void JNICALL +Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) { + + apdsi_fdID = (*env)->GetFieldID(env, cls, "fd", + "Ljava/io/FileDescriptor;"); + CHECK_NULL(apdsi_fdID); + + IO_fd_fdID = NET_GetFileDescriptorID(env); + CHECK_NULL(IO_fd_fdID); + + JNU_CHECK_EXCEPTION(env); +} + +/* + * Class: java_net_AbstractPlainDatagramSocketImpl + * Method: dataAvailable + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable +(JNIEnv *env, jobject this) { + SOCKET fd; + int retval; + + jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID); + + if (IS_NULL(fdObj)) { + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", + "Socket closed"); + return -1; + } + fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID); + + if (ioctlsocket(fd, FIONREAD, &retval) < 0) { + return -1; + } + return retval; +} +
--- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Oct 16 14:14:57 2014 -0700 @@ -567,7 +567,10 @@ CWrapper.NSWindow.makeKeyWindow(nsWindowPtr); } } else { + // immediately hide the window CWrapper.NSWindow.orderOut(nsWindowPtr); + // process the close + CWrapper.NSWindow.close(nsWindowPtr); } } else { // otherwise, put it in a proper z-order
--- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CWrapper.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CWrapper.java Thu Oct 16 14:14:57 2014 -0700 @@ -54,8 +54,26 @@ static native void orderFront(long window); static native void orderFrontRegardless(long window); static native void orderWindow(long window, int ordered, long relativeTo); + + /** + * Removes the window from the screen. + * + * @param window the pointer of the NSWindow + */ static native void orderOut(long window); + /** + * Removes the window from the screen and releases it. According to + * documentation this method should be similar to {@link #orderOut}, + * because we use ReleasedWhenClosed:NO, so the window shouldn't be + * released. But the close method works differently, for example it + * close the space if the window was in the full screen via + * {@link CPlatformWindow#toggleFullScreen()}. + * + * @param window the pointer of the NSWindow + */ + static native void close(long window); + static native void addChildWindow(long parent, long child, int ordered); static native void removeChildWindow(long parent, long child);
--- a/src/java.desktop/macosx/native/libawt_lwawt/awt/CWrapper.m Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/CWrapper.m Thu Oct 16 14:14:57 2014 -0700 @@ -175,6 +175,23 @@ /* * Class: sun_lwawt_macosx_CWrapper$NSWindow + * Method: close + * Signature: (J)V + */ +JNIEXPORT void JNICALL +Java_sun_lwawt_macosx_CWrapper_00024NSWindow_close + (JNIEnv *env, jclass cls, jlong windowPtr) +{ +JNF_COCOA_ENTER(env); + NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); + [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ + [window close]; + }]; +JNF_COCOA_EXIT(env); +} + +/* + * Class: sun_lwawt_macosx_CWrapper$NSWindow * Method: orderFrontRegardless * Signature: (J)V */
--- a/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2014, 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 @@ -117,7 +117,7 @@ } } - + @Override public final MidiDevice.Info[] getDeviceInfo() { readDeviceInfos(); Info[] infos = getInfoCache(); @@ -126,7 +126,7 @@ return localArray; } - + @Override public final MidiDevice getDevice(MidiDevice.Info info) { if (info instanceof Info) { readDeviceInfos(); @@ -143,9 +143,7 @@ } } } - - throw new IllegalArgumentException("MidiDevice " + info.toString() - + " not supported by this provider."); + throw MidiUtils.unsupportedDevice(info); }
--- a/src/java.desktop/share/classes/com/sun/media/sound/MidiUtils.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/com/sun/media/sound/MidiUtils.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, 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,9 +25,15 @@ package com.sun.media.sound; -import javax.sound.midi.*; import java.util.ArrayList; +import javax.sound.midi.MetaMessage; +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiEvent; +import javax.sound.midi.MidiMessage; +import javax.sound.midi.Sequence; +import javax.sound.midi.Track; + // TODO: // - define and use a global symbolic constant for 60000000 (see convertTempo) @@ -48,6 +54,17 @@ private MidiUtils() { } + /** + * Returns an exception which should be thrown if MidiDevice is unsupported. + * + * @param info an info object that describes the desired device + * @return an exception instance + */ + static RuntimeException unsupportedDevice(final MidiDevice.Info info) { + return new IllegalArgumentException(String.format( + "MidiDevice %s not supported by this provider", info)); + } + /** return true if the passed message is Meta End Of Track */ public static boolean isMetaEndOfTrack(MidiMessage midiMsg) { // first check if it is a META message at all
--- a/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencer.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencer.java Thu Oct 16 14:14:57 2014 -0700 @@ -64,7 +64,7 @@ /** * All RealTimeSequencers share this info object. */ - static final RealTimeSequencerInfo info = new RealTimeSequencerInfo(); + static final MidiDevice.Info info = new RealTimeSequencerInfo(); private static final Sequencer.SyncMode[] masterSyncModes = { Sequencer.SyncMode.INTERNAL_CLOCK }; @@ -154,7 +154,7 @@ /* ****************************** CONSTRUCTOR ****************************** */ - RealTimeSequencer() throws MidiUnavailableException { + RealTimeSequencer(){ super(info); if (Printer.trace) Printer.trace(">> RealTimeSequencer CONSTRUCTOR"); @@ -1088,7 +1088,7 @@ private static final String description = "Software sequencer"; private static final String version = "Version 1.0"; - private RealTimeSequencerInfo() { + RealTimeSequencerInfo() { super(name, vendor, description, version); } } // class Info
--- a/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencerProvider.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/com/sun/media/sound/RealTimeSequencerProvider.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, 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,7 +26,6 @@ package com.sun.media.sound; import javax.sound.midi.MidiDevice; -import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.spi.MidiDeviceProvider; /** @@ -36,23 +35,16 @@ */ public final class RealTimeSequencerProvider extends MidiDeviceProvider { - + @Override public MidiDevice.Info[] getDeviceInfo() { - - MidiDevice.Info[] localArray = { RealTimeSequencer.info }; - return localArray; + return new MidiDevice.Info[]{RealTimeSequencer.info}; } - - public MidiDevice getDevice(MidiDevice.Info info) { - if ((info != null) && (!info.equals(RealTimeSequencer.info))) { - return null; + @Override + public MidiDevice getDevice(final MidiDevice.Info info) { + if (RealTimeSequencer.info.equals(info)) { + return new RealTimeSequencer(); } - - try { - return new RealTimeSequencer(); - } catch (MidiUnavailableException e) { - return null; - } + throw MidiUtils.unsupportedDevice(info); } }
--- a/src/java.desktop/share/classes/com/sun/media/sound/SoftProvider.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/com/sun/media/sound/SoftProvider.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2014, 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,11 +22,10 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package com.sun.media.sound; -import java.util.Arrays; import javax.sound.midi.MidiDevice; -import javax.sound.midi.MidiDevice.Info; import javax.sound.midi.spi.MidiDeviceProvider; /** @@ -36,17 +35,16 @@ */ public final class SoftProvider extends MidiDeviceProvider { - static final Info softinfo = SoftSynthesizer.info; - private static final Info[] softinfos = {softinfo}; - + @Override public MidiDevice.Info[] getDeviceInfo() { - return Arrays.copyOf(softinfos, softinfos.length); + return new MidiDevice.Info[]{SoftSynthesizer.info}; } - public MidiDevice getDevice(MidiDevice.Info info) { - if (info == softinfo) { + @Override + public MidiDevice getDevice(final MidiDevice.Info info) { + if (SoftSynthesizer.info.equals(info)) { return new SoftSynthesizer(); } - return null; + throw MidiUtils.unsupportedDevice(info); } }
--- a/src/java.desktop/share/classes/java/awt/GraphicsEnvironment.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/java/awt/GraphicsEnvironment.java Thu Oct 16 14:14:57 2014 -0700 @@ -182,7 +182,8 @@ "SunOS".equals(osName) || "FreeBSD".equals(osName) || "NetBSD".equals(osName) || - "OpenBSD".equals(osName)) && + "OpenBSD".equals(osName) || + "AIX".equals(osName)) && (System.getenv("DISPLAY") == null)); } }
--- a/src/java.desktop/share/classes/javax/print/PrintServiceLookup.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/javax/print/PrintServiceLookup.java Thu Oct 16 14:14:57 2014 -0700 @@ -245,7 +245,7 @@ public static boolean registerService(PrintService service) { synchronized (PrintServiceLookup.class) { - if (service instanceof StreamPrintService) { + if (service == null || service instanceof StreamPrintService) { return false; } ArrayList<PrintService> registeredServices = getRegisteredServices();
--- a/src/java.desktop/share/classes/javax/sound/midi/MidiSystem.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/javax/sound/midi/MidiSystem.java Thu Oct 16 14:14:57 2014 -0700 @@ -31,6 +31,7 @@ import java.io.OutputStream; import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -162,18 +163,11 @@ * of length 0 is returned. */ public static MidiDevice.Info[] getMidiDeviceInfo() { - List<MidiDevice.Info> allInfos = new ArrayList<>(); - List<MidiDeviceProvider> providers = getMidiDeviceProviders(); - - for(int i = 0; i < providers.size(); i++) { - MidiDeviceProvider provider = providers.get(i); - MidiDevice.Info[] tmpinfo = provider.getDeviceInfo(); - for (int j = 0; j < tmpinfo.length; j++) { - allInfos.add( tmpinfo[j] ); - } + final List<MidiDevice.Info> allInfos = new ArrayList<>(); + for (final MidiDeviceProvider provider : getMidiDeviceProviders()) { + Collections.addAll(allInfos, provider.getDeviceInfo()); } - MidiDevice.Info[] infosArray = allInfos.toArray(new MidiDevice.Info[0]); - return infosArray; + return allInfos.toArray(new MidiDevice.Info[allInfos.size()]); } /** @@ -187,17 +181,15 @@ * MIDI device installed on the system * @see #getMidiDeviceInfo */ - public static MidiDevice getMidiDevice(MidiDevice.Info info) throws MidiUnavailableException { - List<MidiDeviceProvider> providers = getMidiDeviceProviders(); - - for(int i = 0; i < providers.size(); i++) { - MidiDeviceProvider provider = providers.get(i); + public static MidiDevice getMidiDevice(final MidiDevice.Info info) + throws MidiUnavailableException { + for (final MidiDeviceProvider provider : getMidiDeviceProviders()) { if (provider.isDeviceSupported(info)) { - MidiDevice device = provider.getDevice(info); - return device; + return provider.getDevice(info); } } - throw new IllegalArgumentException("Requested device not installed: " + info); + throw new IllegalArgumentException(String.format( + "Requested device not installed: %s", info)); } /**
--- a/src/java.desktop/share/classes/javax/sound/midi/spi/MidiDeviceProvider.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/javax/sound/midi/spi/MidiDeviceProvider.java Thu Oct 16 14:14:57 2014 -0700 @@ -25,6 +25,8 @@ package javax.sound.midi.spi; +import java.util.Arrays; + import javax.sound.midi.MidiDevice; /** @@ -45,16 +47,8 @@ * @return {@code true} if the specified device is supported, otherwise * {@code false} */ - public boolean isDeviceSupported(MidiDevice.Info info) { - - MidiDevice.Info infos[] = getDeviceInfo(); - - for(int i=0; i<infos.length; i++) { - if( info.equals( infos[i] ) ) { - return true; - } - } - return false; + public boolean isDeviceSupported(final MidiDevice.Info info) { + return Arrays.asList(getDeviceInfo()).contains(info); } /**
--- a/src/java.desktop/share/classes/javax/swing/JComponent.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/javax/swing/JComponent.java Thu Oct 16 14:14:57 2014 -0700 @@ -56,6 +56,7 @@ import java.io.IOException; import java.io.ObjectInputValidation; import java.io.InvalidObjectException; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.border.*; import javax.swing.event.*; @@ -354,7 +355,8 @@ private static final int AUTOSCROLLS_SET = 25; private static final int FOCUS_TRAVERSAL_KEYS_FORWARD_SET = 26; private static final int FOCUS_TRAVERSAL_KEYS_BACKWARD_SET = 27; - private static final int REVALIDATE_RUNNABLE_SCHEDULED = 28; + + private transient AtomicBoolean revalidateRunnableScheduled = new AtomicBoolean(false); /** * Temporary rectangles. @@ -4901,16 +4903,11 @@ // To avoid a flood of Runnables when constructing GUIs off // the EDT, a flag is maintained as to whether or not // a Runnable has been scheduled. - synchronized(this) { - if (getFlag(REVALIDATE_RUNNABLE_SCHEDULED)) { - return; - } - setFlag(REVALIDATE_RUNNABLE_SCHEDULED, true); + if (revalidateRunnableScheduled.getAndSet(true)) { + return; } SunToolkit.executeOnEventHandlerThread(this, () -> { - synchronized(JComponent.this) { - setFlag(REVALIDATE_RUNNABLE_SCHEDULED, false); - } + revalidateRunnableScheduled.set(false); revalidate(); }); } @@ -5567,6 +5564,7 @@ ToolTipManager.sharedInstance().registerComponent(this); } setWriteObjCounter(this, (byte)0); + revalidateRunnableScheduled = new AtomicBoolean(false); }
--- a/src/java.desktop/share/classes/javax/swing/JTable.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/javax/swing/JTable.java Thu Oct 16 14:14:57 2014 -0700 @@ -3688,17 +3688,17 @@ // /** - * Sets the data model for this table to <code>newModel</code> and registers + * Sets the data model for this table to {@code dataModel} and registers * with it for listener notifications from the new data model. * - * @param dataModel the new data source for this table - * @exception IllegalArgumentException if <code>newModel</code> is <code>null</code> - * @see #getModel + * @param dataModel the new data source for this table + * @throws IllegalArgumentException if {@code dataModel} is {@code null} + * @see #getModel * @beaninfo * bound: true * description: The model that is the source of the data for this view. */ - public void setModel(TableModel dataModel) { + public void setModel(final TableModel dataModel) { if (dataModel == null) { throw new IllegalArgumentException("Cannot set a null TableModel"); } @@ -3721,29 +3721,30 @@ } /** - * Returns the <code>TableModel</code> that provides the data displayed by this - * <code>JTable</code>. - * - * @return the <code>TableModel</code> that provides the data displayed by this <code>JTable</code> - * @see #setModel + * Returns the {@code TableModel} that provides the data displayed by this + * {@code JTable}. + * + * @return the {@code TableModel} that provides the data displayed by this + * {@code JTable} + * @see #setModel */ public TableModel getModel() { return dataModel; } /** - * Sets the column model for this table to <code>newModel</code> and registers - * for listener notifications from the new column model. Also sets - * the column model of the <code>JTableHeader</code> to <code>columnModel</code>. - * - * @param columnModel the new data source for this table - * @exception IllegalArgumentException if <code>columnModel</code> is <code>null</code> - * @see #getColumnModel + * Sets the column model for this table to {@code columnModel} and registers + * for listener notifications from the new column model. Also sets the + * column model of the {@code JTableHeader} to {@code columnModel}. + * + * @param columnModel the new data source for this table + * @throws IllegalArgumentException if {@code columnModel} is {@code null} + * @see #getColumnModel * @beaninfo * bound: true * description: The object governing the way columns appear in the view. */ - public void setColumnModel(TableColumnModel columnModel) { + public void setColumnModel(final TableColumnModel columnModel) { if (columnModel == null) { throw new IllegalArgumentException("Cannot set a null ColumnModel"); } @@ -3766,54 +3767,55 @@ } /** - * Returns the <code>TableColumnModel</code> that contains all column information + * Returns the {@code TableColumnModel} that contains all column information * of this table. * - * @return the object that provides the column state of the table - * @see #setColumnModel + * @return the object that provides the column state of the table + * @see #setColumnModel */ public TableColumnModel getColumnModel() { return columnModel; } /** - * Sets the row selection model for this table to <code>newModel</code> + * Sets the row selection model for this table to {@code selectionModel} * and registers for listener notifications from the new selection model. * - * @param newModel the new selection model - * @exception IllegalArgumentException if <code>newModel</code> is <code>null</code> - * @see #getSelectionModel + * @param selectionModel the new selection model + * @throws IllegalArgumentException if {@code selectionModel} is + * {@code null} + * @see #getSelectionModel * @beaninfo * bound: true * description: The selection model for rows. */ - public void setSelectionModel(ListSelectionModel newModel) { - if (newModel == null) { + public void setSelectionModel(final ListSelectionModel selectionModel) { + if (selectionModel == null) { throw new IllegalArgumentException("Cannot set a null SelectionModel"); } - ListSelectionModel oldModel = selectionModel; - - if (newModel != oldModel) { + ListSelectionModel oldModel = this.selectionModel; + + if (selectionModel != oldModel) { if (oldModel != null) { oldModel.removeListSelectionListener(this); } - selectionModel = newModel; - newModel.addListSelectionListener(this); - - firePropertyChange("selectionModel", oldModel, newModel); + this.selectionModel = selectionModel; + selectionModel.addListSelectionListener(this); + + firePropertyChange("selectionModel", oldModel, selectionModel); repaint(); } } /** - * Returns the <code>ListSelectionModel</code> that is used to maintain row + * Returns the {@code ListSelectionModel} that is used to maintain row * selection state. * - * @return the object that provides row selection state, <code>null</code> - * if row selection is not allowed - * @see #setSelectionModel + * @return the object that provides row selection state, {@code null} if row + * selection is not allowed + * @see #setSelectionModel */ public ListSelectionModel getSelectionModel() { return selectionModel;
--- a/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java Thu Oct 16 14:14:57 2014 -0700 @@ -1122,6 +1122,11 @@ Position.Bias b, int direction, Position.Bias[] biasRet) throws BadLocationException{ Document doc = editor.getDocument(); + + if (pos < -1 || pos > doc.getLength()) { + throw new BadLocationException("Invalid position", pos); + } + if (doc instanceof AbstractDocument) { ((AbstractDocument)doc).readLock(); } @@ -1594,7 +1599,7 @@ int direction, Position.Bias[] biasRet) throws BadLocationException { - if (pos < -1) { + if (pos < -1 || pos > getDocument().getLength()) { throw new BadLocationException("invalid position", pos); } if( view != null ) {
--- a/src/java.desktop/share/classes/javax/swing/text/AsyncBoxView.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/javax/swing/text/AsyncBoxView.java Thu Oct 16 14:14:57 2014 -0700 @@ -854,7 +854,7 @@ int direction, Position.Bias[] biasRet) throws BadLocationException { - if (pos < -1) { + if (pos < -1 || pos > getDocument().getLength()) { throw new BadLocationException("invalid position", pos); } return Utilities.getNextVisualPositionFrom(
--- a/src/java.desktop/share/classes/javax/swing/text/CompositeView.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/javax/swing/text/CompositeView.java Thu Oct 16 14:14:57 2014 -0700 @@ -463,7 +463,7 @@ public int getNextVisualPositionFrom(int pos, Position.Bias b, Shape a, int direction, Position.Bias[] biasRet) throws BadLocationException { - if (pos < -1) { + if (pos < -1 || pos > getDocument().getLength()) { throw new BadLocationException("invalid position", pos); } Rectangle alloc = getInsideAllocation(a); @@ -723,6 +723,9 @@ Shape a, int direction, Position.Bias[] biasRet) throws BadLocationException { + if (pos < -1 || pos > getDocument().getLength()) { + throw new BadLocationException("invalid position", pos); + } return Utilities.getNextVisualPositionFrom( this, pos, b, a, direction, biasRet); } @@ -754,6 +757,9 @@ int direction, Position.Bias[] biasRet) throws BadLocationException { + if (pos < -1 || pos > getDocument().getLength()) { + throw new BadLocationException("invalid position", pos); + } return Utilities.getNextVisualPositionFrom( this, pos, b, a, direction, biasRet); }
--- a/src/java.desktop/share/classes/javax/swing/text/GlyphView.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/javax/swing/text/GlyphView.java Thu Oct 16 14:14:57 2014 -0700 @@ -900,7 +900,7 @@ Position.Bias[] biasRet) throws BadLocationException { - if (pos < -1) { + if (pos < -1 || pos > getDocument().getLength()) { throw new BadLocationException("invalid position", pos); } return painter.getNextVisualPositionFrom(this, pos, b, a, direction, biasRet);
--- a/src/java.desktop/share/classes/javax/swing/text/View.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/javax/swing/text/View.java Thu Oct 16 14:14:57 2014 -0700 @@ -500,7 +500,7 @@ public int getNextVisualPositionFrom(int pos, Position.Bias b, Shape a, int direction, Position.Bias[] biasRet) throws BadLocationException { - if (pos < -1) { + if (pos < -1 || pos > getDocument().getLength()) { // -1 is a reserved value, see the code below throw new BadLocationException("Invalid position", pos); }
--- a/src/java.desktop/share/classes/sun/awt/image/BytePackedRaster.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/sun/awt/image/BytePackedRaster.java Thu Oct 16 14:14:57 2014 -0700 @@ -1408,10 +1408,10 @@ } } - int lastbit = (dataBitOffset - + (height-1) * scanlineStride * 8 - + (width-1) * pixelBitStride - + pixelBitStride - 1); + long lastbit = (long) dataBitOffset + + (long) (height - 1) * (long) scanlineStride * 8 + + (long) (width - 1) * (long) pixelBitStride + + (long) pixelBitStride - 1; if (lastbit < 0 || lastbit / 8 >= data.length) { throw new RasterFormatException("raster dimensions overflow " + "array bounds");
--- a/src/java.desktop/share/classes/sun/datatransfer/DataFlavorUtil.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/classes/sun/datatransfer/DataFlavorUtil.java Thu Oct 16 14:14:57 2014 -0700 @@ -581,6 +581,15 @@ return comp; } + // Next prefer text types + if (flavor1.isFlavorTextType()) { + return 1; + } + + if (flavor2.isFlavorTextType()) { + return -1; + } + // Next, look for application/x-java-* types. Prefer unknown // MIME types because if the user provides his own data flavor, // it will likely be the most descriptive one.
--- a/src/java.desktop/share/native/libfontmanager/freetypeScaler.c Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/native/libfontmanager/freetypeScaler.c Thu Oct 16 14:14:57 2014 -0700 @@ -425,7 +425,6 @@ jobject metrics; jfloat ax, ay, dx, dy, bx, by, lx, ly, mx, my; jfloat f0 = 0.0; - FT_Pos bmodifier = 0; FTScalerContext *context = (FTScalerContext*) jlong_to_ptr(pScalerContext); FTScalerInfo *scalerInfo = @@ -458,43 +457,38 @@ So, we have to do adust them explicitly and stay consistent with what freetype does to outlines. */ - /* For bolding glyphs are not just widened. Height is also changed - (see ftsynth.c). - - TODO: In vertical direction we could do better job and adjust metrics - proportionally to glyoh shape. */ - if (context->doBold) { - bmodifier = FT_MulFix( - scalerInfo->face->units_per_EM, - scalerInfo->face->size->metrics.y_scale)/24; - } - /**** Note: only some metrics are affected by styling ***/ + /* See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=657854 */ +#define FT_MulFixFloatShift6(a, b) (((float) (a)) * ((float) (b)) / 65536.0 / 64.0) + + /* + * See FreeType source code: src/base/ftobjs.c ft_recompute_scaled_metrics() + * http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=1659 + */ /* ascent */ ax = 0; - ay = -(jfloat) FT26Dot6ToFloat(FT_MulFix( - ((jlong) scalerInfo->face->ascender + bmodifier/2), + ay = -(jfloat) (FT_MulFixFloatShift6( + ((jlong) scalerInfo->face->ascender), (jlong) scalerInfo->face->size->metrics.y_scale)); /* descent */ dx = 0; - dy = -(jfloat) FT26Dot6ToFloat(FT_MulFix( - ((jlong) scalerInfo->face->descender + bmodifier/2), + dy = -(jfloat) (FT_MulFixFloatShift6( + ((jlong) scalerInfo->face->descender), (jlong) scalerInfo->face->size->metrics.y_scale)); /* baseline */ bx = by = 0; /* leading */ lx = 0; - ly = (jfloat) FT26Dot6ToFloat(FT_MulFix( - (jlong) scalerInfo->face->height + bmodifier, + ly = (jfloat) (FT_MulFixFloatShift6( + (jlong) scalerInfo->face->height, (jlong) scalerInfo->face->size->metrics.y_scale)) + ay - dy; /* max advance */ mx = (jfloat) FT26Dot6ToFloat( scalerInfo->face->size->metrics.max_advance + - 2*bmodifier + OBLIQUE_MODIFIER(scalerInfo->face->size->metrics.height)); my = 0;
--- a/src/java.desktop/share/native/libfontmanager/layout/ContextualSubstSubtables.cpp Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/share/native/libfontmanager/layout/ContextualSubstSubtables.cpp Thu Oct 16 14:14:57 2014 -0700 @@ -243,12 +243,22 @@ le_uint16 srSetCount = SWAPW(subRuleSetCount); if (coverageIndex < srSetCount) { + LEReferenceToArrayOf<Offset> subRuleSetTableOffsetArrayRef(base, success, + &subRuleSetTableOffsetArray[coverageIndex], 1); + if (LE_FAILURE(success)) { + return 0; + } Offset subRuleSetTableOffset = SWAPW(subRuleSetTableOffsetArray[coverageIndex]); LEReferenceTo<SubRuleSetTable> subRuleSetTable(base, success, (const SubRuleSetTable *) ((char *) this + subRuleSetTableOffset)); le_uint16 subRuleCount = SWAPW(subRuleSetTable->subRuleCount); le_int32 position = glyphIterator->getCurrStreamPosition(); + LEReferenceToArrayOf<Offset> subRuleTableOffsetArrayRef(base, success, + subRuleSetTable->subRuleTableOffsetArray, subRuleCount); + if (LE_FAILURE(success)) { + return 0; + } for (le_uint16 subRule = 0; subRule < subRuleCount; subRule += 1) { Offset subRuleTableOffset = SWAPW(subRuleSetTable->subRuleTableOffsetArray[subRule]); @@ -301,34 +311,44 @@ glyphIterator->getCurrGlyphID(), success); - if (setClass < scSetCount && subClassSetTableOffsetArray[setClass] != 0) { - Offset subClassSetTableOffset = SWAPW(subClassSetTableOffsetArray[setClass]); - LEReferenceTo<SubClassSetTable> - subClassSetTable(base, success, (const SubClassSetTable *) ((char *) this + subClassSetTableOffset)); - le_uint16 subClassRuleCount = SWAPW(subClassSetTable->subClassRuleCount); - le_int32 position = glyphIterator->getCurrStreamPosition(); + if (setClass < scSetCount) { + LEReferenceToArrayOf<Offset> + subClassSetTableOffsetArrayRef(base, success, subClassSetTableOffsetArray, setClass); + if (LE_FAILURE(success)) { return 0; } + if (subClassSetTableOffsetArray[setClass] != 0) { - for (le_uint16 scRule = 0; scRule < subClassRuleCount; scRule += 1) { - Offset subClassRuleTableOffset = - SWAPW(subClassSetTable->subClassRuleTableOffsetArray[scRule]); - LEReferenceTo<SubClassRuleTable> - subClassRuleTable(subClassSetTable, success, subClassRuleTableOffset); - le_uint16 matchCount = SWAPW(subClassRuleTable->glyphCount) - 1; - le_uint16 substCount = SWAPW(subClassRuleTable->substCount); + Offset subClassSetTableOffset = SWAPW(subClassSetTableOffsetArray[setClass]); + LEReferenceTo<SubClassSetTable> + subClassSetTable(base, success, (const SubClassSetTable *) ((char *) this + subClassSetTableOffset)); + le_uint16 subClassRuleCount = SWAPW(subClassSetTable->subClassRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + LEReferenceToArrayOf<Offset> + subClassRuleTableOffsetArrayRef(base, success, subClassSetTable->subClassRuleTableOffsetArray, subClassRuleCount); + if (LE_FAILURE(success)) { + return 0; + } + for (le_uint16 scRule = 0; scRule < subClassRuleCount; scRule += 1) { + Offset subClassRuleTableOffset = + SWAPW(subClassSetTable->subClassRuleTableOffsetArray[scRule]); + LEReferenceTo<SubClassRuleTable> + subClassRuleTable(subClassSetTable, success, subClassRuleTableOffset); + le_uint16 matchCount = SWAPW(subClassRuleTable->glyphCount) - 1; + le_uint16 substCount = SWAPW(subClassRuleTable->substCount); - LEReferenceToArrayOf<le_uint16> classArray(base, success, subClassRuleTable->classArray, matchCount+1); + LEReferenceToArrayOf<le_uint16> classArray(base, success, subClassRuleTable->classArray, matchCount+1); - if (LE_FAILURE(success)) { return 0; } - if (matchGlyphClasses(classArray, matchCount, glyphIterator, classDefinitionTable, success)) { - LEReferenceToArrayOf<SubstitutionLookupRecord> - substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subClassRuleTable->classArray[matchCount], substCount); + if (LE_FAILURE(success)) { return 0; } + if (matchGlyphClasses(classArray, matchCount, glyphIterator, classDefinitionTable, success)) { + LEReferenceToArrayOf<SubstitutionLookupRecord> + substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subClassRuleTable->classArray[matchCount], substCount); - applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); + applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); - return matchCount + 1; + return matchCount + 1; + } + + glyphIterator->setCurrStreamPosition(position); } - - glyphIterator->setCurrStreamPosition(position); } } @@ -442,13 +462,22 @@ le_uint16 srSetCount = SWAPW(chainSubRuleSetCount); if (coverageIndex < srSetCount) { + LEReferenceToArrayOf<Offset> + chainSubRuleSetTableOffsetArrayRef(base, success, chainSubRuleSetTableOffsetArray, coverageIndex); + if (LE_FAILURE(success)) { + return 0; + } Offset chainSubRuleSetTableOffset = SWAPW(chainSubRuleSetTableOffsetArray[coverageIndex]); LEReferenceTo<ChainSubRuleSetTable> chainSubRuleSetTable(base, success, (const ChainSubRuleSetTable *) ((char *) this + chainSubRuleSetTableOffset)); le_uint16 chainSubRuleCount = SWAPW(chainSubRuleSetTable->chainSubRuleCount); le_int32 position = glyphIterator->getCurrStreamPosition(); GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); - + LEReferenceToArrayOf<Offset> + chainSubRuleTableOffsetArrayRef(base, success, chainSubRuleSetTable->chainSubRuleTableOffsetArray, chainSubRuleCount); + if (LE_FAILURE(success)) { + return 0; + } for (le_uint16 subRule = 0; subRule < chainSubRuleCount; subRule += 1) { Offset chainSubRuleTableOffset = SWAPW(chainSubRuleSetTable->chainSubRuleTableOffsetArray[subRule]); @@ -530,6 +559,11 @@ le_int32 setClass = inputClassDefinitionTable->getGlyphClass(inputClassDefinitionTable, glyphIterator->getCurrGlyphID(), success); + LEReferenceToArrayOf<Offset> + chainSubClassSetTableOffsetArrayRef(base, success, chainSubClassSetTableOffsetArray, setClass); + if (LE_FAILURE(success)) { + return 0; + } if (setClass < scSetCount && chainSubClassSetTableOffsetArray[setClass] != 0) { Offset chainSubClassSetTableOffset = SWAPW(chainSubClassSetTableOffsetArray[setClass]); @@ -538,7 +572,11 @@ le_uint16 chainSubClassRuleCount = SWAPW(chainSubClassSetTable->chainSubClassRuleCount); le_int32 position = glyphIterator->getCurrStreamPosition(); GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); - + LEReferenceToArrayOf<Offset> + chainSubClassRuleTableOffsetArrayRef(base, success, chainSubClassSetTable->chainSubClassRuleTableOffsetArray, chainSubClassRuleCount); + if (LE_FAILURE(success)) { + return 0; + } for (le_uint16 scRule = 0; scRule < chainSubClassRuleCount; scRule += 1) { Offset chainSubClassRuleTableOffset = SWAPW(chainSubClassSetTable->chainSubClassRuleTableOffsetArray[scRule]); @@ -603,12 +641,14 @@ } le_uint16 backtrkGlyphCount = SWAPW(backtrackGlyphCount); + LEReferenceToArrayOf<Offset> backtrackGlyphArrayRef(base, success, backtrackCoverageTableOffsetArray, backtrkGlyphCount); + if (LE_FAILURE(success)) { + return 0; + } le_uint16 inputGlyphCount = (le_uint16) SWAPW(backtrackCoverageTableOffsetArray[backtrkGlyphCount]); LEReferenceToArrayOf<Offset> inputCoverageTableOffsetArray(base, success, &backtrackCoverageTableOffsetArray[backtrkGlyphCount + 1], inputGlyphCount+2); // offset if (LE_FAILURE(success)) { return 0; } const le_uint16 lookaheadGlyphCount = (le_uint16) SWAPW(inputCoverageTableOffsetArray[inputGlyphCount]); - - if( LE_FAILURE(success)) { return 0; } LEReferenceToArrayOf<Offset> lookaheadCoverageTableOffsetArray(base, success, inputCoverageTableOffsetArray.getAlias(inputGlyphCount + 1, success), lookaheadGlyphCount+2); if( LE_FAILURE(success) ) { return 0; }
--- a/src/java.desktop/unix/classes/sun/print/CUPSPrinter.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/unix/classes/sun/print/CUPSPrinter.java Thu Oct 16 14:14:57 2014 -0700 @@ -136,7 +136,7 @@ /** * Returns array of MediaSizeNames derived from PPD. */ - public MediaSizeName[] getMediaSizeNames() { + MediaSizeName[] getMediaSizeNames() { initMedia(); return cupsMediaSNames; } @@ -145,7 +145,7 @@ /** * Returns array of Custom MediaSizeNames derived from PPD. */ - public CustomMediaSizeName[] getCustomMediaSizeNames() { + CustomMediaSizeName[] getCustomMediaSizeNames() { initMedia(); return cupsCustomMediaSNames; } @@ -157,7 +157,7 @@ /** * Returns array of MediaPrintableArea derived from PPD. */ - public MediaPrintableArea[] getMediaPrintableArea() { + MediaPrintableArea[] getMediaPrintableArea() { initMedia(); return cupsMediaPrintables; } @@ -165,7 +165,7 @@ /** * Returns array of MediaTrays derived from PPD. */ - public MediaTray[] getMediaTrays() { + MediaTray[] getMediaTrays() { initMedia(); return cupsMediaTrays; }
--- a/src/java.desktop/unix/classes/sun/print/IPPPrintService.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/unix/classes/sun/print/IPPPrintService.java Thu Oct 16 14:14:57 2014 -0700 @@ -1002,7 +1002,9 @@ public synchronized Class<?>[] getSupportedAttributeCategories() { if (supportedCats != null) { - return supportedCats; + Class<?> [] copyCats = new Class<?>[supportedCats.length]; + System.arraycopy(supportedCats, 0, copyCats, 0, copyCats.length); + return copyCats; } initAttributes(); @@ -1065,7 +1067,9 @@ supportedCats = new Class<?>[catList.size()]; catList.toArray(supportedCats); - return supportedCats; + Class<?>[] copyCats = new Class<?>[supportedCats.length]; + System.arraycopy(supportedCats, 0, copyCats, 0, copyCats.length); + return copyCats; }
--- a/src/java.desktop/unix/native/common/awt/awt_util.h Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/unix/native/common/awt/awt_util.h Thu Oct 16 14:14:57 2014 -0700 @@ -52,6 +52,8 @@ */ extern XErrorHandler current_native_xerror_handler; +Window get_xawt_root_shell(JNIEnv *env); + #endif /* !HEADLESS */ #ifndef INTERSECTS
--- a/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c Thu Oct 16 14:14:57 2014 -0700 @@ -2011,10 +2011,14 @@ * Toolkit thread to process PropertyNotify or SelectionNotify events. */ static Bool -secondary_loop_event(Display* dpy, XEvent* event, char* arg) { - return (event->type == SelectionNotify || - event->type == SelectionClear || - event->type == PropertyNotify) ? True : False; +secondary_loop_event(Display* dpy, XEvent* event, XPointer xawt_root_window) { + return ( + event->type == SelectionNotify || + event->type == SelectionClear || + event->type == PropertyNotify || + (event->type == ConfigureNotify + && event->xany.window == *(Window*) xawt_root_window) + ) ? True : False; } @@ -2025,8 +2029,11 @@ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); exitSecondaryLoop = False; + Window xawt_root_window = get_xawt_root_shell(env); + while (!exitSecondaryLoop) { - if (XCheckIfEvent((Display*) jlong_to_ptr(display), (XEvent*) jlong_to_ptr(ptr), secondary_loop_event, NULL)) { + if (XCheckIfEvent((Display*) jlong_to_ptr(display), + (XEvent*) jlong_to_ptr(ptr), secondary_loop_event, (XPointer) &xawt_root_window)) { return JNI_TRUE; } timeout = (timeout < AWT_SECONDARY_LOOP_TIMEOUT) ? (timeout << 1) : AWT_SECONDARY_LOOP_TIMEOUT;
--- a/src/java.desktop/windows/native/libawt/java2d/windows/GDIRenderer.cpp Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/windows/native/libawt/java2d/windows/GDIRenderer.cpp Thu Oct 16 14:14:57 2014 -0700 @@ -670,7 +670,7 @@ if (ypoints != NULL) { pPoints = TransformPoly(xpoints, ypoints, transx, transy, tmpPts, &npoints, FALSE, FALSE); - env->ReleasePrimitiveArrayCritical(ypointsarray, xpoints, JNI_ABORT); + env->ReleasePrimitiveArrayCritical(ypointsarray, ypoints, JNI_ABORT); } env->ReleasePrimitiveArrayCritical(xpointsarray, xpoints, JNI_ABORT); }
--- a/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Thu Oct 16 14:14:57 2014 -0700 @@ -3936,7 +3936,6 @@ DASSERT(stringCls); CHECK_NULL(stringCls); clauseReading = env->NewObjectArray(cClause, stringCls, NULL); - env->DeleteLocalRef(stringCls); DASSERT(clauseReading); CHECK_NULL(clauseReading); for (int i=0; i<cClause; i++) env->SetObjectArrayElement(clauseReading, i, rgClauseReading[i]);
--- a/src/java.desktop/windows/native/libawt/windows/awt_TextArea.cpp Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/windows/native/libawt/windows/awt_TextArea.cpp Thu Oct 16 14:14:57 2014 -0700 @@ -47,16 +47,12 @@ jfieldID AwtTextArea::scrollbarVisibilityID; -WNDPROC AwtTextArea::sm_pDefWindowProc = NULL; - /************************************************************************ * AwtTextArea methods */ AwtTextArea::AwtTextArea() { - m_bIgnoreEnChange = FALSE; m_bCanUndo = FALSE; - m_hEditCtrl = NULL; m_lHDeltaAccum = 0; m_lVDeltaAccum = 0; } @@ -67,10 +63,6 @@ void AwtTextArea::Dispose() { - if (m_hEditCtrl != NULL) { - VERIFY(::DestroyWindow(m_hEditCtrl)); - m_hEditCtrl = NULL; - } AwtTextComponent::Dispose(); } @@ -91,10 +83,6 @@ } } -void AwtTextArea::EditGetSel(CHARRANGE &cr) { - SendMessage(EM_EXGETSEL, 0, reinterpret_cast<LPARAM>(&cr)); -} - /* Count how many '\n's are there in jStr */ size_t AwtTextArea::CountNewLines(JNIEnv *env, jstring jStr, size_t maxlen) { @@ -149,159 +137,6 @@ return retValue; } -/* - * This routine is a window procedure for the subclass of the standard edit control - * used to generate context menu. RichEdit controls don't have built-in context menu. - * To implement this functionality we have to create an invisible edit control and - * forward WM_CONTEXTMENU messages from a RichEdit control to this helper edit control. - * While the edit control context menu is active we intercept the message generated in - * response to particular item selection and forward it back to the RichEdit control. - * (See AwtTextArea::WmContextMenu for more details). - */ -LRESULT -AwtTextArea::EditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { - - static BOOL bContextMenuActive = FALSE; - - LRESULT retValue = 0; - MsgRouting mr = mrDoDefault; - - DASSERT(::IsWindow(::GetParent(hWnd))); - - switch (message) { - case WM_UNDO: - case WM_CUT: - case WM_COPY: - case WM_PASTE: - case WM_CLEAR: - case EM_SETSEL: - if (bContextMenuActive) { - ::SendMessage(::GetParent(hWnd), message, wParam, lParam); - mr = mrConsume; - } - break; - case WM_CONTEXTMENU: - bContextMenuActive = TRUE; - break; - } - - if (mr == mrDoDefault) { - DASSERT(sm_pDefWindowProc != NULL); - retValue = ::CallWindowProc(sm_pDefWindowProc, - hWnd, message, wParam, lParam); - } - - if (message == WM_CONTEXTMENU) { - bContextMenuActive = FALSE; - } - - return retValue; -} - -MsgRouting -AwtTextArea::WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) { - /* Use the system provided edit control class to generate context menu. */ - if (m_hEditCtrl == NULL) { - DWORD dwStyle = WS_CHILD; - DWORD dwExStyle = 0; - m_hEditCtrl = ::CreateWindowEx(dwExStyle, - L"EDIT", - L"TEXT", - dwStyle, - 0, 0, 0, 0, - GetHWnd(), - reinterpret_cast<HMENU>( - static_cast<INT_PTR>( - CreateControlID())), - AwtToolkit::GetInstance().GetModuleHandle(), - NULL); - DASSERT(m_hEditCtrl != NULL); - if (sm_pDefWindowProc == NULL) { - sm_pDefWindowProc = (WNDPROC)::GetWindowLongPtr(m_hEditCtrl, - GWLP_WNDPROC); - } - ::SetLastError(0); - INT_PTR ret = ::SetWindowLongPtr(m_hEditCtrl, GWLP_WNDPROC, - (INT_PTR)AwtTextArea::EditProc); - DASSERT(ret != 0 || ::GetLastError() == 0); - } - - /* - * Tricks on the edit control to ensure that its context menu has - * the correct set of enabled items according to the RichEdit state. - */ - ::SetWindowText(m_hEditCtrl, TEXT("TEXT")); - - if (m_bCanUndo == TRUE && SendMessage(EM_CANUNDO)) { - /* Enable 'Undo' item. */ - ::SendMessage(m_hEditCtrl, WM_CHAR, 'A', 0); - } - - { - /* - * Initial selection for the edit control - (0,1). - * This enables 'Cut', 'Copy' and 'Delete' and 'Select All'. - */ - INT nStart = 0; - INT nEnd = 1; - if (SendMessage(EM_SELECTIONTYPE) == SEL_EMPTY) { - /* - * RichEdit selection is empty - clear selection of the edit control. - * This disables 'Cut', 'Copy' and 'Delete'. - */ - nStart = -1; - nEnd = 0; - } else { - - CHARRANGE cr; - EditGetSel(cr); - /* Check if all the text is selected. */ - if (cr.cpMin == 0) { - - int len = ::GetWindowTextLength(GetHWnd()); - if (cr.cpMin == 0 && cr.cpMax >= len) { - /* - * All the text is selected in RichEdit - select all the - * text in the edit control. This disables 'Select All'. - */ - nStart = 0; - nEnd = -1; - } - } - } - ::SendMessage(m_hEditCtrl, EM_SETSEL, (WPARAM)nStart, (LPARAM)nEnd); - } - - /* Disable 'Paste' item if the RichEdit control is read-only. */ - ::SendMessage(m_hEditCtrl, EM_SETREADONLY, - GetStyle() & ES_READONLY ? TRUE : FALSE, 0); - - POINT p; - p.x = xPos; - p.y = yPos; - - /* - * If the context menu is requested with SHIFT+F10 or VK_APPS key, - * we position its top left corner to the center of the RichEdit - * client rect. - */ - if (p.x == -1 && p.y == -1) { - RECT r; - VERIFY(::GetClientRect(GetHWnd(), &r)); - p.x = (r.left + r.right) / 2; - p.y = (r.top + r.bottom) / 2; - VERIFY(::ClientToScreen(GetHWnd(), &p)); - } - - // The context menu steals focus from the proxy. - // So, set the focus-restore flag up. - SetRestoreFocus(TRUE); - ::SendMessage(m_hEditCtrl, WM_CONTEXTMENU, (WPARAM)m_hEditCtrl, MAKELPARAM(p.x, p.y)); - SetRestoreFocus(FALSE); - - return mrConsume; -} - MsgRouting AwtTextArea::WmNcHitTest(UINT x, UINT y, LRESULT& retVal) { @@ -314,27 +149,8 @@ MsgRouting -AwtTextArea::WmNotify(UINT notifyCode) -{ - if (notifyCode == EN_CHANGE) { - /* - * Ignore notifications if the text hasn't been changed. - * EN_CHANGE sent on character formatting changes as well. - */ - if (m_bIgnoreEnChange == FALSE) { - m_bCanUndo = TRUE; - DoCallback("valueChanged", "()V"); - } else { - m_bCanUndo = FALSE; - } - } - return mrDoDefault; -} - -MsgRouting AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic) { - MsgRouting returnVal; /* * RichEdit 1.0 control starts internal message loop if the * left mouse button is pressed while the cursor is not over @@ -486,26 +302,6 @@ } delete msg; return mrConsume; - } else if (msg->message == WM_RBUTTONUP || - (msg->message == WM_SYSKEYDOWN && msg->wParam == VK_F10 && - HIBYTE(::GetKeyState(VK_SHIFT)))) { - POINT p; - if (msg->message == WM_RBUTTONUP) { - VERIFY(::GetCursorPos(&p)); - } else { - p.x = -1; - p.y = -1; - } - - if (!::PostMessage(GetHWnd(), WM_CONTEXTMENU, (WPARAM)GetHWnd(), - MAKELPARAM(p.x, p.y))) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - JNU_ThrowInternalError(env, "Message not posted, native event queue may be full."); - env->ExceptionDescribe(); - env->ExceptionClear(); - } - delete msg; - return mrConsume; } else if (msg->message == WM_MOUSEWHEEL) { // 4417236: If there is an old version of RichEd32.dll which // does not provide the mouse wheel scrolling we have to @@ -596,15 +392,7 @@ // 4417236: end of fix } - /* - * Store the 'synthetic' parameter so that the WM_PASTE security check - * happens only for synthetic events. - */ - m_synthetic = synthetic; - returnVal = AwtComponent::HandleEvent(msg, synthetic); - m_synthetic = FALSE; - - return returnVal; + return AwtTextComponent::HandleEvent(msg, synthetic); }
--- a/src/java.desktop/windows/native/libawt/windows/awt_TextArea.h Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/windows/native/libawt/windows/awt_TextArea.h Thu Oct 16 14:14:57 2014 -0700 @@ -57,17 +57,11 @@ static size_t GetALength(JNIEnv* env, jstring jStr, size_t maxlen); LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); - static LRESULT CALLBACK EditProc(HWND hWnd, UINT message, - WPARAM wParam, LPARAM lParam); MsgRouting WmEnable(BOOL fEnabled); - MsgRouting WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos); - MsgRouting WmNotify(UINT notifyCode); MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT &retVal); MsgRouting HandleEvent(MSG *msg, BOOL synthetic); - INLINE void SetIgnoreEnChange(BOOL b) { m_bIgnoreEnChange = b; } - virtual BOOL InheritsNativeMouseWheelBehavior(); virtual void Reshape(int x, int y, int w, int h); @@ -81,22 +75,7 @@ protected: void EditSetSel(CHARRANGE &cr); - void EditGetSel(CHARRANGE &cr); private: - // RichEdit 1.0 control generates EN_CHANGE notifications not only - // on text changes, but also on any character formatting change. - // This flag is true when the latter case is detected. - BOOL m_bIgnoreEnChange; - - // RichEdit 1.0 control undoes a character formatting change - // if it is the latest. We don't create our own undo buffer, - // but just prohibit undo in case if the latest operation - // is a formatting change. - BOOL m_bCanUndo; - - HWND m_hEditCtrl; - static WNDPROC sm_pDefWindowProc; - LONG m_lHDeltaAccum; LONG m_lVDeltaAccum;
--- a/src/java.desktop/windows/native/libawt/windows/awt_TextComponent.cpp Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/windows/native/libawt/windows/awt_TextComponent.cpp Thu Oct 16 14:14:57 2014 -0700 @@ -66,6 +66,8 @@ m_lLastPos = -1; m_isLFonly = FALSE; m_EOLchecked = FALSE; + m_hEditCtrl = NULL; + m_bIgnoreEnChange = FALSE; // javaEventsMask = 0; // accessibility support } @@ -213,6 +215,16 @@ return c; } +void AwtTextComponent::Dispose() +{ + if (m_hEditCtrl != NULL) { + VERIFY(::DestroyWindow(m_hEditCtrl)); + m_hEditCtrl = NULL; + } + AwtComponent::Dispose(); +} + + LRESULT AwtTextComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { @@ -322,7 +334,16 @@ AwtTextComponent::WmNotify(UINT notifyCode) { if (notifyCode == EN_CHANGE) { - DoCallback("valueChanged", "()V"); + /* + * Ignore notifications if the text hasn't been changed. + * EN_CHANGE sent on character formatting changes as well. + */ + if (m_bIgnoreEnChange == FALSE) { + m_bCanUndo = TRUE; + DoCallback("valueChanged", "()V"); + } else { + m_bCanUndo = FALSE; + } } return mrDoDefault; } @@ -337,6 +358,28 @@ { MsgRouting returnVal; + if (msg->message == WM_RBUTTONUP || + (msg->message == WM_SYSKEYDOWN && msg->wParam == VK_F10 && + HIBYTE(::GetKeyState(VK_SHIFT)))) { + POINT p; + if (msg->message == WM_RBUTTONUP) { + VERIFY(::GetCursorPos(&p)); + } else { + p.x = -1; + p.y = -1; + } + + if (!::PostMessage(GetHWnd(), WM_CONTEXTMENU, (WPARAM)GetHWnd(), + MAKELPARAM(p.x, p.y))) { + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + JNU_ThrowInternalError(env, "Message not posted, native event queue may be full."); + env->ExceptionDescribe(); + env->ExceptionClear(); + } + delete msg; + return mrConsume; + } + /* * Store the 'synthetic' parameter so that the WM_PASTE security check * happens only for synthetic events. @@ -701,6 +744,10 @@ SendMessage(EM_SETBKGNDCOLOR, (WPARAM)FALSE, (LPARAM)GetBackgroundColor()); } +void AwtTextComponent::EditGetSel(CHARRANGE &cr) { + SendMessage(EM_EXGETSEL, 0, reinterpret_cast<LPARAM>(&cr)); +} + /************************************************************************ * WTextComponentPeer native methods @@ -983,6 +1030,161 @@ } +/* + * This routine is a window procedure for the subclass of the standard edit control + * used to generate context menu. RichEdit controls don't have built-in context menu. + * To implement this functionality we have to create an invisible edit control and + * forward WM_CONTEXTMENU messages from a RichEdit control to this helper edit control. + * While the edit control context menu is active we intercept the message generated in + * response to particular item selection and forward it back to the RichEdit control. + * (See AwtTextArea::WmContextMenu for more details). + */ + +WNDPROC AwtTextComponent::sm_pDefWindowProc = NULL; + +LRESULT +AwtTextComponent::EditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { + + static BOOL bContextMenuActive = FALSE; + + LRESULT retValue = 0; + MsgRouting mr = mrDoDefault; + + DASSERT(::IsWindow(::GetParent(hWnd))); + + switch (message) { + case WM_UNDO: + case WM_CUT: + case WM_COPY: + case WM_PASTE: + case WM_CLEAR: + case EM_SETSEL: + if (bContextMenuActive) { + ::SendMessage(::GetParent(hWnd), message, wParam, lParam); + mr = mrConsume; + } + break; + case WM_CONTEXTMENU: + bContextMenuActive = TRUE; + break; + } + + if (mr == mrDoDefault) { + DASSERT(sm_pDefWindowProc != NULL); + retValue = ::CallWindowProc(sm_pDefWindowProc, + hWnd, message, wParam, lParam); + } + + if (message == WM_CONTEXTMENU) { + bContextMenuActive = FALSE; + } + + return retValue; +} + +MsgRouting +AwtTextComponent::WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) { + /* Use the system provided edit control class to generate context menu. */ + if (m_hEditCtrl == NULL) { + DWORD dwStyle = WS_CHILD; + DWORD dwExStyle = 0; + m_hEditCtrl = ::CreateWindowEx(dwExStyle, + L"EDIT", + L"TEXT", + dwStyle, + 0, 0, 0, 0, + GetHWnd(), + reinterpret_cast<HMENU>( + static_cast<INT_PTR>( + CreateControlID())), + AwtToolkit::GetInstance().GetModuleHandle(), + NULL); + DASSERT(m_hEditCtrl != NULL); + if (sm_pDefWindowProc == NULL) { + sm_pDefWindowProc = (WNDPROC)::GetWindowLongPtr(m_hEditCtrl, + GWLP_WNDPROC); + } + ::SetLastError(0); + INT_PTR ret = ::SetWindowLongPtr(m_hEditCtrl, GWLP_WNDPROC, + (INT_PTR)AwtTextArea::EditProc); + DASSERT(ret != 0 || ::GetLastError() == 0); + } + + /* + * Tricks on the edit control to ensure that its context menu has + * the correct set of enabled items according to the RichEdit state. + */ + ::SetWindowText(m_hEditCtrl, TEXT("TEXT")); + + if (m_bCanUndo == TRUE && SendMessage(EM_CANUNDO)) { + /* Enable 'Undo' item. */ + ::SendMessage(m_hEditCtrl, WM_CHAR, 'A', 0); + } + + { + /* + * Initial selection for the edit control - (0,1). + * This enables 'Cut', 'Copy' and 'Delete' and 'Select All'. + */ + INT nStart = 0; + INT nEnd = 1; + if (SendMessage(EM_SELECTIONTYPE) == SEL_EMPTY) { + /* + * RichEdit selection is empty - clear selection of the edit control. + * This disables 'Cut', 'Copy' and 'Delete'. + */ + nStart = -1; + nEnd = 0; + } else { + + CHARRANGE cr; + EditGetSel(cr); + /* Check if all the text is selected. */ + if (cr.cpMin == 0) { + + int len = ::GetWindowTextLength(GetHWnd()); + if (cr.cpMin == 0 && cr.cpMax >= len) { + /* + * All the text is selected in RichEdit - select all the + * text in the edit control. This disables 'Select All'. + */ + nStart = 0; + nEnd = -1; + } + } + } + ::SendMessage(m_hEditCtrl, EM_SETSEL, (WPARAM)nStart, (LPARAM)nEnd); + } + + /* Disable 'Paste' item if the RichEdit control is read-only. */ + ::SendMessage(m_hEditCtrl, EM_SETREADONLY, + GetStyle() & ES_READONLY ? TRUE : FALSE, 0); + + POINT p; + p.x = xPos; + p.y = yPos; + + /* + * If the context menu is requested with SHIFT+F10 or VK_APPS key, + * we position its top left corner to the center of the RichEdit + * client rect. + */ + if (p.x == -1 && p.y == -1) { + RECT r; + VERIFY(::GetClientRect(GetHWnd(), &r)); + p.x = (r.left + r.right) / 2; + p.y = (r.top + r.bottom) / 2; + VERIFY(::ClientToScreen(GetHWnd(), &p)); + } + + // The context menu steals focus from the proxy. + // So, set the focus-restore flag up. + SetRestoreFocus(TRUE); + ::SendMessage(m_hEditCtrl, WM_CONTEXTMENU, (WPARAM)m_hEditCtrl, MAKELPARAM(p.x, p.y)); + SetRestoreFocus(FALSE); + + return mrConsume; +} // // Accessibility support
--- a/src/java.desktop/windows/native/libawt/windows/awt_TextComponent.h Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/windows/native/libawt/windows/awt_TextComponent.h Thu Oct 16 14:14:57 2014 -0700 @@ -47,6 +47,8 @@ static AwtTextComponent* Create(jobject self, jobject parent, BOOL isMultiline); + virtual void Dispose(); + virtual LPCTSTR GetClassName(); LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); @@ -83,6 +85,8 @@ MsgRouting HandleEvent(MSG *msg, BOOL synthetic); MsgRouting WmPaste(); + INLINE void SetIgnoreEnChange(BOOL b) { m_bIgnoreEnChange = b; } + virtual BOOL IsFocusingMouseMessage(MSG *pMsg); /* To be fully implemented in a future release @@ -115,11 +119,24 @@ INLINE VOID SetEndSelectionPos(LONG lPos) { m_lEndPos = lPos; } INLINE VOID SetLastSelectionPos(LONG lPos) { m_lLastPos = lPos; } + void EditGetSel(CHARRANGE &cr); + // Used to prevent untrusted code from synthesizing a WM_PASTE message // by posting a <CTRL>-V KeyEvent BOOL m_synthetic; LONG EditGetCharFromPos(POINT& pt); + // RichEdit 1.0 control generates EN_CHANGE notifications not only + // on text changes, but also on any character formatting change. + // This flag is true when the latter case is detected. + BOOL m_bIgnoreEnChange; + + // RichEdit 1.0 control undoes a character formatting change + // if it is the latest. We don't create our own undo buffer, + // but just prohibit undo in case if the latest operation + // is a formatting change. + BOOL m_bCanUndo; + /***************************************************************** * Inner class OleCallback declaration. */ @@ -166,6 +183,13 @@ static OleCallback sm_oleCallback; + static WNDPROC sm_pDefWindowProc; + HWND m_hEditCtrl; + + static LRESULT CALLBACK EditProc(HWND hWnd, UINT message, + WPARAM wParam, LPARAM lParam); + MsgRouting WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos); + // // Accessibility support //
--- a/src/java.desktop/windows/native/libawt/windows/awt_TextField.cpp Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/windows/native/libawt/windows/awt_TextField.cpp Thu Oct 16 14:14:57 2014 -0700 @@ -249,13 +249,7 @@ } } - /* - * Store the 'synthetic' parameter so that the WM_PASTE security check - * happens only for synthetic events. - */ - m_synthetic = synthetic; - returnVal = AwtComponent::HandleEvent(msg, synthetic); - m_synthetic = FALSE; + returnVal = AwtTextComponent::HandleEvent(msg, synthetic); if(systemBeeperEnabled){ SystemParametersInfo(SPI_SETBEEP, 1, NULL, 0);
--- a/src/java.desktop/windows/native/libsplashscreen/splashscreen_sys.c Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.desktop/windows/native/libsplashscreen/splashscreen_sys.c Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, 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 @@ -213,6 +213,14 @@ void SplashRedrawWindow(Splash * splash) { + if (!SplashIsStillLooping(splash)) { + KillTimer(splash->hWnd, 0); + } + + if (splash->currentFrame < 0) { + return; + } + SplashUpdateScreenData(splash); if (splash->isLayered) { BLENDFUNCTION bf; @@ -303,9 +311,6 @@ time = 0; SetTimer(splash->hWnd, 0, time, NULL); } - else { - KillTimer(splash->hWnd, 0); - } } void SplashReconfigureNow(Splash * splash) {
--- a/src/java.logging/share/classes/java/util/logging/LogRecord.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.logging/share/classes/java/util/logging/LogRecord.java Thu Oct 16 14:14:57 2014 -0700 @@ -509,7 +509,13 @@ // If necessary, try to regenerate the resource bundle. if (resourceBundleName != null) { try { - resourceBundle = ResourceBundle.getBundle(resourceBundleName); + // use system class loader to ensure the ResourceBundle + // instance is a different instance than null loader uses + final ResourceBundle bundle = + ResourceBundle.getBundle(resourceBundleName, + Locale.getDefault(), + ClassLoader.getSystemClassLoader()); + resourceBundle = bundle; } catch (MissingResourceException ex) { // This is not a good place to throw an exception, // so we simply leave the resourceBundle null.
--- a/src/java.logging/share/classes/java/util/logging/Logger.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.logging/share/classes/java/util/logging/Logger.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2014, 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 @@ -1937,6 +1937,9 @@ } setCallersClassLoaderRef(callersClass); + if (isSystemLogger && getCallersClassLoader() != null) { + checkPermission(); + } if (findResourceBundle(name, true) == null) { // We've failed to find an expected ResourceBundle. // unset the caller's ClassLoader since we were unable to find the @@ -2170,11 +2173,13 @@ return trb; } final String rbName = isSystemLogger - ? trb.resourceBundleName + // ancestor of a system logger is expected to be a system logger. + // ignore resource bundle name if it's not. + ? (target.isSystemLogger ? trb.resourceBundleName : null) : target.getResourceBundleName(); if (rbName != null) { return LoggerBundle.get(rbName, - findResourceBundle(rbName, true)); + findResourceBundle(rbName, true)); } target = isSystemLogger ? target.parent : target.getParent(); }
--- a/src/java.naming/share/classes/javax/naming/spi/NamingManager.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.naming/share/classes/javax/naming/spi/NamingManager.java Thu Oct 16 14:14:57 2014 -0700 @@ -25,9 +25,7 @@ package javax.naming.spi; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.StringTokenizer; +import java.util.*; import java.net.MalformedURLException; import javax.naming.*; @@ -625,15 +623,28 @@ /** * Creates an initial context using the specified environment * properties. - *<p> - * If an InitialContextFactoryBuilder has been installed, - * it is used to create the factory for creating the initial context. - * Otherwise, the class specified in the - * <tt>Context.INITIAL_CONTEXT_FACTORY</tt> environment property is used. - * Note that an initial context factory (an object that implements the - * InitialContextFactory interface) must be public and must have a - * public constructor that accepts no arguments. - * + * <p> + * This is done as follows: + * <ul> + * <li>If an InitialContextFactoryBuilder has been installed, + * it is used to create the factory for creating the initial + * context</li> + * <li>Otherwise, the class specified in the + * <tt>Context.INITIAL_CONTEXT_FACTORY</tt> environment property + * is used + * <ul> + * <li>First, the {@linkplain java.util.ServiceLoader ServiceLoader} + * mechanism tries to locate an {@code InitialContextFactory} + * provider using the current thread's context class loader</li> + * <li>Failing that, this implementation tries to locate a suitable + * {@code InitialContextFactory} using a built-in mechanism + * <br> + * (Note that an initial context factory (an object that implements + * the InitialContextFactory interface) must be public and must have + * a public constructor that accepts no arguments)</li> + * </ul> + * </li> + * </ul> * @param env The possibly null environment properties used when * creating the context. * @return A non-null initial context. @@ -649,11 +660,11 @@ */ public static Context getInitialContext(Hashtable<?,?> env) throws NamingException { - InitialContextFactory factory; + InitialContextFactory factory = null; InitialContextFactoryBuilder builder = getInitialContextFactoryBuilder(); if (builder == null) { - // No factory installed, use property + // No builder installed, use property // Get initial context factory class name String className = env != null ? @@ -666,16 +677,39 @@ throw ne; } + ServiceLoader<InitialContextFactory> loader = + ServiceLoader.load(InitialContextFactory.class); + + Iterator<InitialContextFactory> iterator = loader.iterator(); try { - factory = (InitialContextFactory) - helper.loadClass(className).newInstance(); - } catch(Exception e) { + while (iterator.hasNext()) { + InitialContextFactory f = iterator.next(); + if (f.getClass().getName().equals(className)) { + factory = f; + break; + } + } + } catch (ServiceConfigurationError e) { NoInitialContextException ne = - new NoInitialContextException( - "Cannot instantiate class: " + className); + new NoInitialContextException( + "Cannot load initial context factory " + + "'" + className + "'"); ne.setRootCause(e); throw ne; } + + if (factory == null) { + try { + factory = (InitialContextFactory) + helper.loadClass(className).newInstance(); + } catch (Exception e) { + NoInitialContextException ne = + new NoInitialContextException( + "Cannot instantiate class: " + className); + ne.setRootCause(e); + throw ne; + } + } } else { factory = builder.createInitialContextFactory(env); }
--- a/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Context.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5Context.java Thu Oct 16 14:14:57 2014 -0700 @@ -244,8 +244,11 @@ * establishment. */ public final void requestCredDeleg(boolean value) throws GSSException { - if (state == STATE_NEW && isInitiator()) - credDelegState = value; + if (state == STATE_NEW && isInitiator()) { + if (myCred == null || !(myCred instanceof Krb5ProxyCredential)) { + credDelegState = value; + } + } } /**
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/Init.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/Init.java Thu Oct 16 14:14:57 2014 -0700 @@ -25,6 +25,8 @@ import java.io.InputStream; import java.security.AccessController; import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; import java.util.ArrayList; import java.util.List; @@ -35,6 +37,7 @@ import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper; import com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithm; import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer; +import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException; import com.sun.org.apache.xml.internal.security.keys.keyresolver.KeyResolver; import com.sun.org.apache.xml.internal.security.transforms.Transform; import com.sun.org.apache.xml.internal.security.utils.ElementProxy; @@ -118,43 +121,50 @@ log.log(java.util.logging.Level.FINE, "Registering default algorithms"); } try { - // - // Bind the default prefixes - // - ElementProxy.registerDefaultPrefixes(); + AccessController.doPrivileged(new PrivilegedExceptionAction<Void>(){ + @Override public Void run() throws XMLSecurityException { + // + // Bind the default prefixes + // + ElementProxy.registerDefaultPrefixes(); - // - // Set the default Transforms - // - Transform.registerDefaultAlgorithms(); + // + // Set the default Transforms + // + Transform.registerDefaultAlgorithms(); - // - // Set the default signature algorithms - // - SignatureAlgorithm.registerDefaultAlgorithms(); + // + // Set the default signature algorithms + // + SignatureAlgorithm.registerDefaultAlgorithms(); - // - // Set the default JCE algorithms - // - JCEMapper.registerDefaultAlgorithms(); + // + // Set the default JCE algorithms + // + JCEMapper.registerDefaultAlgorithms(); - // - // Set the default c14n algorithms - // - Canonicalizer.registerDefaultAlgorithms(); + // + // Set the default c14n algorithms + // + Canonicalizer.registerDefaultAlgorithms(); - // - // Register the default resolvers - // - ResourceResolver.registerDefaultResolvers(); + // + // Register the default resolvers + // + ResourceResolver.registerDefaultResolvers(); - // - // Register the default key resolvers - // - KeyResolver.registerDefaultResolvers(); - } catch (Exception ex) { - log.log(java.util.logging.Level.SEVERE, ex.getMessage(), ex); - ex.printStackTrace(); + // + // Register the default key resolvers + // + KeyResolver.registerDefaultResolvers(); + + return null; + } + }); + } catch (PrivilegedActionException ex) { + XMLSecurityException xse = (XMLSecurityException)ex.getException(); + log.log(java.util.logging.Level.SEVERE, xse.getMessage(), xse); + xse.printStackTrace(); } }
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java Thu Oct 16 14:14:57 2014 -0700 @@ -27,6 +27,7 @@ import com.sun.org.apache.xml.internal.security.encryption.XMLCipher; import com.sun.org.apache.xml.internal.security.signature.XMLSignature; +import com.sun.org.apache.xml.internal.security.utils.JavaUtils; import org.w3c.dom.Element; @@ -49,8 +50,11 @@ * * @param id * @param algorithm + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register the JCE algorithm */ public static void register(String id, Algorithm algorithm) { + JavaUtils.checkRegisterPermission(); algorithmsMap.put(id, algorithm); } @@ -296,8 +300,11 @@ /** * Sets the default Provider for obtaining the security algorithms * @param provider the default providerId. + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to set the JCE provider */ public static void setProviderId(String provider) { + JavaUtils.checkRegisterPermission(); providerName = provider; }
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java Thu Oct 16 14:14:57 2014 -0700 @@ -37,6 +37,7 @@ import com.sun.org.apache.xml.internal.security.signature.XMLSignature; import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException; import com.sun.org.apache.xml.internal.security.utils.Constants; +import com.sun.org.apache.xml.internal.security.utils.JavaUtils; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -314,18 +315,21 @@ } /** - * Registers implementing class of the Transform algorithm with algorithmURI + * Registers implementing class of the SignatureAlgorithm with algorithmURI * - * @param algorithmURI algorithmURI URI representation of <code>Transform algorithm</code>. + * @param algorithmURI algorithmURI URI representation of <code>SignatureAlgorithm</code>. * @param implementingClass <code>implementingClass</code> the implementing class of * {@link SignatureAlgorithmSpi} * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered * @throws XMLSignatureException + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register the signature algorithm */ @SuppressWarnings("unchecked") public static void register(String algorithmURI, String implementingClass) throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, XMLSignatureException { + JavaUtils.checkRegisterPermission(); if (log.isLoggable(java.util.logging.Level.FINE)) { log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass); } @@ -352,15 +356,18 @@ /** * Registers implementing class of the Transform algorithm with algorithmURI * - * @param algorithmURI algorithmURI URI representation of <code>Transform algorithm</code>. + * @param algorithmURI algorithmURI URI representation of <code>SignatureAlgorithm</code>. * @param implementingClass <code>implementingClass</code> the implementing class of * {@link SignatureAlgorithmSpi} * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered * @throws XMLSignatureException + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register the signature algorithm */ public static void register(String algorithmURI, Class<? extends SignatureAlgorithmSpi> implementingClass) throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, XMLSignatureException { + JavaUtils.checkRegisterPermission(); if (log.isLoggable(java.util.logging.Level.FINE)) { log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass); }
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java Thu Oct 16 14:14:57 2014 -0700 @@ -41,6 +41,7 @@ import com.sun.org.apache.xml.internal.security.c14n.implementations.Canonicalizer20010315WithComments; import com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerPhysical; import com.sun.org.apache.xml.internal.security.exceptions.AlgorithmAlreadyRegisteredException; +import com.sun.org.apache.xml.internal.security.utils.JavaUtils; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -142,10 +143,13 @@ * @param algorithmURI * @param implementingClass * @throws AlgorithmAlreadyRegisteredException + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register the canonicalizer */ @SuppressWarnings("unchecked") public static void register(String algorithmURI, String implementingClass) throws AlgorithmAlreadyRegisteredException, ClassNotFoundException { + JavaUtils.checkRegisterPermission(); // check whether URI is already registered Class<? extends CanonicalizerSpi> registeredClass = canonicalizerHash.get(algorithmURI); @@ -166,9 +170,12 @@ * @param algorithmURI * @param implementingClass * @throws AlgorithmAlreadyRegisteredException + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register the canonicalizer */ - public static void register(String algorithmURI, Class<CanonicalizerSpi> implementingClass) + public static void register(String algorithmURI, Class<? extends CanonicalizerSpi> implementingClass) throws AlgorithmAlreadyRegisteredException, ClassNotFoundException { + JavaUtils.checkRegisterPermission(); // check whether URI is already registered Class<? extends CanonicalizerSpi> registeredClass = canonicalizerHash.get(algorithmURI);
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java Thu Oct 16 14:14:57 2014 -0700 @@ -42,6 +42,7 @@ import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SKIResolver; import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SubjectNameResolver; import com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver; +import com.sun.org.apache.xml.internal.security.utils.JavaUtils; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -175,9 +176,12 @@ * @throws InstantiationException * @throws IllegalAccessException * @throws ClassNotFoundException + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register the key resolver */ public static void register(String className, boolean globalResolver) throws ClassNotFoundException, IllegalAccessException, InstantiationException { + JavaUtils.checkRegisterPermission(); KeyResolverSpi keyResolverSpi = (KeyResolverSpi) Class.forName(className).newInstance(); keyResolverSpi.setGlobalResolver(globalResolver); @@ -195,8 +199,11 @@ * * @param className * @param globalResolver Whether the KeyResolverSpi is a global resolver or not + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register the key resolver */ public static void registerAtStart(String className, boolean globalResolver) { + JavaUtils.checkRegisterPermission(); KeyResolverSpi keyResolverSpi = null; Exception ex = null; try { @@ -228,11 +235,14 @@ * * @param keyResolverSpi a KeyResolverSpi instance to register * @param start whether to register the KeyResolverSpi at the start of the list or not + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register the key resolver */ public static void register( KeyResolverSpi keyResolverSpi, boolean start ) { + JavaUtils.checkRegisterPermission(); KeyResolver resolver = new KeyResolver(keyResolverSpi); if (start) { resolverVector.add(0, resolver); @@ -254,9 +264,12 @@ * @throws InstantiationException * @throws IllegalAccessException * @throws ClassNotFoundException + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register the key resolver */ public static void registerClassNames(List<String> classNames) throws ClassNotFoundException, IllegalAccessException, InstantiationException { + JavaUtils.checkRegisterPermission(); List<KeyResolver> keyResolverList = new ArrayList<KeyResolver>(classNames.size()); for (String className : classNames) { KeyResolverSpi keyResolverSpi =
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/Transform.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/Transform.java Thu Oct 16 14:14:57 2014 -0700 @@ -46,6 +46,7 @@ import com.sun.org.apache.xml.internal.security.transforms.implementations.TransformXSLT; import com.sun.org.apache.xml.internal.security.utils.Constants; import com.sun.org.apache.xml.internal.security.utils.HelperNodeList; +import com.sun.org.apache.xml.internal.security.utils.JavaUtils; import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy; import com.sun.org.apache.xml.internal.security.utils.XMLUtils; import org.w3c.dom.Document; @@ -181,11 +182,14 @@ * class of {@link TransformSpi} * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI * is already registered + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register the transform */ @SuppressWarnings("unchecked") public static void register(String algorithmURI, String implementingClass) throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, InvalidTransformException { + JavaUtils.checkRegisterPermission(); // are we already registered? Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI); if (transformSpi != null) { @@ -206,9 +210,12 @@ * class of {@link TransformSpi} * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI * is already registered + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register the transform */ public static void register(String algorithmURI, Class<? extends TransformSpi> implementingClass) throws AlgorithmAlreadyRegisteredException { + JavaUtils.checkRegisterPermission(); // are we already registered? Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI); if (transformSpi != null) {
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/ElementProxy.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/ElementProxy.java Thu Oct 16 14:14:57 2014 -0700 @@ -468,9 +468,12 @@ * @param namespace * @param prefix * @throws XMLSecurityException + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to set the default prefix */ public static void setDefaultPrefix(String namespace, String prefix) throws XMLSecurityException { + JavaUtils.checkRegisterPermission(); if (prefixMappings.containsValue(prefix)) { String storedPrefix = prefixMappings.get(namespace); if (!storedPrefix.equals(prefix)) {
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/JavaUtils.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/JavaUtils.java Thu Oct 16 14:14:57 2014 -0700 @@ -28,6 +28,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.security.SecurityPermission; /** * A collection of different, general-purpose methods for JAVA-specific things @@ -39,6 +40,10 @@ private static java.util.logging.Logger log = java.util.logging.Logger.getLogger(JavaUtils.class.getName()); + private static final SecurityPermission REGISTER_PERMISSION = + new SecurityPermission( + "com.sun.org.apache.xml.internal.security.register"); + private JavaUtils() { // we don't allow instantiation } @@ -147,6 +152,23 @@ } /** + * Throws a {@code SecurityException} if a security manager is installed + * and the caller is not allowed to register an implementation of an + * algorithm, transform, or other security sensitive XML Signature function. + * + * @throws SecurityException if a security manager is installed and the + * caller has not been granted the + * {@literal "com.sun.org.apache.xml.internal.security.register"} + * {@code SecurityPermission} + */ + public static void checkRegisterPermission() { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + sm.checkPermission(REGISTER_PERMISSION); + } + } + + /** * Converts an ASN.1 DSA value to a XML Signature DSA Value. * * The JCE DSA Signature algorithm creates ASN.1 encoded (r,s) value
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/XMLUtils.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/XMLUtils.java Thu Oct 16 14:14:57 2014 -0700 @@ -80,32 +80,44 @@ /** * Set the prefix for the digital signature namespace * @param prefix the new prefix for the digital signature namespace + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to set the prefix */ public static void setDsPrefix(String prefix) { + JavaUtils.checkRegisterPermission(); dsPrefix = prefix; } /** * Set the prefix for the digital signature 1.1 namespace * @param prefix the new prefix for the digital signature 1.1 namespace + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to set the prefix */ public static void setDs11Prefix(String prefix) { + JavaUtils.checkRegisterPermission(); ds11Prefix = prefix; } /** * Set the prefix for the encryption namespace * @param prefix the new prefix for the encryption namespace + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to set the prefix */ public static void setXencPrefix(String prefix) { + JavaUtils.checkRegisterPermission(); xencPrefix = prefix; } /** * Set the prefix for the encryption namespace 1.1 * @param prefix the new prefix for the encryption namespace 1.1 + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to set the prefix */ public static void setXenc11Prefix(String prefix) { + JavaUtils.checkRegisterPermission(); xenc11Prefix = prefix; }
--- a/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java Thu Oct 16 12:02:05 2014 -0700 +++ b/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java Thu Oct 16 14:14:57 2014 -0700 @@ -27,6 +27,7 @@ import java.util.Map; import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput; +import com.sun.org.apache.xml.internal.security.utils.JavaUtils; import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverDirectHTTP; import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment; import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverLocalFilesystem; @@ -199,9 +200,12 @@ * the class cannot be registered. * * @param className the name of the ResourceResolverSpi class to be registered + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register a resource resolver */ @SuppressWarnings("unchecked") public static void register(String className) { + JavaUtils.checkRegisterPermission(); try { Class<ResourceResolverSpi> resourceResolverClass = (Class<ResourceResolverSpi>) Class.forName(className); @@ -216,9 +220,12 @@ * list. This method logs a warning if the class cannot be registered. * * @param className the name of the ResourceResolverSpi class to be registered + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register a resource resolver */ @SuppressWarnings("unchecked") public static void registerAtStart(String className) { + JavaUtils.checkRegisterPermission(); try { Class<ResourceResolverSpi> resourceResolverClass = (Class<ResourceResolverSpi>) Class.forName(className); @@ -233,8 +240,11 @@ * cannot be registered. * @param className * @param start + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register a resource resolver */ public static void register(Class<? extends ResourceResolverSpi> className, boolean start) { + JavaUtils.checkRegisterPermission(); try { ResourceResolverSpi resourceResolverSpi = className.newInstance(); register(resourceResolverSpi, start); @@ -250,8 +260,11 @@ * cannot be registered. * @param resourceResolverSpi * @param start + * @throws SecurityException if a security manager is installed and the + * caller does not have permission to register a resource resolver */ public static void register(ResourceResolverSpi resourceResolverSpi, boolean start) { + JavaUtils.checkRegisterPermission(); synchronized(resolverList) { if (start) { resolverList.add(0, new ResourceResolver(resourceResolverSpi));
--- a/test/com/sun/tools/attach/StartManagementAgent.java Thu Oct 16 12:02:05 2014 -0700 +++ b/test/com/sun/tools/attach/StartManagementAgent.java Thu Oct 16 14:14:57 2014 -0700 @@ -53,7 +53,9 @@ public static void main(String[] args) throws Throwable { ProcessThread processThread = null; try { + System.out.println("Starting test application"); processThread = RunnerUtil.startApplication(); + System.out.println("Application started"); runTests(processThread.getPid()); } catch (Throwable t) { System.out.println("StartManagementAgent got unexpected exception: " + t); @@ -70,6 +72,7 @@ // Try calling with null argument boolean exception = false; try { + System.out.println("Starting management agent with null"); vm.startManagementAgent(null); } catch (NullPointerException e) { exception = true; @@ -86,6 +89,7 @@ } p.put("com.sun.management.config.file", f.getAbsolutePath()); try { + System.out.println("Starting management agent with bogus port"); vm.startManagementAgent(p); } catch(AttachOperationFailedException ex) { // We expect parsing of "apa" above to fail, but if the file path @@ -93,6 +97,9 @@ if (!ex.getMessage().contains("Invalid com.sun.management.jmxremote.port number")) { throw ex; } + ex.printStackTrace(System.err); + } catch (Throwable t) { + t.printStackTrace(System.err); } } @@ -134,14 +141,19 @@ } public static void testLocalAgent(VirtualMachine vm) throws Exception { + System.out.println("Getting VM properties"); Properties agentProps = vm.getAgentProperties(); String address = (String) agentProps.get(LOCAL_CONNECTOR_ADDRESS_PROP); if (address != null) { throw new Exception("Local management agent already started"); } + System.out.println("Starting local agent"); + String result = vm.startLocalManagementAgent(); + System.out.println("Agent started"); + // try to parse the return value as a JMXServiceURL new JMXServiceURL(result);
--- a/test/java/awt/Focus/SortingFPT/JDK8048887.java Thu Oct 16 12:02:05 2014 -0700 +++ b/test/java/awt/Focus/SortingFPT/JDK8048887.java Thu Oct 16 14:14:57 2014 -0700 @@ -26,7 +26,7 @@ @bug 8048887 @summary Tests SortingFTP for an exception caused by the tim-sort algo. @author anton.tarasov: area=awt.focus - @run main JDK8040632 + @run main JDK8048887 */ import javax.swing.JFrame;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/GraphicsEnvironment/TestDetectHeadless/TestDetectHeadless.java Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2014, 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. + */ + +/* + * Portions Copyright (c) 2014 IBM Corporation + */ + +public class TestDetectHeadless { + public static void main(String[] args) throws Exception { + Class.forName("javax.swing.plaf.basic.BasicInternalFrameTitlePane"); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/GraphicsEnvironment/TestDetectHeadless/TestDetectHeadless.sh Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,47 @@ +#!/bin/sh + +# +# Copyright (c) 2014, 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. +# + +# +# Portions Copyright (c) 2014 IBM Corporation +# + +# @test +# @bug 8058930 +# @summary java.awt.GraphicsEnvironment.getHeadlessProperty() does not work for AIX +# +# @build TestDetectHeadless +# @run shell TestDetectHeadless.sh + +OS=`uname -s` +case "$OS" in + Windows* | CYGWIN* ) + echo "Passed"; exit 0 ;; + * ) unset DISPLAY ;; +esac + +${TESTJAVA}/bin/java ${TESTVMOPTS} \ + -cp ${TESTCLASSES} TestDetectHeadless + +exit $?
--- a/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java Thu Oct 16 12:02:05 2014 -0700 +++ b/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java Thu Oct 16 14:14:57 2014 -0700 @@ -22,6 +22,8 @@ */ import com.oracle.testlibrary.jsr292.Helper; +import com.sun.management.HotSpotDiagnosticMXBean; +import java.lang.management.ManagementFactory; import java.lang.reflect.Method; import java.util.Collection; import java.util.function.Function; @@ -37,6 +39,8 @@ private final static String METHOD_HANDLE_CLASS_NAME = "java.lang.invoke.MethodHandle"; private final static String INTERNAL_FORM_METHOD_NAME = "internalForm"; + private static final double ITERATIONS_TO_CODE_CACHE_SIZE_RATIO + = 45 / (128.0 * 1024 * 1024); /** * Reflection link to {@code j.l.i.MethodHandle.internalForm} method. It is @@ -87,7 +91,35 @@ boolean passed = true; int testCounter = 0; int failCounter = 0; - long iterations = Math.max(1, Helper.TEST_LIMIT / testMethods.size()); + long testCaseNum = testMethods.size(); + long iterations = Math.max(1, Helper.TEST_LIMIT / testCaseNum); + System.out.printf("Number of iterations according to -DtestLimit is %d (%d cases)%n", + iterations, iterations * testCaseNum); + HotSpotDiagnosticMXBean hsDiagBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class); + long codeCacheSize = Long.parseLong( + hsDiagBean.getVMOption("ReservedCodeCacheSize").getValue()); + System.out.printf("Code cache size is %d bytes%n", codeCacheSize); + long iterationsByCodeCacheSize = (long) (codeCacheSize + * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO); + long nonProfiledCodeCacheSize = Long.parseLong( + hsDiagBean.getVMOption("NonProfiledCodeHeapSize").getValue()); + System.out.printf("Non-profiled code cache size is %d bytes%n", nonProfiledCodeCacheSize); + long iterationsByNonProfiledCodeCacheSize = (long) (nonProfiledCodeCacheSize + * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO); + System.out.printf("Number of iterations limited by code cache size is %d (%d cases)%n", + iterationsByCodeCacheSize, iterationsByCodeCacheSize * testCaseNum); + System.out.printf("Number of iterations limited by non-profiled code cache size is %d (%d cases)%n", + iterationsByNonProfiledCodeCacheSize, iterationsByNonProfiledCodeCacheSize * testCaseNum); + iterations = Math.min(iterationsByCodeCacheSize, + Math.min(iterations, iterationsByNonProfiledCodeCacheSize)); + if (iterations == 0) { + System.out.println("Warning: code cache size is too small to provide at" + + " least one iteration! Test will try to do one iteration."); + iterations = 1; + } + System.out.printf("Number of iterations is set to %d (%d cases)%n", + iterations, iterations * testCaseNum); + System.out.flush(); for (long i = 0; i < iterations; i++) { System.err.println(String.format("Iteration %d:", i)); for (TestMethods testMethod : testMethods) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/net/SetFactoryPermission/SetFactoryPermission.java Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2014, 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 8048052 + * @summary Test a series of methods which requires "setFactory" runtime permission + * @run main SetFactoryPermission success + * @run main/othervm/policy=policy.fail SetFactoryPermission fail + * @run main/othervm/policy=policy.success SetFactoryPermission success + */ +import java.net.ServerSocket; +import java.net.Socket; +import java.net.URL; +import java.net.URLConnection; +import java.rmi.server.RMISocketFactory; +import java.security.AccessControlException; + +public class SetFactoryPermission { + static boolean success = false; + + interface Runner { + public void run() throws Exception; + } + + public static void main (String[] args) throws Exception { + if (args.length > 0) { + success = System.getSecurityManager() == null || args[0].equals("success"); + } + + doTest(()->{ + System.out.println("Verify URLConnection.setContentHandlerFactor()"); + URLConnection.setContentHandlerFactory(null); + }); + doTest(()->{ + System.out.println("Verify URL.setURLStreamHandlerFactory()"); + URL.setURLStreamHandlerFactory(null); + }); + doTest(()->{ + System.out.println("Verify ServerSocket.setSocketFactory()"); + ServerSocket.setSocketFactory(null); + }); + doTest(()->{ + System.out.println("Verify Socket.setSocketImplFactory()"); + Socket.setSocketImplFactory(null); + }); + doTest(()->{ + System.out.println("Verify RMISocketFactory.setSocketFactory()"); + RMISocketFactory.setSocketFactory(null); + }); + } + + static void doTest(Runner func) throws Exception { + try { + func.run(); + if (!success) { + throw new RuntimeException("AccessControlException is not thrown. Test failed"); + } + } catch (SecurityException e) { + if (success) { + e.printStackTrace(); + throw new RuntimeException("AccessControlException is thrown unexpectedly. Test failed"); + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/net/SetFactoryPermission/policy.fail Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,3 @@ +grant { + +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/net/SetFactoryPermission/policy.success Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,4 @@ +grant { + permission java.lang.RuntimePermission "setFactory"; +}; +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/net/SocketPermission/SocketPermissionTest.java Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2014, 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 8047031 + * @summary SocketPermission tests for legacy socket types + * @library ../../../lib/testlibrary + * @run testng/othervm/policy=policy SocketPermissionTest + */ +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.MulticastSocket; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketPermission; +import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.Permission; +import java.security.Permissions; +import java.security.PrivilegedAction; +import java.security.ProtectionDomain; +import java.util.Arrays; +import java.util.function.Function; +import java.util.function.IntConsumer; +import static jdk.testlibrary.Utils.getFreePort; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class SocketPermissionTest { + private int freePort = -1; + + //positive tests + @Test(dataProvider = "positiveProvider") + public void testPositive(Function<String, AccessControlContext> genAcc, IntConsumer func) { + String addr = "localhost:" + freePort; + AccessControlContext acc = genAcc.apply(addr); + AccessController.doPrivileged((PrivilegedAction) () -> { + func.accept(freePort); + return null; + }, acc); + } + + //negative tests + @Test(dataProvider = "negativeProvider", expectedExceptions = SecurityException.class) + public void testNegative(AccessControlContext acc, IntConsumer func) { + AccessController.doPrivileged((PrivilegedAction) () -> { + func.accept(freePort); + return null; + }, acc); + } + + @BeforeMethod + public void setFreePort() throws Exception { + freePort = getFreePort(); + } + + @DataProvider + public Object[][] positiveProvider() { + //test for SocketPermission "host:port","connect,resolve"; + Function<String, AccessControlContext> generateAcc1 = (addr) -> getAccessControlContext( + new SocketPermission(addr, "listen, connect,resolve")); + IntConsumer func1 = (i) -> connectSocketTest(i); + IntConsumer func2 = (i) -> connectDatagramSocketTest(i); + + //test for SocketPermission "localhost:1024-","accept"; + Function<String, AccessControlContext> generateAcc2 = (addr) -> getAccessControlContext( + new SocketPermission(addr, "listen,connect,resolve"), + new SocketPermission("localhost:1024-", "accept")); + IntConsumer func3 = (i) -> acceptServerSocketTest(i); + + //test for SocketPermission "229.227.226.221", "connect,accept" + Function<String, AccessControlContext> generateAcc3 = (addr) -> getAccessControlContext( + new SocketPermission(addr, "listen,resolve"), + new SocketPermission("229.227.226.221", "connect,accept")); + IntConsumer func4 = (i) -> sendDatagramPacketTest(i); + IntConsumer func5 = (i) -> joinGroupMulticastTest(i); + + //test for SocketPermission "host:port", "listen" + Function<String, AccessControlContext> generateAcc4 = (addr) -> getAccessControlContext( + new SocketPermission(addr, "listen")); + IntConsumer func6 = (i) -> listenDatagramSocketTest(i); + IntConsumer func7 = (i) -> listenMulticastSocketTest(i); + IntConsumer func8 = (i) -> listenServerSocketTest(i); + + return new Object[][]{ + {generateAcc1, func1}, + {generateAcc1, func2}, + {generateAcc2, func3}, + {generateAcc3, func4}, + {generateAcc3, func5}, + {generateAcc4, func6}, + {generateAcc4, func7}, + {generateAcc4, func8} + }; + } + + @DataProvider + public Object[][] negativeProvider() { + IntConsumer[] funcs = {i -> connectSocketTest(i), + i -> connectDatagramSocketTest(i), i -> acceptServerSocketTest(i), + i -> sendDatagramPacketTest(i), i -> joinGroupMulticastTest(i), + i -> listenDatagramSocketTest(i), i -> listenMulticastSocketTest(i), + i -> listenServerSocketTest(i)}; + return Arrays.stream(funcs).map(f -> { + //Construct an AccessControlContext without SocketPermission + AccessControlContext acc = getAccessControlContext( + new java.io.FilePermission("<<ALL FILES>>", "read,write,execute,delete"), + new java.net.NetPermission("*"), + new java.util.PropertyPermission("*", "read,write"), + new java.lang.reflect.ReflectPermission("*"), + new java.lang.RuntimePermission("*"), + new java.security.SecurityPermission("*"), + new java.io.SerializablePermission("*")); + return new Object[]{acc, f}; + }).toArray(Object[][]::new); + } + + public void connectSocketTest(int port) { + try (ServerSocket server = new ServerSocket(port); + Socket client = new Socket(InetAddress.getLocalHost(), port);) { + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + public void connectDatagramSocketTest(int port) { + String msg = "Hello"; + try { + InetAddress me = InetAddress.getLocalHost(); + try (DatagramSocket ds = new DatagramSocket(port, me)) { + DatagramPacket dp = new DatagramPacket(msg.getBytes(), + msg.length(), me, port); + ds.send(dp); + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + public void acceptServerSocketTest(int port) { + try { + InetAddress me = InetAddress.getLocalHost(); + try (ServerSocket server = new ServerSocket(port)) { + Socket client = new Socket(me, port); + server.accept(); + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + public static void sendDatagramPacketTest(int port) { + String msg = "Hello"; + try { + InetAddress group = InetAddress.getByName("229.227.226.221"); + try (DatagramSocket s = new DatagramSocket(port)) { + DatagramPacket hi = new DatagramPacket(msg.getBytes(), + msg.length(), group, port); + s.send(hi); + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + public void joinGroupMulticastTest(int port) { + try { + InetAddress group = InetAddress.getByName("229.227.226.221"); + try (MulticastSocket s = new MulticastSocket(port)) { + s.joinGroup(group); + s.leaveGroup(group); + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + public void listenDatagramSocketTest(int port) { + try (DatagramSocket ds = new DatagramSocket(port)) { + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + public void listenMulticastSocketTest(int port) { + try (MulticastSocket ms = new MulticastSocket(port)) { + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + public void listenServerSocketTest(int port) { + try (ServerSocket ms = new ServerSocket(port)) { + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + private static AccessControlContext getAccessControlContext(Permission... ps) { + Permissions perms = new Permissions(); + for (Permission p : ps) { + perms.add(p); + } + /* + *Create an AccessControlContext that consist a single protection domain + * with only the permissions calculated above + */ + ProtectionDomain pd = new ProtectionDomain(null, perms); + return new AccessControlContext(new ProtectionDomain[]{pd}); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/net/SocketPermission/policy Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,3 @@ +grant { + permission java.security.AllPermission; +}; \ No newline at end of file
--- a/test/java/security/cert/CertificateFactory/invalidEncodedCerts/DetectInvalidEncoding.java Thu Oct 16 12:02:05 2014 -0700 +++ b/test/java/security/cert/CertificateFactory/invalidEncodedCerts/DetectInvalidEncoding.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, 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 @@ -23,27 +23,548 @@ /** * @test - * @bug 4776466 + * @bug 4776466 8032573 * @summary check that CertificateFactory rejects invalid encoded X.509 certs */ import java.io.*; +import java.util.Collection; +import java.util.List; +import java.util.LinkedList; +import javax.security.auth.x500.X500Principal; +import java.security.GeneralSecurityException; import java.security.cert.*; public class DetectInvalidEncoding { + // Originally found in the test file: + // java/security/cert/CertificateFactory/invalidEncodedCerts/invalidcert.pem + // The first character of the PEM encoding has been changed from "M" to + // "X" to force a failure during decoding. + private static final String INVALID_CERT = + "-----BEGIN CERTIFICATE-----\n" + + "XIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx\n" + + "EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xFTAT\n" + + "BgNVBAoTDEJFQSBXZWJMb2dpYzERMA8GA1UECxMIU2VjdXJpdHkxIzAhBgNVBAMT\n" + + "GkRlbW8gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9zdXBw\n" + + "b3J0QGJlYS5jb20wHhcNMDAwNTMwMjEzODAxWhcNMDQwNTEzMjEzODAxWjCBjDEL\n" + + "MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\n" + + "cmFuY2lzY28xFTATBgNVBAoTDEJFQSBXZWJMb2dpYzEZMBcGA1UEAxMQd2VibG9n\n" + + "aWMuYmVhLmNvbTEeMBwGCSqGSIb3DQEJARYPc3VwcG9ydEBiZWEuY29tMFwwDQYJ\n" + + "KoZIhvcNAQEBBQADSwAwSAJBALdsXEHqKHgs6zj0hU5sXMAUHzoT8kgWXmNkKHXH\n" + + "79qbPh6EfdlriW9G/AbRF/pKrCQu7hhllAxREbqTuSlf2EMCAwEAATANBgkqhkiG\n" + + "9w0BAQQFAANBACgmqflL5m5LNeJGpWx9aIoABCiuDcpw1fFyegsqGX7CBhffcruS\n" + + "1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=\n" + + "-----END CERTIFICATE-----"; + + // Created with keytool: + // keytool -genkeypair -keyalg rsa -keysize 2048 -keystore <KS_FILE> + // -alias root -sigalg SHA256withRSA -dname "CN=Root, O=SomeCompany" + // -validity 730 -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String SINGLE_ROOT_CERT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIDCjCCAfKgAwIBAgIEDUiw+DANBgkqhkiG9w0BAQsFADAlMRQwEgYDVQQKEwtT\n" + + "b21lQ29tcGFueTENMAsGA1UEAxMEUm9vdDAeFw0xNDA4MjgyMTI5MjZaFw0xNjA4\n" + + "MjcyMTI5MjZaMCUxFDASBgNVBAoTC1NvbWVDb21wYW55MQ0wCwYDVQQDEwRSb290\n" + + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0VFecSNdH6CJhPOSG127\n" + + "tuvld4y7GGJ0kQf3Q0b8qgprsXAmn0/bQR+YX7PfS408cFW+q2SWXeY2kC/3chvi\n" + + "2syMsGdUJrDzuMbYsbvKPKyuJ2GJskX3mSbLMJj5Tzhg4qmwbzDTFIJ51yGa1Wmh\n" + + "i2+4PhltqT0TohvSVJlBrOWNhmvwv5UWsF4e2i04rebDZQoWkmD3MpImZXF/HYre\n" + + "9P8NP97vN0xZmh5PySHy2ILXN3ZhTn3tq0YxNSQTaMUfhgoyzWFvZKAnm/tZIh/1\n" + + "oswwEQPIZJ25AUTm9r3YPQXl1hsNdLU0asEVYRsgzGSTX5gCuUY+KzhStzisOcUY\n" + + "uQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV\n" + + "HQ4EFgQUz1FBNixG/KCgcn6FOWzxP1hujG0wDQYJKoZIhvcNAQELBQADggEBAL60\n" + + "ZaNc6eIMbKntGVE/pdxxyKwPdDyAAeEevX23KRWoLbQjHXo5jrfDPhI5k45ztlyU\n" + + "+tIQbc81LlCl88I4dIx0fvEbxjNaAYhFNXwwSQBs2CuEAdRK8hodXbRcEeI+G10F\n" + + "ARIVs2C7JNm/RhxskCWgj6tFIOGaTZ9gHyvlQUEM18sr5fXZlXTqspZCmz3t5XPi\n" + + "5/wYLv6vk7k3G8WzMHbBE0bYI+61cCc8rbMHldtymbwSwiqfKC9y7oPEfRCbzVUe\n" + + "fgrKcOyVWDuw0y0hhsQL/oONjPp4uK/bl9B7T84t4+ihxdocWKx6eyhFvOvZH9t2\n" + + "kUylb9yBUYStwGExMHg=\n" + + "-----END CERTIFICATE-----"; + + // Created with keytool: + // keytool -genkeypair -keyalg rsa -keysize 2048 -keystore <KS_FILE> + // -alias root -sigalg SHA256withRSA + // -dname "CN=Intermed, O=SomeCompany" -validity 730 + // -ext bc:critical=ca:true -ext ku:critical=keyCertSign,cRLSign + // keytool -certreq -keystore <KS_FILE> -sigalg SHA256withRSA + // -alias intermed -dname "CN=Intermed, O=SomeCompany" + // keytool -gencert -keystore <KS_FILE> -alias intermed + // -sigalg SHA256withRSA -validity 730 + // -ext bc:critical=ca:true -ext ku:critical=keyCertSign,cRLSign + private static final String INTERMED_CA_CERT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIDLzCCAhegAwIBAgIEIIgOyDANBgkqhkiG9w0BAQsFADAlMRQwEgYDVQQKEwtT\n" + + "b21lQ29tcGFueTENMAsGA1UEAxMEUm9vdDAeFw0xNDA4MjgyMjUyNDJaFw0xNjA4\n" + + "MDcyMjUyNDJaMCkxFDASBgNVBAoTC1NvbWVDb21wYW55MREwDwYDVQQDEwhJbnRl\n" + + "cm1lZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJEecvTWla8kdWx+\n" + + "HHu5ryfBpJ95I7V4MEajnmzJVZcwvKhDjlDgABDMuVwFEUUSyeOdbWJF3DLKnyMD\n" + + "KTx6/58kuVak3NX2TJ8cmmIlKf1upFbdrEtjYViSnNrApprfO8B3ORdBbO6QDYza\n" + + "IkAWdI5GllFnVkb4yhMUBg3zfhglF+bl3D3lVRlp9bCrUZoNRs+mZjhVbcMn22ej\n" + + "TfG5Y3VpNM4SN8dFIxPQLLk/aao+cmWEQdbQ0R6ydemRukqrw170olSVLeoGGala\n" + + "3D4oJckde8EgNPcghcsdQ6tpGhkpFhmoyzEsuToR7Gq9UT5V2kkqJneiKXqQg4wz\n" + + "vMAlUGECAwEAAaNjMGEwHwYDVR0jBBgwFoAUOw+92bevFoJz96pR1DrAkPPUKb0w\n" + + "DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLbnErBs\n" + + "q/Mhci5XElfjjLZp3GRyMA0GCSqGSIb3DQEBCwUAA4IBAQAq8y2DpkSV31IXZ1vr\n" + + "/Ye+Nj/2NvBydFeHVRGMAN1LJv6/Q42TCSXbr6cDQ4NWQUtPm90yZBYJSznkbShx\n" + + "HOJEE6R8PRJvoUtMm7fJrNtkybTt6jX4j50Lw8gdYB/rgZb4z8ZQZVEo/0zpW4HV\n" + + "Gs+q4z8TkdmLR18hl39sUEsxt99AOBk8NtKKVNfBWq9b0QDhRkXfmqhyeXdDsHOV\n" + + "8ksulsa7hseheHhdjziEOpQugh8qzSea2kFPrLB53VjWfa4qDzEPaNhahho9piCu\n" + + "82XDnOrcEk9KyHWM7sa7vtK7++W+0MXD/p9nkZ6NHrJXweLriU0DXO6ZY3mzNKJK\n" + + "435M\n" + + "-----END CERTIFICATE-----"; + + // Subordinate cert created using keytool, both certs exported to + // files individually, then use openssl to place in a PKCS#7: + // openssl crl2pkcs7 -nocrl -certfile <INTERMED-CERT-PEM> + // -certfile <ROOT-CERT-PEM> -out <P7-DEST-PEM-FILE> + private static final String PKCS7_INTERMED_ROOT_CERTS = + "-----BEGIN PKCS7-----\n" + + "MIIGbgYJKoZIhvcNAQcCoIIGXzCCBlsCAQExADALBgkqhkiG9w0BBwGgggZBMIID\n" + + "LzCCAhegAwIBAgIEIIgOyDANBgkqhkiG9w0BAQsFADAlMRQwEgYDVQQKEwtTb21l\n" + + "Q29tcGFueTENMAsGA1UEAxMEUm9vdDAeFw0xNDA4MjgyMjUyNDJaFw0xNjA4MDcy\n" + + "MjUyNDJaMCkxFDASBgNVBAoTC1NvbWVDb21wYW55MREwDwYDVQQDEwhJbnRlcm1l\n" + + "ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJEecvTWla8kdWx+HHu5\n" + + "ryfBpJ95I7V4MEajnmzJVZcwvKhDjlDgABDMuVwFEUUSyeOdbWJF3DLKnyMDKTx6\n" + + "/58kuVak3NX2TJ8cmmIlKf1upFbdrEtjYViSnNrApprfO8B3ORdBbO6QDYzaIkAW\n" + + "dI5GllFnVkb4yhMUBg3zfhglF+bl3D3lVRlp9bCrUZoNRs+mZjhVbcMn22ejTfG5\n" + + "Y3VpNM4SN8dFIxPQLLk/aao+cmWEQdbQ0R6ydemRukqrw170olSVLeoGGala3D4o\n" + + "Jckde8EgNPcghcsdQ6tpGhkpFhmoyzEsuToR7Gq9UT5V2kkqJneiKXqQg4wzvMAl\n" + + "UGECAwEAAaNjMGEwHwYDVR0jBBgwFoAUOw+92bevFoJz96pR1DrAkPPUKb0wDwYD\n" + + "VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLbnErBsq/Mh\n" + + "ci5XElfjjLZp3GRyMA0GCSqGSIb3DQEBCwUAA4IBAQAq8y2DpkSV31IXZ1vr/Ye+\n" + + "Nj/2NvBydFeHVRGMAN1LJv6/Q42TCSXbr6cDQ4NWQUtPm90yZBYJSznkbShxHOJE\n" + + "E6R8PRJvoUtMm7fJrNtkybTt6jX4j50Lw8gdYB/rgZb4z8ZQZVEo/0zpW4HVGs+q\n" + + "4z8TkdmLR18hl39sUEsxt99AOBk8NtKKVNfBWq9b0QDhRkXfmqhyeXdDsHOV8ksu\n" + + "lsa7hseheHhdjziEOpQugh8qzSea2kFPrLB53VjWfa4qDzEPaNhahho9piCu82XD\n" + + "nOrcEk9KyHWM7sa7vtK7++W+0MXD/p9nkZ6NHrJXweLriU0DXO6ZY3mzNKJK435M\n" + + "MIIDCjCCAfKgAwIBAgIEdffjKTANBgkqhkiG9w0BAQsFADAlMRQwEgYDVQQKEwtT\n" + + "b21lQ29tcGFueTENMAsGA1UEAxMEUm9vdDAeFw0xNDA4MjgyMjQ2MzZaFw0xNjA4\n" + + "MjcyMjQ2MzZaMCUxFDASBgNVBAoTC1NvbWVDb21wYW55MQ0wCwYDVQQDEwRSb290\n" + + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhnXc8Avv54Gk2xjVa2yA\n" + + "lBL/Cug1nyvKl5wqmN+foT6cMOX6bneCkJOJ4lSbch3gvl4ctlX/9hm3pB/+HhSr\n" + + "em2NcLQrLEq8l9Ar4RnqfoXQR4Uy+4P6wj9OcVV7e/v/+ZPnStOoEAtb5nAwsR2b\n" + + "hOC/tIFNwflrsmsmtMSoOiNftpYLFF4eOAdpDrXYMrqNu6ZxZsOQ7WZl4SsVOx1N\n" + + "/IINXwBLyoHJDzLZ0iJEV0O6mh846s0n6QXeK1P5d0uLcoZaZ1k8Q4sRcdoLA6rS\n" + + "e1WffipBFMvIuoDIigkHZIKVYRLG828rO+PFnRah0ybybkVsN6s3oLxfhswZDvut\n" + + "OwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV\n" + + "HQ4EFgQUOw+92bevFoJz96pR1DrAkPPUKb0wDQYJKoZIhvcNAQELBQADggEBACBN\n" + + "wEaV70FKKBINHtNwesd7TB6fgSaVgDZOO08aseHbXnm7AUhtDV3P5rQR2AsKtbg4\n" + + "COhlKw2/Ki18D4DfdCccFKFTRZBjqj2PxNmn6C68l1/bT4PuUXuM7rW++53RcOA7\n" + + "TbgLuzA25kSz7XinRvR8L4VwHtppu5tSYEthMIMgLZLGGV9r7kBfpY8lXdxQM8vb\n" + + "xZUIysasvVtVUFPOTV6g2dfn8QCoqLOmxyzTLdXe4M6acP6f7lmhgr3LMqDtB6K9\n" + + "pN+OImr77zNdZ+jTB+5e9a8gAvc5ZfG7Nk5RfwUatYTAFZ6Uggy2cKmIRpXCia18\n" + + "If78mc7goS1+lHkGCs2hADEA\n" + + "-----END PKCS7-----"; + + // Empty PKCS#7 in DER form can be created with openssl: + // openssl crl2pkcs7 -nocrl -outform DER + private static final byte[] PKCS7_BER_EMPTY = { + 48, 39, 6, 9, 42, -122, 72, -122, + -9, 13, 1, 7, 2, -96, 26, 48, + 24, 2, 1, 1, 49, 0, 48, 11, + 6, 9, 42, -122, 72, -122, -9, 13, + 1, 7, 1, -96, 0, -95, 0, 49, + 0 + }; + + private static final String JTEST_ROOT_CRL = + "-----BEGIN X509 CRL-----\n" + + "MIICoTCBigIBATANBgkqhkiG9w0BAQsFADA1MQ4wDAYDVQQKEwVKVGVzdDELMAkG\n" + + "A1UECxMCSVQxFjAUBgNVBAMTDUpUZXN0IFJvb3QgQ0EXDTE0MDkwNDE4NDIyMVqg\n" + + "MDAuMB8GA1UdIwQYMBaAFO6bllCV6kctH77MfqAtefNeRdsmMAsGA1UdFAQEAgIA\n" + + "jjANBgkqhkiG9w0BAQsFAAOCAgEAmp8ihtiRthknDC+VzehmlQw5u8MftMZYQYk5\n" + + "EI04SwyzY9JTL8QHb4u7fXjnZAyN89aYPypI5OSyDsyyGP/JDNsBt2Um/fl0aaCl\n" + + "Z4Np6x+dB9+oIU1XY7y2+uyQUC5MHivQ5ddbGPoAvK/msbugTGAjHvZpM+l0okiV\n" + + "3SofDrii5BSosFEkXfkf2oG9ZLO3YamsFMEZaOj/eWDyGhTyJMGsq2/8NeTF21Tp\n" + + "YkeDcTHqR5KHoYXjOIaS7NjmErm+uDpKH9Lq+JUcYrbUhmjnq5z04EsPF2F2L7Vb\n" + + "THI+awQAUQit16lXGuz7fFRZi2vPyiaRP5n2QT5D+ac1dAs+oWLDJw6Tf2v9KVTe\n" + + "OmW62yd6zQqCwBg+n57UcNu3sv/Sq3t7iRuN0AmWlIhu659POPQv7Np6bEo6dIpp\n" + + "u7Ze6D2KPtM177ETHYlCx2a3g9VEZYKrVhQ2749St0Cp5szVq691jFZAWYOzcfEO\n" + + "XfK1y25pmlBjvhNIIVRlU+T5rjNb8GaleYKVYnKOcv700K32QxFzcPf7nbNKwW99\n" + + "tcaNHFNP+LW/XP8I3CJ8toXLLcOITKVwMA+0GlO5eL7eX5POc+vE9+7IzGuybmU4\n" + + "uslxoLdJ0NSZWpYmf6a6qrJ67cj5i3706H+eBsWQcShfSYreh+TyWQaGk+fkEiUV\n" + + "iy4QdJ0=\n" + + "-----END X509 CRL-----"; + + private static final String JTEST_INTERMED_CRL = + "-----BEGIN X509 CRL-----\n" + + "MIICzzCBuAIBATANBgkqhkiG9w0BAQsFADA/MQ4wDAYDVQQKEwVKVGVzdDELMAkG\n" + + "A1UECxMCSVQxIDAeBgNVBAMTF0pUZXN0IEludGVybWVkaWF0ZSBDQSAxFw0xNDA5\n" + + "MDQyMjE2NTRaMCIwIAIBBhcNMTQwOTA0MjIxNjU0WjAMMAoGA1UdFQQDCgEFoDAw\n" + + "LjAfBgNVHSMEGDAWgBSvRdjbkSMJ3A7s5H6EWghQ+lkw/zALBgNVHRQEBAICAJsw\n" + + "DQYJKoZIhvcNAQELBQADggIBALJmikMwil8oywhenoO8o9xxCOIU0xrt3KdfiSXw\n" + + "8MtQXZHT9d1C6tlLAsYkWAfmfTvM2OU6wquFCLLsFmDZszbbCqmn4JhYBSKQMqlm\n" + + "IHnsiOFPvITW2FU08fWNLM+FtQzPnTFmx/CJo+wfGpq5tZMIbsccsCJ5uvZVAWGh\n" + + "0KbPmYcJG/O384+kzr/2H2IaoZoMMABec5c5FEF/tpp8jawzY+0VFyaVrumKWdan\n" + + "+3OvRQxT1wLxfNi2vdxB2rmNPo423qanXZAoVv260um3LYlmXBNK1jwQ9lp78jkT\n" + + "B7zMVa4hOUWVxdWc/LE6fUYgPsNqZd+hWy/PolIRp5TS21B5hkc5K87LT59GkexK\n" + + "vNVKQennOLGtH+Q7htK4UeY4Gm/W7UydOQ0k7hZzyfMDkCfLfNfK0l63qKwUku36\n" + + "UdeI1LXqulPEvb/d7rRAAM9p5Sm+RsECj2bcrZBMdIGXcSo26A5tzZpTEC79i4S1\n" + + "yxYIooeBnouUkDJ9+VBsJTSKY5fpU8JSkQPRyHKt+trGAkBt2Ka5MqrHtITzQ1vP\n" + + "5q4tNr45JGEXllH83NlBpWURfsdtkDHa3lxTD/pkrywOCyzz7wQ22D8Kul7EN8nT\n" + + "7LDbN+O3G9GHICxvWlJHp6HMsqGTuH1MIUR+5uZFOJa1S0IzorUIEieLncDUPgzO\n" + + "M4JA\n" + + "-----END X509 CRL-----"; + + // PKCS#7 CRL Set containing JTEST root and intermediate CRLs + private static final String PKCS7_CRL_SET = + "-----BEGIN PKCS7-----\n" + + "MIIFpQYJKoZIhvcNAQcCoIIFljCCBZICAQExADALBgkqhkiG9w0BBwGgAKGCBXgw\n" + + "ggKhMIGKAgEBMA0GCSqGSIb3DQEBCwUAMDUxDjAMBgNVBAoTBUpUZXN0MQswCQYD\n" + + "VQQLEwJJVDEWMBQGA1UEAxMNSlRlc3QgUm9vdCBDQRcNMTQwOTA0MTg0MjIxWqAw\n" + + "MC4wHwYDVR0jBBgwFoAU7puWUJXqRy0fvsx+oC15815F2yYwCwYDVR0UBAQCAgCO\n" + + "MA0GCSqGSIb3DQEBCwUAA4ICAQCanyKG2JG2GScML5XN6GaVDDm7wx+0xlhBiTkQ\n" + + "jThLDLNj0lMvxAdvi7t9eOdkDI3z1pg/Kkjk5LIOzLIY/8kM2wG3ZSb9+XRpoKVn\n" + + "g2nrH50H36ghTVdjvLb67JBQLkweK9Dl11sY+gC8r+axu6BMYCMe9mkz6XSiSJXd\n" + + "Kh8OuKLkFKiwUSRd+R/agb1ks7dhqawUwRlo6P95YPIaFPIkwayrb/w15MXbVOli\n" + + "R4NxMepHkoehheM4hpLs2OYSub64Okof0ur4lRxittSGaOernPTgSw8XYXYvtVtM\n" + + "cj5rBABRCK3XqVca7Pt8VFmLa8/KJpE/mfZBPkP5pzV0Cz6hYsMnDpN/a/0pVN46\n" + + "ZbrbJ3rNCoLAGD6fntRw27ey/9Kre3uJG43QCZaUiG7rn0849C/s2npsSjp0imm7\n" + + "tl7oPYo+0zXvsRMdiULHZreD1URlgqtWFDbvj1K3QKnmzNWrr3WMVkBZg7Nx8Q5d\n" + + "8rXLbmmaUGO+E0ghVGVT5PmuM1vwZqV5gpVico5y/vTQrfZDEXNw9/uds0rBb321\n" + + "xo0cU0/4tb9c/wjcIny2hcstw4hMpXAwD7QaU7l4vt5fk85z68T37sjMa7JuZTi6\n" + + "yXGgt0nQ1JlaliZ/prqqsnrtyPmLfvTof54GxZBxKF9Jit6H5PJZBoaT5+QSJRWL\n" + + "LhB0nTCCAs8wgbgCAQEwDQYJKoZIhvcNAQELBQAwPzEOMAwGA1UEChMFSlRlc3Qx\n" + + "CzAJBgNVBAsTAklUMSAwHgYDVQQDExdKVGVzdCBJbnRlcm1lZGlhdGUgQ0EgMRcN\n" + + "MTQwOTA0MjIxNjU0WjAiMCACAQYXDTE0MDkwNDIyMTY1NFowDDAKBgNVHRUEAwoB\n" + + "BaAwMC4wHwYDVR0jBBgwFoAUr0XY25EjCdwO7OR+hFoIUPpZMP8wCwYDVR0UBAQC\n" + + "AgCbMA0GCSqGSIb3DQEBCwUAA4ICAQCyZopDMIpfKMsIXp6DvKPccQjiFNMa7dyn\n" + + "X4kl8PDLUF2R0/XdQurZSwLGJFgH5n07zNjlOsKrhQiy7BZg2bM22wqpp+CYWAUi\n" + + "kDKpZiB57IjhT7yE1thVNPH1jSzPhbUMz50xZsfwiaPsHxqaubWTCG7HHLAiebr2\n" + + "VQFhodCmz5mHCRvzt/OPpM6/9h9iGqGaDDAAXnOXORRBf7aafI2sM2PtFRcmla7p\n" + + "ilnWp/tzr0UMU9cC8XzYtr3cQdq5jT6ONt6mp12QKFb9utLpty2JZlwTStY8EPZa\n" + + "e/I5Ewe8zFWuITlFlcXVnPyxOn1GID7DamXfoVsvz6JSEaeU0ttQeYZHOSvOy0+f\n" + + "RpHsSrzVSkHp5zixrR/kO4bSuFHmOBpv1u1MnTkNJO4Wc8nzA5Any3zXytJet6is\n" + + "FJLt+lHXiNS16rpTxL2/3e60QADPaeUpvkbBAo9m3K2QTHSBl3EqNugObc2aUxAu\n" + + "/YuEtcsWCKKHgZ6LlJAyfflQbCU0imOX6VPCUpED0chyrfraxgJAbdimuTKqx7SE\n" + + "80Nbz+auLTa+OSRhF5ZR/NzZQaVlEX7HbZAx2t5cUw/6ZK8sDgss8+8ENtg/Crpe\n" + + "xDfJ0+yw2zfjtxvRhyAsb1pSR6ehzLKhk7h9TCFEfubmRTiWtUtCM6K1CBIni53A\n" + + "1D4MzjOCQDEA\n" + + "-----END PKCS7-----"; + public static void main(String[] args) throws Exception { CertificateFactory cf = CertificateFactory.getInstance("X.509"); - File f = new File - (System.getProperty("test.src", "."), "invalidcert.pem"); - InputStream inStream = new FileInputStream(f); - try { - X509Certificate cert = - (X509Certificate) cf.generateCertificate(inStream); - } catch (CertificateParsingException ce) { - return; + List<DecodeTest> validTests = new LinkedList<>(); + List<DecodeTest> invalidTests = new LinkedList<>(); + + // Load up positive test cases (for sanity checks) + StringBuilder sb = new StringBuilder(); + + validTests.add(new GenMultiCertTest("Single, valid certificate", + SINGLE_ROOT_CERT.getBytes(), null, + new X500Principal("CN=Root, O=SomeCompany"))); + validTests.add(new GenMultiCertTest("PEM-encoded PKCS#7 chain", + PKCS7_INTERMED_ROOT_CERTS.getBytes(), null, + new X500Principal("CN=Intermed, O=SomeCompany"), + new X500Principal("CN=Root, O=SomeCompany"))); + validTests.add(new GenMultiCertTest("Two PEM-encoded X509 certs", + (INTERMED_CA_CERT + "\n" + SINGLE_ROOT_CERT).getBytes(), + null, + new X500Principal("CN=Intermed, O=SomeCompany"), + new X500Principal("CN=Root, O=SomeCompany"))); + validTests.add(new GenMultiCertTest("Empty data", new byte[0], null)); + + sb.append("Certificate 1: CN=Root, O=SomeCompany\n"); + sb.append(SINGLE_ROOT_CERT).append("\n"); + sb.append("Certificate 2: CN=Intermed, O=SomeCompany\n"); + sb.append(INTERMED_CA_CERT).append("\n"); + sb.append("Extra trailing data\n"); + validTests.add(new GenMultiCertTest( + "Two PEM-encoded certs with leading/trailing " + + "text data around each.", sb.toString().getBytes(), null, + new X500Principal("CN=Root, O=SomeCompany"), + new X500Principal("CN=Intermed, O=SomeCompany"))); + validTests.add(new GenMultiCertTest( + "BER-encoded PKCS#7 with empty certificates segment", + PKCS7_BER_EMPTY, null)); + validTests.add(new GenMultiCRLTest( + "CRL with leading and trailing text data", + ("This is a CRL\n" + JTEST_ROOT_CRL + + "\nSee? Told you so\n\n").getBytes(), null, + new X500Principal("CN=JTest Root CA,OU=IT,O=JTest"))); + validTests.add(new GenMultiCRLTest( + "Two CRLs, one after the other with leading/trailing text", + ("This is a CRL\n" + JTEST_ROOT_CRL + + "\nAnd this is another CRL\n" + JTEST_INTERMED_CRL + + "\nAnd this is trailing text\n").getBytes(), null, + new X500Principal("CN=JTest Root CA,OU=IT,O=JTest"), + new X500Principal( + "CN=JTest Intermediate CA 1,OU=IT,O=JTest"))); + validTests.add(new GenMultiCRLTest("Two CRLs in a PKCS#7 CRL set", + PKCS7_CRL_SET.getBytes(), null, + new X500Principal("CN=JTest Root CA,OU=IT,O=JTest"), + new X500Principal("CN=JTest Intermediate CA 1,OU=IT,O=JTest"))); + + // Load up all test cases where we expect failures + invalidTests.add(new GenSingleCertTest("Invalid PEM encoding", + INVALID_CERT.getBytes(), + new CertificateParsingException())); + invalidTests.add(new GenMultiCertTest("Invalid PEM encoding", + INVALID_CERT.getBytes(), + new CertificateParsingException())); + invalidTests.add(new GenMultiCertTest( + "Two cert sequence, one valid and one invalid", + (INTERMED_CA_CERT + "\n" + INVALID_CERT).getBytes(), + new CertificateParsingException())); + invalidTests.add(new GenMultiCertTest("Non-certificate text", + "This is not a certificate".getBytes(), + new CertificateException())); + invalidTests.add(new GenMultiCertTest( + "Non-certificate text with partial PEM header (4 hyphens)", + "----This is not a valid x509 certificate".getBytes(), + new CertificateException())); + invalidTests.add(new GenMultiCertTest( + "Leading non-certificate text plus valid PEM header, " + + "but not on new line", + "This is not valid -----BEGIN CERTIFICATE-----".getBytes(), + new CertificateException())); + byte[] emptyCString = {0}; + invalidTests.add(new GenMultiCertTest("Empty C-style string", + emptyCString, new CertificateException())); + invalidTests.add(new GenMultiCRLTest("Non-CRL text", + "This is not a CRL".getBytes(), new CRLException())); + invalidTests.add(new GenMultiCRLTest("Valid headers, but not a CRL", + INTERMED_CA_CERT.getBytes(), new CRLException())); + + System.out.println("===== Valid Tests ====="); + for (DecodeTest dt : validTests) { + dt.passTest(); } - throw new Exception("CertificateFactory.generateCertificate() did not " - + "throw CertificateParsingException on invalid X.509 cert data"); + System.out.print("\n"); + + System.out.println("===== Invalid Tests ====="); + for (DecodeTest dt : invalidTests) { + dt.failTest(); + } + } + + public static abstract class DecodeTest { + protected String testName; + protected byte[] testData; + protected Throwable expectedException; + protected X500Principal[] principals; + protected CertificateFactory cf; + + /** + * Construct a DecodeTest + * + * @param name The test name + * @param input A byte array consisting of the input for this test + * @param failType An exception whose class should match the expected + * exception that will be thrown when this test is run + * @param princs Zero of more X500Principals which will be used + * to compare the output in a success case. + */ + DecodeTest(String name, byte[] input, Throwable failType, + X500Principal... princs) throws CertificateException { + testName = name; + testData = input.clone(); + expectedException = failType; + principals = princs; + cf = CertificateFactory.getInstance("X.509"); + } + + public abstract void passTest() throws GeneralSecurityException; + + public abstract void failTest() throws GeneralSecurityException; + } + + public static class GenMultiCertTest extends DecodeTest { + public GenMultiCertTest(String name, byte[] input, Throwable failType, + X500Principal... princs) throws CertificateException { + super(name, input, failType, princs); + } + + @Override + public void passTest() throws GeneralSecurityException { + Collection<? extends Certificate> certs; + + System.out.println("generateCertificates(): " + testName); + certs = cf.generateCertificates(new ByteArrayInputStream(testData)); + + // Walk the certs Collection and do a comparison of subject names + int i = 0; + if (certs.size() == principals.length) { + for (Certificate crt : certs) { + X509Certificate xc = (X509Certificate)crt; + if (!xc.getSubjectX500Principal().equals( + principals[i])) { + throw new RuntimeException("Name mismatch: " + + "cert: " + xc.getSubjectX500Principal() + + ", expected: " + principals[i]); + } + i++; + } + } else { + throw new RuntimeException("Size mismatch: certs = " + + certs.size() + ", expected = " + + principals.length); + } + } + + @Override + public void failTest() throws GeneralSecurityException { + Throwable caughtException = null; + Collection<? extends Certificate> certs = null; + + System.out.println("generateCertificates(): " + testName); + if (expectedException == null) { + throw new RuntimeException("failTest requires non-null " + + "expectedException"); + } + + try { + certs = + cf.generateCertificates(new ByteArrayInputStream(testData)); + } catch (CertificateException ce) { + caughtException = ce; + } + + if (caughtException != null) { + // It has to be the right kind of exception though... + if (!caughtException.getClass().equals( + expectedException.getClass())) { + System.err.println("Unexpected exception thrown. " + + "Received: " + caughtException + ", Expected: " + + expectedException.getClass()); + throw new RuntimeException(caughtException); + } + } else { + // For a failure test, we'd expect some kind of exception + // to be thrown. + throw new RuntimeException("Failed to catch expected " + + "exception " + expectedException.getClass()); + } + } + } + + public static class GenSingleCertTest extends DecodeTest { + public GenSingleCertTest(String name, byte[] input, Throwable failType, + X500Principal... princs) throws CertificateException { + super(name, input, failType, princs); + } + + @Override + public void passTest() throws GeneralSecurityException { + X509Certificate cert; + + System.out.println("generateCertificate(): " + testName); + cert = (X509Certificate)cf.generateCertificate( + new ByteArrayInputStream(testData)); + + // Compare the cert's subject name against the expected value + // provided in the test. If multiple X500Principals were provided + // just use the first one as the expected value. + if (!cert.getSubjectX500Principal().equals(principals[0])) { + throw new RuntimeException("Name mismatch: " + + "cert: " + cert.getSubjectX500Principal() + + ", expected: " + principals[0]); + } + } + + @Override + public void failTest() throws GeneralSecurityException { + Throwable caughtException = null; + X509Certificate cert = null; + System.out.println("generateCertificate(): " + testName); + + if (expectedException == null) { + throw new RuntimeException("failTest requires non-null " + + "expectedException"); + } + + try { + cert = (X509Certificate)cf.generateCertificate( + new ByteArrayInputStream(testData)); + } catch (CertificateException e) { + caughtException = e; + } + + if (caughtException != null) { + // It has to be the right kind of exception though... + if (!caughtException.getClass().equals( + expectedException.getClass())) { + System.err.println("Unexpected exception thrown. " + + "Received: " + caughtException + ", Expected: " + + expectedException.getClass()); + throw new RuntimeException(caughtException); + } + } else { + // For a failure test, we'd expect some kind of exception + // to be thrown. + throw new RuntimeException("Failed to catch expected " + + "exception " + expectedException.getClass()); + } + } + } + + public static class GenMultiCRLTest extends DecodeTest { + public GenMultiCRLTest(String name, byte[] input, Throwable failType, + X500Principal... princs) throws CertificateException { + super(name, input, failType, princs); + } + + @Override + public void passTest() throws GeneralSecurityException { + Collection<? extends CRL> crls; + + System.out.println("generateCRLs(): " + testName); + crls = cf.generateCRLs(new ByteArrayInputStream(testData)); + + // Walk the crls Collection and do a comparison of issuer names + int i = 0; + if (crls.size() == principals.length) { + for (CRL revlist : crls) { + X509CRL xc = (X509CRL)revlist; + if (!xc.getIssuerX500Principal().equals(principals[i])) { + throw new RuntimeException("Name mismatch: " + + "CRL: " + xc.getIssuerX500Principal() + + ", expected: " + principals[i]); + } + i++; + } + } else { + throw new RuntimeException("Size mismatch: crls = " + + crls.size() + ", expected = " + + principals.length); + } + } + + @Override + public void failTest() throws GeneralSecurityException { + Throwable caughtException = null; + Collection<? extends CRL> crls = null; + + System.out.println("generateCRLs(): " + testName); + if (expectedException == null) { + throw new RuntimeException("failTest requires non-null " + + "expectedException"); + } + + try { + crls = + cf.generateCRLs(new ByteArrayInputStream(testData)); + } catch (CRLException e) { + caughtException = e; + } + + if (caughtException != null) { + // It has to be the right kind of exception though... + if (!caughtException.getClass().equals( + expectedException.getClass())) { + System.err.println("Unexpected exception thrown. " + + "Received: " + caughtException + ", Expected: " + + expectedException.getClass()); + throw new RuntimeException(caughtException); + } + } else { + // For a failure test, we'd expect some kind of exception + // to be thrown. + throw new RuntimeException("Failed to catch expected " + + "exception " + expectedException.getClass()); + } + } } }
--- a/test/java/security/cert/CertificateFactory/invalidEncodedCerts/invalidcert.pem Thu Oct 16 12:02:05 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ ------BEGIN CERTIFICATE----- -XIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx -EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xFTAT -BgNVBAoTDEJFQSBXZWJMb2dpYzERMA8GA1UECxMIU2VjdXJpdHkxIzAhBgNVBAMT -GkRlbW8gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9zdXBw -b3J0QGJlYS5jb20wHhcNMDAwNTMwMjEzODAxWhcNMDQwNTEzMjEzODAxWjCBjDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG -cmFuY2lzY28xFTATBgNVBAoTDEJFQSBXZWJMb2dpYzEZMBcGA1UEAxMQd2VibG9n -aWMuYmVhLmNvbTEeMBwGCSqGSIb3DQEJARYPc3VwcG9ydEBiZWEuY29tMFwwDQYJ -KoZIhvcNAQEBBQADSwAwSAJBALdsXEHqKHgs6zj0hU5sXMAUHzoT8kgWXmNkKHXH -79qbPh6EfdlriW9G/AbRF/pKrCQu7hhllAxREbqTuSlf2EMCAwEAATANBgkqhkiG -9w0BAQQFAANBACgmqflL5m5LNeJGpWx9aIoABCiuDcpw1fFyegsqGX7CBhffcruS -1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU= ------END CERTIFICATE-----
--- a/test/java/text/Format/DecimalFormat/TieRoundingTest.java Thu Oct 16 12:02:05 2014 -0700 +++ b/test/java/text/Format/DecimalFormat/TieRoundingTest.java Thu Oct 16 14:14:57 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2014, 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 @@ -23,7 +23,7 @@ /* @test * - * @bug 7131459 + * @bug 7131459 8039915 * @summary test various situations of NumberFormat rounding when close to tie * @author Olivier Lagneau * @run main TieRoundingTest @@ -56,7 +56,7 @@ if (!result.equals(expectedOutput)) { System.out.println(); System.out.println("========================================"); - System.out.println("***Error formatting double value from string : " + + System.out.println("***Failure : error formatting value from string : " + inputDigits); System.out.println("NumberFormat pattern is : " + ((DecimalFormat ) nf).toPattern()); @@ -103,7 +103,7 @@ if (!result.equals(expectedOutput)) { System.out.println(); System.out.println("========================================"); - System.out.println("***Error formatting double value from string : " + + System.out.println("***Failure : error formatting value from string : " + inputDigits); System.out.println("NumberFormat pattern is : " + ((DecimalFormat ) nf).toPattern()); @@ -144,7 +144,7 @@ if (!result.equals(expectedOutput)) { System.out.println(); System.out.println("========================================"); - System.out.println("***Error formatting number value from string : " + + System.out.println("***Failure : error formatting value from string : " + inputDigits); System.out.println("NumberFormat pattern is : " + ((DecimalFormat ) nf).toPattern()); @@ -174,7 +174,7 @@ public static void main(String[] args) { - // Only the 3 rounding modes below may be impacted by bug 7131459. + // The 3 HALF_* rounding modes are impacted by bugs 7131459, 8039915. // So we do not test the other rounding modes. RoundingMode[] roundingModes = { RoundingMode.HALF_DOWN, @@ -183,10 +183,14 @@ }; // Precise the relative position of input value against its closest tie. + // The double values tested below for 3 and 5 fractional digits must follow + // this scheme (position toward tie). String[] tieRelativePositions = { "below", "exact", "above", "below", "exact", "above", "below", "exact", "above", + "below", "above", "above", + "below", "below", "above", "below", "exact", "above" }; @@ -196,9 +200,13 @@ double[] values3FractDigits = { // unimpacting values close to tie, with less than 3 input fract digits 1.115d, 1.125d, 1.135d, - // impacting close to tie values covering all 6 cases + // HALF_* impacting close to tie values covering all 6 tie cases 0.3115d, 0.3125d, 0.3135d, 0.6865d, 0.6875d, 0.6885d, + // specific HALF_UP close to tie values + 0.3124d, 0.3126d, 0.3128d, + // specific HALF_DOWN close to tie values + 0.6864d, 0.6865d, 0.6868d, // unimpacting values close to tie, with more than 3 input fract digits 1.46885d, 2.46875d, 1.46865d }; @@ -207,6 +215,8 @@ "1.115d", "1.125d", "1.135d", "0.3115d", "0.3125d", "0.3135d", "0.6865d", "0.6875d", "0.6885d", + "0.3124d", "0.3126d", "0.3128d", + "0.6864d", "0.6865d", "0.6868d", "1.46885d", "2.46875d", "1.46865d" }; @@ -214,16 +224,22 @@ {"1.115", "1.125", "1.135", "0.311", "0.312", "0.314", "0.686", "0.687", "0.689", + "0.312", "0.313", "0.313", + "0.686", "0.686", "0.687", "1.469", "2.469", "1.469" }, {"1.115", "1.125", "1.135", "0.311", "0.312", "0.314", "0.686", "0.688", "0.689", + "0.312", "0.313", "0.313", + "0.686", "0.686", "0.687", "1.469", "2.469", "1.469" }, {"1.115", "1.125", "1.135", "0.311", "0.313", "0.314", "0.686", "0.688", "0.689", + "0.312", "0.313", "0.313", + "0.686", "0.686", "0.687", "1.469", "2.469", "1.469" }, }; @@ -250,9 +266,13 @@ double[] values5FractDigits = { // unimpacting values close to tie, with less than 5 input fract digits 1.3135d, 1.3125d, 1.3115d, - // impacting values close to tie, covering all 6 cases + // HALF_* impacting values close to tie, covering all 6 cases 1.328115d, 1.328125d, 1.328135d, 1.796865d, 1.796875d, 1.796885d, + // specific HALF_UP close to tie values + 1.328124d, 1.798876d, 1.796889d, + // specific HALF_DOWN close to tie values + 1.328114d, 1.796865d, 1.328138d, // unimpacting values close to tie, with more than 5 input fract digits 1.3281149999999d, 1.75390625d, 1.7968750000001d }; @@ -261,6 +281,8 @@ "1.3135d", "1.3125d", "1.3115d", "1.328115d", "1.328125d", "1.328135d", "1.796865d", "1.796875d", "1.796885d", + "1.328124d", "1.798876d", "1.796889d", + "1.328114d", "1.796865d", "1.328138d", "1.3281149999999d", "1.75390625d", "1.7968750000001d" }; @@ -268,16 +290,22 @@ {"1.3135", "1.3125", "1.3115", "1.32811", "1.32812", "1.32814", "1.79686", "1.79687", "1.79689", + "1.32812", "1.79888", "1.79689", + "1.32811", "1.79686", "1.32814", "1.32811", "1.75391", "1.79688" }, {"1.3135", "1.3125", "1.3115", "1.32811", "1.32812", "1.32814", "1.79686", "1.79688", "1.79689", + "1.32812", "1.79888", "1.79689", + "1.32811", "1.79686", "1.32814", "1.32811", "1.75391", "1.79688" }, {"1.3135", "1.3125", "1.3115", "1.32811", "1.32813", "1.32814", "1.79686", "1.79688", "1.79689", + "1.32812", "1.79888", "1.79689", + "1.32811", "1.79686", "1.32814", "1.32811", "1.75391", "1.79688" } };
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/util/concurrent/FutureTask/NegativeTimeout.java Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2014 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 8060052 + * @summary FutureTask; fix underflow when timeout = Long.MIN_VALUE + * @author Chris Hegarty + */ + +import java.util.concurrent.FutureTask; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.TimeUnit; + +// If the bug exists the test will eventually be interrupted by the +// test harness and fail with an InterruptedException, otherwise it +// will throw a TimeoutException almost immediately and return silently. + +public class NegativeTimeout { + public static void main(String[] args) throws Exception { + FutureTask<Void> task = new FutureTask<>( () -> { return null; } ); + try { + task.get(Long.MIN_VALUE, TimeUnit.NANOSECONDS); + } catch (TimeoutException success) {} + } +} +
--- a/test/java/util/zip/InterruptibleZip.java Thu Oct 16 12:02:05 2014 -0700 +++ b/test/java/util/zip/InterruptibleZip.java Thu Oct 16 14:14:57 2014 -0700 @@ -30,32 +30,14 @@ import java.util.zip.*; public class InterruptibleZip { - private static String rtJar() { - String bcp = System.getProperty("sun.boot.class.path"); - for (String pathElement : bcp.split(File.pathSeparator)) { - if (pathElement.endsWith(File.separator + "rt.jar") && - new File(pathElement).exists()) { - System.out.println("rtJar="+pathElement); - return pathElement; - } - if (pathElement.endsWith(File.separator + "classes") && - new File(pathElement).isDirectory()) { - System.out.println("rt.jar not available"); - return null; - } - } - throw new Error("Can't find rt.jar or classes directory"); - } public static void main(String[] args) throws Exception { /* Interrupt the current thread. The is.read call below - should continue reading rt.jar. + should continue reading input.jar. */ - String rtJar = rtJar(); - if (rtJar == null) return; Thread.currentThread().interrupt(); - ZipFile zf = new ZipFile(rtJar); - ZipEntry ze = zf.getEntry("java/lang/Object.class"); + ZipFile zf = new ZipFile(new File(System.getProperty("test.src", "."), "input.jar")); + ZipEntry ze = zf.getEntry("Available.java"); InputStream is = zf.getInputStream(ze); byte[] buf = new byte[512]; int n = is.read(buf);
--- a/test/java/util/zip/ZipFile/FinalizeZipFile.java Thu Oct 16 12:02:05 2014 -0700 +++ b/test/java/util/zip/ZipFile/FinalizeZipFile.java Thu Oct 16 14:14:57 2014 -0700 @@ -51,12 +51,11 @@ private static void makeGarbage() throws Throwable { final Random rnd = new Random(); - final String javaHome = System.getProperty("java.home"); // Create some ZipFiles. - // Find some .jar files in JDK's lib directory. - final File lib = new File(javaHome, "lib"); - check(lib.isDirectory()); - final File[] jars = lib.listFiles( + // Find some .jar files in test directory. + final File testdir = new File(System.getProperty("test.src", ".")); + check(testdir.isDirectory()); + final File[] jars = testdir.listFiles( new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".jar");}});
--- a/test/javax/management/MBeanInfo/NotificationInfoTest.java Thu Oct 16 12:02:05 2014 -0700 +++ b/test/javax/management/MBeanInfo/NotificationInfoTest.java Thu Oct 16 14:14:57 2014 -0700 @@ -36,7 +36,6 @@ import java.lang.management.*; import java.lang.reflect.*; import java.net.*; -import java.security.CodeSource; import java.util.*; import java.util.jar.*; import javax.management.*; @@ -83,27 +82,10 @@ System.out.println("Checking platform MBeans..."); checkPlatformMBeans(); - CodeSource cs = - javax.management.MBeanServer.class.getProtectionDomain() - .getCodeSource(); - URL codeBase; - if (cs == null) { - String javaHome = System.getProperty("java.home"); - String[] candidates = {"/lib/rt.jar", "/classes/"}; - codeBase = null; - for (String candidate : candidates) { - File file = new File(javaHome + candidate); - if (file.exists()) { - codeBase = file.toURI().toURL(); - break; - } - } - if (codeBase == null) { - throw new Exception( - "Could not determine codeBase for java.home=" + javaHome); - } - } else - codeBase = cs.getLocation(); + URL codeBase = ClassLoader.getSystemResource("javax/management/MBeanServer.class"); + if (codeBase == null) { + throw new Exception("Could not determine codeBase for " + MBeanServer.class); + } System.out.println(); System.out.println("Looking for standard MBeans...");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/naming/spi/providers/InitialContextTest.java Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,372 @@ +/* + * Copyright (c) 2014, 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. + */ + +import javax.naming.Context; +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.lang.String.format; +import static java.util.Arrays.asList; +import static java.util.Collections.singleton; +import static java.util.Collections.singletonMap; + +/* + * @test + * @bug 8044627 + * @summary Examines different ways JNDI providers can hook up themselves and + * become available. Each case mimics the most straightforward way of + * executing scenarios. + */ +public class InitialContextTest { + + public static void main(String[] args) throws Throwable { + unknownInitialContextFactory(); + initialContextFactoryInAJar(); + initialContextFactoryAsService(); + } + + private static void unknownInitialContextFactory() throws Throwable { + + // This is a parameter of this test case, it should work for any value + // of it, provided a class with this FQN is not available in a runtime. + // So pick any name you like. + String factoryClassFqn = + "net.java.openjdk.test.UnknownInitialContextFactory"; + + Path tmp = Files.createDirectory(Paths.get("InitialContextTest-1")); + + Path src = templatesHome().resolve("test.template"); + Path dst = tmp.resolve("Test.java"); + Files.copy(src, dst); + + javac(tmp, dst); + + Path build = Files.createDirectory(tmp.resolve("build")); + Files.copy(tmp.resolve("Test.class"), build.resolve("Test.class")); + + Map<String, String> props + = singletonMap(Context.INITIAL_CONTEXT_FACTORY, factoryClassFqn); + + Result r = java(props, singleton(build), "Test"); + + if (r.exitValue == 0 || !r.output.startsWith( + stackTraceStringForClassNotFound(factoryClassFqn))) { + throw new RuntimeException( + "Expected a different kind of failure: " + r.output); + } + } + + private static String stackTraceStringForClassNotFound(String fqn) { + return String.format( + "Exception in thread \"main\" javax.naming.NoInitialContextException: " + + "Cannot instantiate class: %s " + + "[Root exception is java.lang.ClassNotFoundException: %s]", + fqn, fqn); + } + + private static void initialContextFactoryInAJar() throws Throwable { + + String factoryClassFqn = + "net.java.openjdk.test.DummyInitialContextFactory"; + + Path tmp = Files.createDirectory(Paths.get("InitialContextTest-2")); + + Path src = templatesHome().resolve("test.template"); + Path dst = tmp.resolve("Test.java"); + Files.copy(src, dst); + + Path dst1 = createFactoryFrom(templatesHome().resolve("factory.template"), + factoryClassFqn, tmp); + + javac(tmp, dst); + Path explodedJar = Files.createDirectory(tmp.resolve("exploded-jar")); + javac(explodedJar, dst1); + jar(tmp.resolve("test.jar"), explodedJar); + + Path build = Files.createDirectory(tmp.resolve("build")); + Files.copy(tmp.resolve("Test.class"), build.resolve("Test.class")); + Files.copy(tmp.resolve("test.jar"), build.resolve("test.jar")); + + Map<String, String> props + = singletonMap(Context.INITIAL_CONTEXT_FACTORY, factoryClassFqn); + + Result r = java(props, asList(build.resolve("test.jar"), build), "Test"); + + if (r.exitValue != 0 || !r.output.isEmpty()) + throw new RuntimeException(r.output); + } + + + private static Path createFactoryFrom(Path srcTemplate, + String factoryFqn, + Path dstFolder) throws IOException { + + String factorySimpleName, packageName; + int i = factoryFqn.lastIndexOf('.'); + if (i < 0) { + packageName = ""; + factorySimpleName = factoryFqn; + } else { + packageName = factoryFqn.substring(0, i); + factorySimpleName = factoryFqn.substring(i + 1); + } + + Path result = dstFolder.resolve(factorySimpleName + ".java"); + File dst = result.toFile(); + File src = srcTemplate.toFile(); + try (BufferedReader r = new BufferedReader(new FileReader(src)); + BufferedWriter w = new BufferedWriter(new FileWriter(dst))) { + + List<String> lines = processTemplate(packageName, factorySimpleName, + r.lines()).collect(Collectors.toList()); + + Iterator<String> it = lines.iterator(); + if (it.hasNext()) + w.write(it.next()); + while (it.hasNext()) { + w.newLine(); + w.write(it.next()); + } + } + return result; + } + + private static Stream<String> processTemplate(String packageName, + String factorySimpleName, + Stream<String> lines) { + Function<String, String> pckg; + + if (packageName.isEmpty()) { + pckg = s -> s.contains("$package") ? "" : s; + } else { + pckg = s -> s.replaceAll("\\$package", packageName); + } + + Function<String, String> factory + = s -> s.replaceAll("\\$factoryName", factorySimpleName); + + return lines.map(pckg).map(factory); + } + + private static void initialContextFactoryAsService() throws Throwable { + + String factoryClassFqn = + "net.java.openjdk.test.BrokenInitialContextFactory"; + + Path tmp = Files.createDirectory(Paths.get("InitialContextTest-3")); + + Path src = templatesHome().resolve("test.template"); + Path dst = tmp.resolve("Test.java"); + Files.copy(src, dst); + + Path dst1 = createFactoryFrom(templatesHome().resolve("broken_factory.template"), + factoryClassFqn, tmp); + + javac(tmp, dst); + + Path explodedJar = Files.createDirectory(tmp.resolve("exploded-jar")); + Path services = Files.createDirectories(explodedJar.resolve("META-INF") + .resolve("services")); + + Path s = services.resolve("javax.naming.spi.InitialContextFactory"); + FileWriter fw = new FileWriter(s.toFile()); + try { + fw.write(factoryClassFqn); + } finally { + fw.close(); + } + + javac(explodedJar, dst1); + jar(tmp.resolve("test.jar"), explodedJar); + + Path build = Files.createDirectory(tmp.resolve("build")); + Files.copy(tmp.resolve("Test.class"), build.resolve("Test.class")); + Files.copy(tmp.resolve("test.jar"), build.resolve("test.jar")); + + Map<String, String> props = new HashMap<>(); + props.put("java.ext.dirs", build.toString()); + props.put(Context.INITIAL_CONTEXT_FACTORY, factoryClassFqn); + + Result r = java(props, singleton(build), "Test"); + + if (r.exitValue == 0 || !verifyOutput(r.output, factoryClassFqn)) + throw new RuntimeException(r.output); + } + + // IMO, that's the easiest way that gives you a fair amount of confidence in + // that j.u.ServiceLoader is loading a factory rather than Class.forName + private static boolean verifyOutput(String output, String fqn) { + String s1 = String.format( + "Exception in thread \"main\" javax.naming.NoInitialContextException: " + + "Cannot load initial context factory '%s' " + + "[Root exception is java.util.ServiceConfigurationError: " + + "javax.naming.spi.InitialContextFactory: " + + "Provider %s could not be instantiated]", fqn, fqn); + + String s2 = String.format("Caused by: java.util.ServiceConfigurationError: " + + "javax.naming.spi.InitialContextFactory: " + + "Provider %s could not be instantiated", fqn); + + String s3 = "Caused by: java.lang.RuntimeException: " + + "This is a broken factory. It is supposed to throw this exception."; + + return output.startsWith(s1) && output.contains(s2) + && output.contains(s1); + } + + private static void jar(Path jarName, Path jarRoot) { + String jar = getJDKTool("jar"); + ProcessBuilder p = new ProcessBuilder(jar, "cf", jarName.toString(), + "-C", jarRoot.toString(), "."); + quickFail(run(p)); + } + + private static void javac(Path compilationOutput, Path... sourceFiles) { + String javac = getJDKTool("javac"); + List<String> commands = new ArrayList<>(); + commands.addAll(asList(javac, "-d", compilationOutput.toString())); + List<Path> paths = asList(sourceFiles); + commands.addAll(paths.stream() + .map(Path::toString) + .collect(Collectors.toList())); + quickFail(run(new ProcessBuilder(commands))); + } + + private static void quickFail(Result r) { + if (r.exitValue != 0) + throw new RuntimeException(r.output); + } + + private static Result java(Map<String, String> properties, + Collection<Path> classpath, + String classname) { + + String java = getJDKTool("java"); + + List<String> commands = new ArrayList<>(); + commands.add(java); + commands.addAll(properties.entrySet() + .stream() + .map(e -> "-D" + e.getKey() + "=" + e.getValue()) + .collect(Collectors.toList())); + + String cp = classpath.stream() + .map(Path::toString) + .collect(Collectors.joining(File.pathSeparator)); + commands.add("-cp"); + commands.add(cp); + commands.add(classname); + + return run(new ProcessBuilder(commands)); + } + + private static Result run(ProcessBuilder b) { + Process p = null; + try { + p = b.start(); + } catch (IOException e) { + throw new RuntimeException( + format("Couldn't start process '%s'", b.command()), e); + } + + String output; + try { + output = toString(p.getInputStream(), p.getErrorStream()); + } catch (IOException e) { + throw new RuntimeException( + format("Couldn't read process output '%s'", b.command()), e); + } + + try { + p.waitFor(); + } catch (InterruptedException e) { + throw new RuntimeException( + format("Process hasn't finished '%s'", b.command()), e); + } + + return new Result(p.exitValue(), output); + } + + private static String getJDKTool(String name) { + String testJdk = System.getProperty("test.jdk"); + if (testJdk == null) + throw new RuntimeException("Please provide test.jdk property at a startup"); + return testJdk + File.separator + "bin" + File.separator + name; + } + + private static Path templatesHome() { + String testSrc = System.getProperty("test.src"); + if (testSrc == null) + throw new RuntimeException("Please provide test.src property at a startup"); + return Paths.get(testSrc); + } + + private static String toString(InputStream... src) throws IOException { + StringWriter dst = new StringWriter(); + Reader concatenated = + new InputStreamReader( + new SequenceInputStream( + Collections.enumeration(asList(src)))); + copy(concatenated, dst); + return dst.toString(); + } + + private static void copy(Reader src, Writer dst) throws IOException { + int len; + char[] buf = new char[1024]; + try { + while ((len = src.read(buf)) != -1) + dst.write(buf, 0, len); + } finally { + try { + src.close(); + } catch (IOException ignored1) { + } finally { + try { + dst.close(); + } catch (IOException ignored2) { + } + } + } + } + + private static class Result { + + final int exitValue; + final String output; + + private Result(int exitValue, String output) { + this.exitValue = exitValue; + this.output = output; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/naming/spi/providers/broken_factory.template Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2014, 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. + */ + +package $package; + +import javax.naming.*; +import javax.naming.spi.InitialContextFactory; +import java.util.Hashtable; + +public class $factoryName implements InitialContextFactory { + + public $factoryName() { + throw new RuntimeException( + "This is a broken factory. It is supposed to throw this exception."); + } + + @Override + public Context getInitialContext(Hashtable<?, ?> env) throws NamingException { + return new DummyInitialContext(); + } + + private class DummyInitialContext implements Context { + + @Override + public Object lookup(Name name) { + return null; + } + + @Override + public Object lookup(String name) { + return null; + } + + @Override + public void bind(Name name, Object obj) { + } + + @Override + public void bind(String name, Object obj) { + } + + @Override + public void rebind(Name name, Object obj) { + } + + @Override + public void rebind(String name, Object obj) { + } + + @Override + public void unbind(Name name) { + } + + @Override + public void unbind(String name) { + } + + @Override + public void rename(Name oldName, Name newName) { + } + + @Override + public void rename(String oldName, String newName) { + } + + @Override + public NamingEnumeration<NameClassPair> list(Name name) { + return null; + } + + @Override + public NamingEnumeration<NameClassPair> list(String name) { + return null; + } + + @Override + public NamingEnumeration<Binding> listBindings(Name name) { + return null; + } + + @Override + public NamingEnumeration<Binding> listBindings(String name) { + return null; + } + + @Override + public void destroySubcontext(Name name) { + } + + @Override + public void destroySubcontext(String name) { + } + + @Override + public Context createSubcontext(Name name) { + return null; + } + + @Override + public Context createSubcontext(String name) { + return null; + } + + @Override + public Object lookupLink(Name name) { + return null; + } + + @Override + public Object lookupLink(String name) { + return null; + } + + @Override + public NameParser getNameParser(Name name) { + return null; + } + + @Override + public NameParser getNameParser(String name) { + return null; + } + + @Override + public Name composeName(Name name, Name prefix) { + return null; + } + + @Override + public String composeName(String name, String prefix) { + return null; + } + + @Override + public Object addToEnvironment(String propName, Object propVal) { + return null; + } + + @Override + public Object removeFromEnvironment(String propName) { + return null; + } + + @Override + public Hashtable<?, ?> getEnvironment() { + return null; + } + + @Override + public void close() { + } + + @Override + public String getNameInNamespace() { + return null; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/naming/spi/providers/factory.template Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2014, 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. + */ + +package $package; + +import javax.naming.*; +import javax.naming.spi.InitialContextFactory; +import java.util.Hashtable; + +public class $factoryName implements InitialContextFactory { + + @Override + public Context getInitialContext(Hashtable<?, ?> env) throws NamingException { + return new DummyInitialContext(); + } + + private class DummyInitialContext implements Context { + + @Override + public Object lookup(Name name) { + return null; + } + + @Override + public Object lookup(String name) { + return null; + } + + @Override + public void bind(Name name, Object obj) { + } + + @Override + public void bind(String name, Object obj) { + } + + @Override + public void rebind(Name name, Object obj) { + } + + @Override + public void rebind(String name, Object obj) { + } + + @Override + public void unbind(Name name) { + } + + @Override + public void unbind(String name) { + } + + @Override + public void rename(Name oldName, Name newName) { + } + + @Override + public void rename(String oldName, String newName) { + } + + @Override + public NamingEnumeration<NameClassPair> list(Name name) { + return null; + } + + @Override + public NamingEnumeration<NameClassPair> list(String name) { + return null; + } + + @Override + public NamingEnumeration<Binding> listBindings(Name name) { + return null; + } + + @Override + public NamingEnumeration<Binding> listBindings(String name) { + return null; + } + + @Override + public void destroySubcontext(Name name) { + } + + @Override + public void destroySubcontext(String name) { + } + + @Override + public Context createSubcontext(Name name) { + return null; + } + + @Override + public Context createSubcontext(String name) { + return null; + } + + @Override + public Object lookupLink(Name name) { + return null; + } + + @Override + public Object lookupLink(String name) { + return null; + } + + @Override + public NameParser getNameParser(Name name) { + return null; + } + + @Override + public NameParser getNameParser(String name) { + return null; + } + + @Override + public Name composeName(Name name, Name prefix) { + return null; + } + + @Override + public String composeName(String name, String prefix) { + return null; + } + + @Override + public Object addToEnvironment(String propName, Object propVal) { + return null; + } + + @Override + public Object removeFromEnvironment(String propName) { + return null; + } + + @Override + public Hashtable<?, ?> getEnvironment() { + return null; + } + + @Override + public void close() { + } + + @Override + public String getNameInNamespace() { + return null; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/naming/spi/providers/test.template Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2014, 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. + */ + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import java.util.Properties; + +public class Test { + + public static void main(String[] args) throws NamingException { + Properties env = System.getProperties(); + Context ctx = new InitialContext(env); + try { + ctx.lookup(""); + } finally { + ctx.close(); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/print/RegisterNullService.java Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2014, 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 8059219 + * @summary Should not be able to register null service. + * @run main RegisterNullService +*/ + +import javax.print.PrintService; +import javax.print.PrintServiceLookup; + +public class RegisterNullService { + public static void main (String [] args) throws RuntimeException { + + boolean registered = PrintServiceLookup.registerService(null); + if (registered) { + throw new RuntimeException("Null service was registered"); + } + PrintService[] services = + PrintServiceLookup.lookupPrintServices(null, null); + for (int i = 0; i < services.length; i++) { + if (services[i] == null) { + throw new RuntimeException("Null service found."); + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/sound/midi/MidiDeviceProvider/NullInfo.java Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2014, 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. + */ + +import java.util.Collection; +import java.util.HashSet; + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.spi.MidiDeviceProvider; + +import static java.util.ServiceLoader.load; + +/** + * @test + * @bug 8058115 + * @summary MidiDeviceProvider shouldn't returns incorrect results or throw NPE + * in case of null MidiDevice.Info + * @author Sergey Bylokhov + */ +public final class NullInfo { + + public static void main(final String[] args) { + // MidiSystem API + try { + MidiSystem.getMidiDevice(null); + throw new RuntimeException("IllegalArgumentException expected"); + } catch (final MidiUnavailableException e) { + throw new RuntimeException("IllegalArgumentException expected", e); + } catch (final IllegalArgumentException ignored) { + // expected + } + // MidiDeviceProvider API + final Collection<String> errors = new HashSet<>(); + for (final MidiDeviceProvider mdp : load(MidiDeviceProvider.class)) { + try { + if (mdp.isDeviceSupported(null)) { + throw new RuntimeException("null is supported"); + } + final MidiDevice device = mdp.getDevice(null); + System.err.println("MidiDevice: " + device); + throw new RuntimeException("IllegalArgumentException expected"); + } catch (final IllegalArgumentException e) { + errors.add(e.getMessage()); + } + } + if (errors.size() != 1) { + throw new RuntimeException("Wrong number of messages:" + errors); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/sound/midi/MidiDeviceProvider/UnsupportedInfo.java Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2014, 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. + */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.spi.MidiDeviceProvider; + +import static java.util.ServiceLoader.load; + +/** + * @test + * @bug 8058115 + * @summary MidiDeviceProvider shouldn't returns incorrect results in case of + * unsupported MidiDevice.Info + * @author Sergey Bylokhov + */ +public final class UnsupportedInfo { + + public static void main(final String[] args) { + final MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo(); + for (final MidiDeviceProvider mdp : load(MidiDeviceProvider.class)) { + for (final MidiDevice.Info info : infos) { + if (mdp.isDeviceSupported(info)) { + if (mdp.getDevice(info) == null) { + throw new RuntimeException("MidiDevice is null"); + } + } else { + try { + mdp.getDevice(info); + throw new RuntimeException( + "IllegalArgumentException expected"); + } catch (final IllegalArgumentException ignored) { + // expected + } + } + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/swing/text/NavigationFilter/8058305/bug8058305.java Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2014, 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. + */ +import javax.swing.JFormattedTextField; +import javax.swing.JFrame; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.text.BadLocationException; +import javax.swing.text.NavigationFilter; +import javax.swing.text.Position; + +/* + * @test + * @bug 8058305 + * @summary BadLocationException is not thrown by + * javax.swing.text.View.getNextVisualPositionFrom() for invalid positions + * @run main bug8058305 + */ +public class bug8058305 { + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(bug8058305::createAndShowGUI); + } + + private static void createAndShowGUI() { + JFrame frame = new JFrame(); + + JFormattedTextField textField = new JFormattedTextField(); + NavigationFilter navigationFilter = new NavigationFilter(); + textField.setText("Test for Tests"); + frame.getContentPane().add(textField); + frame.pack(); + + Position.Bias[] biasRet = {Position.Bias.Forward}; + try { + navigationFilter.getNextVisualPositionFrom(textField, 100, + Position.Bias.Backward, SwingConstants.EAST, biasRet); + throw new RuntimeException("BadLocationException is not thrown!"); + } catch (BadLocationException expectedException) { + } + + frame.setVisible(true); + + try { + navigationFilter.getNextVisualPositionFrom(textField, 200, + Position.Bias.Forward, SwingConstants.WEST, biasRet); + throw new RuntimeException("BadLocationException is not thrown!"); + } catch (BadLocationException expectedException) { + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/jaxp/testng/TEST.properties Thu Oct 16 14:14:57 2014 -0700 @@ -0,0 +1,3 @@ +# This file identifies root(s) of the test-ng hierarchy. + +TestNG.dirs = .
--- a/test/javax/xml/jaxp/testng/validation/8037819/BaseTest.java Thu Oct 16 12:02:05 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,338 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.File; -import java.net.URL; - -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.Result; -import javax.xml.transform.Source; -import javax.xml.transform.dom.DOMResult; -import javax.xml.transform.dom.DOMSource; -import javax.xml.validation.Schema; -import javax.xml.validation.SchemaFactory; -import javax.xml.validation.Validator; - - -import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl; -import com.sun.org.apache.xerces.internal.impl.Constants; -import com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar; -import com.sun.org.apache.xerces.internal.xs.ElementPSVI; -import com.sun.org.apache.xerces.internal.xs.ItemPSVI; -import com.sun.org.apache.xerces.internal.xs.XSElementDeclaration; -import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition; -import javax.xml.transform.stream.StreamSource; -import org.w3c.dom.Document; -import org.w3c.dom.Node; - -public abstract class BaseTest { - protected final static String ROOT_TYPE = Constants.XERCES_PROPERTY_PREFIX - + Constants.ROOT_TYPE_DEFINITION_PROPERTY; - - protected final static String IGNORE_XSI_TYPE = Constants.XERCES_FEATURE_PREFIX - + Constants.IGNORE_XSI_TYPE_FEATURE; - - protected final static String ID_IDREF_CHECKING = Constants.XERCES_FEATURE_PREFIX - + Constants.ID_IDREF_CHECKING_FEATURE; - - protected final static String IDC_CHECKING = Constants.XERCES_FEATURE_PREFIX - + Constants.IDC_CHECKING_FEATURE; - - protected final static String UNPARSED_ENTITY_CHECKING = Constants.XERCES_FEATURE_PREFIX - + Constants.UNPARSED_ENTITY_CHECKING_FEATURE; - - protected final static String USE_GRAMMAR_POOL_ONLY = Constants.XERCES_FEATURE_PREFIX - + Constants.USE_GRAMMAR_POOL_ONLY_FEATURE; - - protected final static String DYNAMIC_VALIDATION = Constants.XERCES_FEATURE_PREFIX - + Constants.DYNAMIC_VALIDATION_FEATURE; - - protected final static String DOCUMENT_CLASS_NAME = Constants.XERCES_PROPERTY_PREFIX - + Constants.DOCUMENT_CLASS_NAME_PROPERTY; - - protected Schema schema; - protected Validator fValidator; - - protected SpecialCaseErrorHandler fErrorHandler; - - DocumentBuilder builder; - protected Document fDocument; - - protected ElementPSVI fRootNode; - - protected URL fDocumentURL; - protected String documentPath; - protected String fDocumentId; - - static String errMessage; - - int passed = 0, failed = 0; - - public static boolean isWindows = false; - static { - if (System.getProperty("os.name").indexOf("Windows")>-1) { - isWindows = true; - } - }; - public static final String USER_DIR = System.getProperty("user.dir", "."); - public static final String BASE_DIR = System.getProperty("test.src", USER_DIR) - .replaceAll("\\" + System.getProperty("file.separator"), "/"); - - protected abstract String getSchemaFile(); - - protected abstract String getXMLDocument(); - - public BaseTest(String name) { - fErrorHandler = new SpecialCaseErrorHandler(getRelevantErrorIDs()); - } - - protected void setUp() throws Exception { - - DocumentBuilderFactory docFactory = DocumentBuilderFactory - .newInstance(); - docFactory.setAttribute(DOCUMENT_CLASS_NAME, - "com.sun.org.apache.xerces.internal.dom.PSVIDocumentImpl"); - docFactory.setNamespaceAware(true); - builder = docFactory.newDocumentBuilder(); - - documentPath = BASE_DIR + "/" + getXMLDocument(); -System.out.println("documentPath:"+documentPath); - if (isWindows) { - fDocumentId = "file:/" + documentPath; - } else { - fDocumentId = "file:" + documentPath; - } - //fDocumentURL = ClassLoader.getSystemResource(documentPath); - //fDocumentURL = getClass().getResource(documentPath); -System.out.println("fDocumentId:"+fDocumentId); -//System.out.println("fDocumentURL.toExternalForm:"+fDocumentURL.toExternalForm()); -/** - if (fDocumentURL == null) { - throw new FileNotFoundException("Couldn't find xml file for test: " + documentPath); - } - fDocument = builder.parse(fDocumentURL.toExternalForm()); - fRootNode = (ElementPSVI) fDocument.getDocumentElement(); - */ - SchemaFactory sf = SchemaFactory - .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - sf.setFeature(USE_GRAMMAR_POOL_ONLY, getUseGrammarPoolOnly()); - String schemaPath = BASE_DIR + "/" + getSchemaFile(); - /** - URL schemaURL = ClassLoader.getSystemResource(schemaPath); - if (schemaURL == null) { - throw new FileNotFoundException("Couldn't find schema file for test: " + schemaPath); - } - */ - schema = sf.newSchema(new StreamSource(new File(schemaPath))); - } - - protected void tearDown() throws Exception { - fValidator = null; - fDocument = null; - fRootNode = null; - fErrorHandler.reset(); - System.out.println("\nNumber of tests passed: " + passed); - System.out.println("Number of tests failed: " + failed + "\n"); - - if (errMessage != null) { - throw new RuntimeException(errMessage); - } - } - - protected void validateDocument() throws Exception { - Source source = new DOMSource(fDocument); - source.setSystemId(fDocumentId); - Result result = new DOMResult(fDocument); - fValidator.validate(source, result); - } - - protected void validateFragment() throws Exception { - Source source = new DOMSource((Node) fRootNode); - source.setSystemId(fDocumentId); - Result result = new DOMResult((Node) fRootNode); - fValidator.validate(source, result); - } - - protected void reset() throws Exception { - try { -System.out.println("new File(documentPath)" + new File(documentPath)); - - fDocument = builder.parse(new File(documentPath)); - fRootNode = (ElementPSVI) fDocument.getDocumentElement(); -System.out.println("fDocument" + fDocument); -System.out.println("fRootNode" + fRootNode); - fValidator = schema.newValidator(); - fErrorHandler.reset(); - fValidator.setErrorHandler(fErrorHandler); - fValidator.setFeature(DYNAMIC_VALIDATION, false); - } catch (Exception e) { - e.printStackTrace(); - } - } - - protected PSVIElementNSImpl getChild(int n) { - int numFound = 0; - Node child = ((Node) fRootNode).getFirstChild(); - while (child != null) { - if (child.getNodeType() == Node.ELEMENT_NODE) { - numFound++; - if (numFound == n) { - return (PSVIElementNSImpl) child; - } - } - child = child.getNextSibling(); - } - return null; - } - - protected String[] getRelevantErrorIDs() { - return new String[] {}; - } - - protected boolean getUseGrammarPoolOnly() { - return false; - } - - // specialized asserts - - protected void assertValidity(short expectedValidity, short actualValidity) { - String expectedString = expectedValidity == ItemPSVI.VALIDITY_VALID ? "valid" - : (expectedValidity == ItemPSVI.VALIDITY_INVALID ? "invalid" - : "notKnown"); - String actualString = actualValidity == ItemPSVI.VALIDITY_VALID ? "valid" - : (actualValidity == ItemPSVI.VALIDITY_INVALID ? "invalid" - : "notKnown"); - String message = "{validity} was <" + actualString - + "> but it should have been <" + expectedString + ">"; - assertEquals(message, expectedValidity, actualValidity); - } - - protected void assertValidationAttempted(short expectedAttempted, - short actualAttempted) { - String expectedString = expectedAttempted == ItemPSVI.VALIDATION_FULL ? "full" - : (expectedAttempted == ItemPSVI.VALIDATION_PARTIAL ? "partial" - : "none"); - String actualString = actualAttempted == ItemPSVI.VALIDATION_FULL ? "full" - : (actualAttempted == ItemPSVI.VALIDATION_PARTIAL ? "partial" - : "none"); - String message = "{validity} was <" + actualString - + "> but it should have been <" + expectedString + ">"; - assertEquals(message, expectedAttempted, actualAttempted); - } - - protected void assertElementName(String expectedName, String actualName) { - assertEquals("Local name of element declaration is wrong.", - expectedName, actualName); - } - - protected void assertElementNull(XSElementDeclaration elem) { - assertNull("Element declaration should be null.", elem); - } - - protected void assertElementNamespace(String expectedName, String actualName) { - assertEquals("Namespace of element declaration is wrong.", - expectedName, actualName); - } - - protected void assertElementNamespaceNull(String actualName) { - assertNull("Local name of element declaration should be null.", - actualName); - } - - protected void assertTypeName(String expectedName, String actualName) { - assertEquals("Local name of type definition is wrong.", expectedName, - actualName); - } - - protected void assertTypeNull(XSTypeDefinition type) { - assertNull("Type definition should be null.", type); - } - - protected void assertTypeNamespace(String expectedName, String actualName) { - assertEquals("Namespace of type definition is wrong.", expectedName, - actualName); - } - - protected void assertTypeNamespaceNull(String actualName) { - assertNull("Namespace of type definition should be null.", actualName); - } - - protected void assertError(String error) { - assertTrue("Error <" + error + "> should have occured, but did not.", - fErrorHandler.specialCaseFound(error)); - } - - protected void assertNoError(String error) { - assertFalse("Error <" + error - + "> should not have occured (but it did)", fErrorHandler - .specialCaseFound(error)); - } - - protected void assertAnyType(XSTypeDefinition type) { - assertEquals("Type is supposed to be anyType", SchemaGrammar.fAnyType, - type); - } - - void assertEquals(String msg, Object expected, Object actual) { - if (!expected.equals(actual)) { - fail(msg + " Expected: " + expected + " Actual: " + actual); - } else { - success(null); - } - } - void assertNull(String msg, Object value) { - if (value != null) { - fail(msg); - } else { - success(null); - } - } - void assertTrue(String msg, boolean value) { - if (!value) { - fail(msg); - } else { - success(null); - } - } - void assertFalse(String msg, boolean value) { - if (value) { - fail(msg); - } else { - success(null); - } - } - void fail(String errMsg) { - if (errMessage == null) { - errMessage = errMsg; - } else { - errMessage = errMessage + "\n" + errMsg; - } - failed++; - } - - void success(String msg) { - passed++; - System.out.println(msg); - if (msg != null) { - if (msg.length() != 0) { - System.out.println(msg); - } - } - } -}
--- a/test/javax/xml/jaxp/testng/validation/8037819/BasicTest.java Thu Oct 16 12:02:05 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl; -import com.sun.org.apache.xerces.internal.xs.ItemPSVI; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -public class BasicTest extends BaseTest { - - protected String getXMLDocument() { - return "base.xml"; - } - - protected String getSchemaFile() { - return "base.xsd"; - } - - public BasicTest(String name) { - super(name); - } - - @BeforeClass - protected void setUp() throws Exception { - super.setUp(); - } - - @AfterClass - protected void tearDown() throws Exception { - super.tearDown(); - } - - @Test - public void testSimpleValidation() { - try { - reset(); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - doValidityAsserts(); - } - - @Test - public void testSimpleValidationWithTrivialXSIType() { - try { - reset(); - ((PSVIElementNSImpl) fRootNode).setAttributeNS( - "http://www.w3.org/2001/XMLSchema-instance", "type", "X"); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - doValidityAsserts(); - } - - private void doValidityAsserts() { - assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode - .getValidationAttempted()); - assertElementName("A", fRootNode.getElementDeclaration().getName()); - assertElementNamespaceNull(fRootNode.getElementDeclaration() - .getNamespace()); - assertTypeName("X", fRootNode.getTypeDefinition().getName()); - assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace()); - } -}
--- a/test/javax/xml/jaxp/testng/validation/8037819/FixedAttrTest.java Thu Oct 16 12:02:05 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl; -import com.sun.org.apache.xerces.internal.xs.ItemPSVI; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -/** - * The purpose of this test is to execute all of the isComparable calls in - * XMLSchemaValidator. There are two calls in processElementContent and two - * calls in processOneAttribute. - * - * @author peterjm - */ -public class FixedAttrTest extends BaseTest { - - protected String getXMLDocument() { - return "fixedAttr.xml"; - } - - protected String getSchemaFile() { - return "base.xsd"; - } - - public FixedAttrTest(String name) { - super(name); - } - - @BeforeClass - protected void setUp() throws Exception { - super.setUp(); - } - - @AfterClass - protected void tearDown() throws Exception { - super.tearDown(); - } - - @Test - public void testDefault() { - try { - reset(); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode - .getValidationAttempted()); - assertElementName("A", fRootNode.getElementDeclaration().getName()); - - PSVIElementNSImpl child = super.getChild(1); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("B", child.getElementDeclaration().getName()); - - child = super.getChild(2); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("D", child.getElementDeclaration().getName()); - } -}
--- a/test/javax/xml/jaxp/testng/validation/8037819/IdIdrefCheckingTest.java Thu Oct 16 12:02:05 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,160 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl; -import com.sun.org.apache.xerces.internal.xs.ItemPSVI; -import org.xml.sax.SAXException; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -// duplicate IDs -// reference to non-existent ID - -public class IdIdrefCheckingTest extends BaseTest { - public static final String DUPLICATE_ID = "cvc-id.2"; - - public static final String NO_ID_BINDING = "cvc-id.1"; - - protected String getXMLDocument() { - return "idIdref.xml"; - } - - protected String getSchemaFile() { - return "base.xsd"; - } - - protected String[] getRelevantErrorIDs() { - return new String[] { DUPLICATE_ID, NO_ID_BINDING }; - } - - public IdIdrefCheckingTest(String name) { - super(name); - } - - @BeforeClass - protected void setUp() throws Exception { - super.setUp(); - } - - @AfterClass - protected void tearDown() throws Exception { - super.tearDown(); - } - - @Test - public void testDefault() { - try { - reset(); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkDefault(); - } - - @Test - public void testSetFalse() { - try { - reset(); - fValidator.setFeature(ID_IDREF_CHECKING, false); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkValidResult(); - } - - @Test - public void testSetTrue() { - try { - reset(); - fValidator.setFeature(ID_IDREF_CHECKING, true); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkDefault(); - } - - private void checkDefault() { - assertError(DUPLICATE_ID); - assertError(NO_ID_BINDING); - - assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode - .getValidationAttempted()); - assertElementName("A", fRootNode.getElementDeclaration().getName()); - assertTypeName("X", fRootNode.getTypeDefinition().getName()); - - PSVIElementNSImpl child = super.getChild(1); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("A", child.getElementDeclaration().getName()); - assertTypeName("idType", child.getTypeDefinition().getName()); - - child = super.getChild(2); - assertValidity(ItemPSVI.VALIDITY_INVALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("A", child.getElementDeclaration().getName()); - assertTypeName("idType", child.getTypeDefinition().getName()); - - child = super.getChild(3); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("A", child.getElementDeclaration().getName()); - assertTypeName("idrefType", child.getTypeDefinition().getName()); - } - - private void checkValidResult() { - assertNoError(DUPLICATE_ID); - assertNoError(NO_ID_BINDING); - - assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode - .getValidationAttempted()); - assertElementName("A", fRootNode.getElementDeclaration().getName()); - assertTypeName("X", fRootNode.getTypeDefinition().getName()); - - PSVIElementNSImpl child = super.getChild(1); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("A", child.getElementDeclaration().getName()); - assertTypeName("idType", child.getTypeDefinition().getName()); - - child = super.getChild(2); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("A", child.getElementDeclaration().getName()); - assertTypeName("idType", child.getTypeDefinition().getName()); - - child = super.getChild(3); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("A", child.getElementDeclaration().getName()); - assertTypeName("idrefType", child.getTypeDefinition().getName()); - } -}
--- a/test/javax/xml/jaxp/testng/validation/8037819/IdentityConstraintCheckingTest.java Thu Oct 16 12:02:05 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,186 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl; -import com.sun.org.apache.xerces.internal.xs.ItemPSVI; -import org.xml.sax.SAXException; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -public class IdentityConstraintCheckingTest extends BaseTest { - // These values are unstable, since they're not actually error keys, but - // simply - // the first part of the error message. - public static final String DUPLICATE_UNIQUE = "cvc-identity-constraint.4.1"; - - public static final String DUPLICATE_KEY = "cvc-identity-constraint.4.2.2"; - - public static final String INVALID_KEYREF = "cvc-identity-constraint.4.3"; - - protected String getXMLDocument() { - return "idc.xml"; - } - - protected String getSchemaFile() { - return "idc.xsd"; - } - - protected String[] getRelevantErrorIDs() { - return new String[] { DUPLICATE_UNIQUE, DUPLICATE_KEY, INVALID_KEYREF }; - } - - public IdentityConstraintCheckingTest(String name) { - super(name); - } - - @BeforeClass - protected void setUp() throws Exception { - super.setUp(); - } - - @AfterClass - protected void tearDown() throws Exception { - super.tearDown(); - } - - @Test - public void testDefault() { - try { - reset(); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkDefault(); - } - - @Test - public void testSetFalse() { - try { - reset(); - fValidator.setFeature(IDC_CHECKING, false); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkValidResult(); - } - - @Test - public void testSetTrue() { - try { - reset(); - fValidator.setFeature(IDC_CHECKING, true); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkDefault(); - } - - private void checkDefault() { - assertError(DUPLICATE_UNIQUE); - assertError(DUPLICATE_KEY); - assertError(INVALID_KEYREF); - - assertValidity(ItemPSVI.VALIDITY_INVALID, fRootNode.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode - .getValidationAttempted()); - assertElementName("itemList", fRootNode.getElementDeclaration() - .getName()); - assertTypeName("itemListType", fRootNode.getTypeDefinition().getName()); - - // this one is valid because it's the first one to define the unique - // value - PSVIElementNSImpl child = super.getChild(1); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("item", child.getElementDeclaration().getName()); - assertTypeName("itemType", child.getTypeDefinition().getName()); - - // invalid because it repeats the unique value - child = super.getChild(2); - assertValidity(ItemPSVI.VALIDITY_INVALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("item", child.getElementDeclaration().getName()); - assertTypeName("itemType", child.getTypeDefinition().getName()); - - // invalid because it repeats the key - child = super.getChild(3); - assertValidity(ItemPSVI.VALIDITY_INVALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("item", child.getElementDeclaration().getName()); - assertTypeName("itemType", child.getTypeDefinition().getName()); - - // valid because key references aren't figured out until the validation - // root - child = super.getChild(4); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("itemRef", child.getElementDeclaration().getName()); - assertTypeName("string", child.getTypeDefinition().getName()); - } - - private void checkValidResult() { - assertNoError(DUPLICATE_UNIQUE); - assertNoError(DUPLICATE_KEY); - assertNoError(INVALID_KEYREF); - - assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode - .getValidationAttempted()); - assertElementName("itemList", fRootNode.getElementDeclaration() - .getName()); - assertTypeName("itemListType", fRootNode.getTypeDefinition().getName()); - - PSVIElementNSImpl child = super.getChild(1); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("item", child.getElementDeclaration().getName()); - assertTypeName("itemType", child.getTypeDefinition().getName()); - - child = super.getChild(2); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("item", child.getElementDeclaration().getName()); - assertTypeName("itemType", child.getTypeDefinition().getName()); - - child = super.getChild(3); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("item", child.getElementDeclaration().getName()); - assertTypeName("itemType", child.getTypeDefinition().getName()); - - child = super.getChild(4); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("itemRef", child.getElementDeclaration().getName()); - assertTypeName("string", child.getTypeDefinition().getName()); - } -}
--- a/test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_A_A.java Thu Oct 16 12:02:05 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,151 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl; -import com.sun.org.apache.xerces.internal.xs.ItemPSVI; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -public class IgnoreXSITypeTest_A_A extends BaseTest { - - protected String getXMLDocument() { - return "xsitype_A_A.xml"; - } - - protected String getSchemaFile() { - return "base.xsd"; - } - - public IgnoreXSITypeTest_A_A(String name) { - super(name); - } - - @BeforeClass - protected void setUp() throws Exception { - super.setUp(); - } - - @AfterClass - protected void tearDown() throws Exception { - super.tearDown(); - } - - @Test - public void testDefaultDocument() { - try { - reset(); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - // default value of the feature is false - checkFalseResult(); - } - - @Test - public void testDefaultFragment() { - try { - reset(); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - // default value of the feature is false - checkFalseResult(); - } - - @Test - public void testSetFalseDocument() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, false); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkFalseResult(); - } - - @Test - public void testSetFalseFragment() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, false); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkFalseResult(); - } - - @Test - public void testSetTrueDocument() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, true); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkTrueResult(); - } - - @Test - public void testSetTrueFragment() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, true); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkTrueResult(); - } - - private void checkTrueResult() { - checkResult(); - } - - private void checkFalseResult() { - checkResult(); - } - - private void checkResult() { - assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode - .getValidationAttempted()); - assertElementName("A", fRootNode.getElementDeclaration().getName()); - assertTypeName("Y", fRootNode.getTypeDefinition().getName()); - assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace()); - - PSVIElementNSImpl child = super.getChild(1); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("A", child.getElementDeclaration().getName()); - assertTypeName("Y", child.getTypeDefinition().getName()); - assertTypeNamespaceNull(child.getTypeDefinition().getNamespace()); - } -}
--- a/test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_A_C.java Thu Oct 16 12:02:05 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,151 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl; -import com.sun.org.apache.xerces.internal.xs.ItemPSVI; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -public class IgnoreXSITypeTest_A_C extends BaseTest { - - protected String getXMLDocument() { - return "xsitype_A_C.xml"; - } - - protected String getSchemaFile() { - return "base.xsd"; - } - - public IgnoreXSITypeTest_A_C(String name) { - super(name); - } - - - @BeforeClass - protected void setUp() throws Exception { - super.setUp(); - } - - @AfterClass - protected void tearDown() throws Exception { - super.tearDown(); - } - - @Test - public void testDefaultDocument() { - try { - reset(); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - // default value of the feature is false - checkFalseResult(); - } - - @Test - public void testDefaultFragment() { - try { - reset(); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - // default value of the feature is false - checkFalseResult(); - } - - @Test - public void testSetFalseDocument() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, false); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkFalseResult(); - } - - @Test - public void testSetFalseFragment() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, false); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkFalseResult(); - } - - @Test - public void testSetTrueDocument() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, true); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkTrueResult(); - } - - @Test - public void testSetTrueFragment() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, true); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkTrueResult(); - } - - private void checkTrueResult() { - checkResult(); - } - - private void checkFalseResult() { - checkResult(); - } - - private void checkResult() { - assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode - .getValidationAttempted()); - assertElementName("A", fRootNode.getElementDeclaration().getName()); - assertTypeName("Y", fRootNode.getTypeDefinition().getName()); - assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace()); - - PSVIElementNSImpl child = super.getChild(1); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementNull(child.getElementDeclaration()); - assertTypeName("Y", child.getTypeDefinition().getName()); - assertTypeNamespaceNull(child.getTypeDefinition().getNamespace()); - } -}
--- a/test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_C_A.java Thu Oct 16 12:02:05 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl; -import com.sun.org.apache.xerces.internal.xs.ItemPSVI; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -public class IgnoreXSITypeTest_C_A extends BaseTest { - - protected String getXMLDocument() { - return "xsitype_C_A.xml"; - } - - protected String getSchemaFile() { - return "base.xsd"; - } - - public IgnoreXSITypeTest_C_A(String name) { - super(name); - } - - - @BeforeClass - protected void setUp() throws Exception { - super.setUp(); - } - - @AfterClass - protected void tearDown() throws Exception { - super.tearDown(); - } - - @Test - public void testDefaultDocument() { - try { - reset(); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - // default value of the feature is false - checkFalseResult(); - } - - @Test - public void testDefaultFragment() { - try { - reset(); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - // default value of the feature is false - checkFalseResult(); - } - - @Test - public void testSetFalseDocument() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, false); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkFalseResult(); - } - - @Test - public void testSetFalseFragment() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, false); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkFalseResult(); - } - - @Test - public void testSetTrueDocument() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, true); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkTrueResult(); - } - - @Test - public void testSetTrueFragment() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, true); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkTrueResult(); - } - - private void checkTrueResult() { - assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_PARTIAL, fRootNode - .getValidationAttempted()); - assertElementNull(fRootNode.getElementDeclaration()); - assertAnyType(fRootNode.getTypeDefinition()); - - checkChild(); - } - - private void checkFalseResult() { - assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, fRootNode - .getValidationAttempted()); - assertElementNull(fRootNode.getElementDeclaration()); - assertTypeName("Y", fRootNode.getTypeDefinition().getName()); - assertTypeNamespaceNull(fRootNode.getTypeDefinition().getNamespace()); - - checkChild(); - } - - private void checkChild() { - PSVIElementNSImpl child = super.getChild(1); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("A", child.getElementDeclaration().getName()); - assertTypeName("Y", child.getTypeDefinition().getName()); - assertTypeNamespaceNull(child.getTypeDefinition().getNamespace()); - } -}
--- a/test/javax/xml/jaxp/testng/validation/8037819/IgnoreXSITypeTest_C_AC.java Thu Oct 16 12:02:05 2014 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,174 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.sun.org.apache.xerces.internal.dom.PSVIElementNSImpl; -import com.sun.org.apache.xerces.internal.xs.ItemPSVI; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -public class IgnoreXSITypeTest_C_AC extends BaseTest { - - protected String getXMLDocument() { - return "xsitype_C_AC.xml"; - } - - protected String getSchemaFile() { - return "base.xsd"; - } - - public IgnoreXSITypeTest_C_AC(String name) { - super(name); - } - - - @BeforeClass - protected void setUp() throws Exception { - super.setUp(); - } - - @AfterClass - protected void tearDown() throws Exception { - super.tearDown(); - } - - @Test - public void testDefaultDocument() { - try { - reset(); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - // default value of the feature is false - checkFalseResult(); - } - - @Test - public void testDefaultFragment() { - try { - reset(); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - // default value of the feature is false - checkFalseResult(); - } - - @Test - public void testSetFalseDocument() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, false); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkFalseResult(); - } - - @Test - public void testSetFalseFragment() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, false); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkFalseResult(); - } - - @Test - public void testSetTrueDocument() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, true); - validateDocument(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkTrueResult(); - } - - @Test - public void testSetTrueFragment() { - try { - reset(); - fValidator.setFeature(IGNORE_XSI_TYPE, true); - validateFragment(); - } catch (Exception e) { - fail("Validation failed: " + e.getMessage()); - } - - checkTrueResult(); - } - - private void checkTrueResult() { - assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, fRootNode.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_PARTIAL, fRootNode - .getValidationAttempted()); - assertElementNull(fRootNode.getElementDeclaration()); - assertAnyType(fRootNode.getTypeDefinition()); - - PSVIElementNSImpl child = super.getChild(1); - assertValidity(ItemPSVI.VALIDITY_VALID, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_FULL, child - .getValidationAttempted()); - assertElementName("A", child.getElementDeclaration().getName()); - assertTypeName("Y", child.getTypeDefinition().getName()); - assertTypeNamespaceNull(child.getTypeDefinition().getNamespace()); - - child = super.getChild(2); - assertValidity(ItemPSVI.VALIDITY_NOTKNOWN, child.getValidity()); - assertValidationAttempted(ItemPSVI.VALIDATION_NONE, child - .getValidationAttempted()); - assertElementNull(child.getElementDeclaration()); - assertAnyType(child.getTypeDefinition()); - } - - private void checkFalseResult() { - assertValidity(ItemPSVI.VALIDITY_VALID, fRootNode.getValidity()); -