diff --git a/.hgtags b/.hgtags
index 51b65df7123..cf17b470a4f 100644
--- a/.hgtags
+++ b/.hgtags
@@ -394,3 +394,5 @@ f4e854a77aa38749bd90f722b06974a56e7233d5 jdk-9+147
cf139f925da04c8bd7efd33270a0315d72b338d3 jdk-9+149
17469f16fbb406ec9f0dd262ce776ab6efbc38f1 jdk-9+150
37b95df0042ae0687324e1f7dc4a2519e230e704 jdk-9+151
+ab2c8b03c3284fcbdd157551a66f807e3a182d9b jdk-9+152
+d7034ff7f8e257e81c9f95c7785dd4eaaa3c2afc jdk-9+153
diff --git a/.hgtags-top-repo b/.hgtags-top-repo
index 5e9f2c1b877..e54c4180d63 100644
--- a/.hgtags-top-repo
+++ b/.hgtags-top-repo
@@ -394,3 +394,5 @@ a22e2671d88f6b22a4aa82e3966986542ed2a381 jdk-9+146
b119012d1c2ab2570fe8718633840d0c1f1f441d jdk-9+149
6234069ff9789f7582e1faa32cb6283cbd1a5a2d jdk-9+150
71a766d4c18041a7f833ee22823125b02e1a7f1e jdk-9+151
+ef056360ddf3977d7d2ddbeb456a4d612d19ea05 jdk-9+152
+816a6d03a7c44edfbd8780110529f1bdc3964fb9 jdk-9+153
diff --git a/common/autoconf/basics.m4 b/common/autoconf/basics.m4
index 9d5789e37ca..17c03533dd7 100644
--- a/common/autoconf/basics.m4
+++ b/common/autoconf/basics.m4
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2017, 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
@@ -1011,6 +1011,8 @@ AC_DEFUN([BASIC_CHECK_TAR],
# Test which kind of tar was found
if test "x$($TAR --version | $GREP "GNU tar")" != "x"; then
TAR_TYPE="gnu"
+ elif test "x$($TAR --version | $GREP "bsdtar")" != "x"; then
+ TAR_TYPE="bsd"
elif test "x$($TAR -v | $GREP "bsdtar")" != "x"; then
TAR_TYPE="bsd"
elif test "x$OPENJDK_BUILD_OS" = "xsolaris"; then
@@ -1038,12 +1040,36 @@ AC_DEFUN([BASIC_CHECK_TAR],
AC_SUBST(TAR_SUPPORTS_TRANSFORM)
])
+AC_DEFUN([BASIC_CHECK_GREP],
+[
+ # Test that grep supports -Fx with a list of pattern which includes null pattern.
+ # This is a problem for the grep resident on AIX.
+ AC_MSG_CHECKING([that grep ($GREP) -Fx handles empty lines in the pattern list correctly])
+ # Multiple subsequent spaces..
+ STACK_SPACES='aaa bbb ccc'
+ # ..converted to subsequent newlines, causes STACK_LIST to be a list with some empty
+ # patterns in it.
+ STACK_LIST=${STACK_SPACES// /$'\n'}
+ NEEDLE_SPACES='ccc bbb aaa'
+ NEEDLE_LIST=${NEEDLE_SPACES// /$'\n'}
+ RESULT="$($GREP -Fvx "$STACK_LIST" <<< "$NEEDLE_LIST")"
+ if test "x$RESULT" == "x"; then
+ AC_MSG_RESULT([yes])
+ else
+ if test "x$OPENJDK_TARGET_OS" = "xaix"; then
+ ADDINFO="Please make sure you use GNU grep, usually found at /opt/freeware/bin."
+ fi
+ AC_MSG_ERROR([grep does not handle -Fx correctly. ${ADDINFO}])
+ fi
+])
+
AC_DEFUN_ONCE([BASIC_SETUP_COMPLEX_TOOLS],
[
BASIC_CHECK_GNU_MAKE
BASIC_CHECK_FIND_DELETE
BASIC_CHECK_TAR
+ BASIC_CHECK_GREP
# These tools might not be installed by default,
# need hint on how to install them.
diff --git a/common/autoconf/buildjdk-spec.gmk.in b/common/autoconf/buildjdk-spec.gmk.in
index d6abc423239..dbb4fcb1e6d 100644
--- a/common/autoconf/buildjdk-spec.gmk.in
+++ b/common/autoconf/buildjdk-spec.gmk.in
@@ -68,7 +68,6 @@ LDFLAGS_JDKLIB := @OPENJDK_BUILD_LDFLAGS_JDKLIB@
CFLAGS_JDKEXE := @OPENJDK_BUILD_CFLAGS_JDKEXE@
CXXFLAGS_JDKEXE := @OPENJDK_BUILD_CXXFLAGS_JDKEXE@
LDFLAGS_JDKEXE := @OPENJDK_BUILD_LDFLAGS_JDKEXE@
-OPENJDK_TARGET_CPU_JLI_CFLAGS := @OPENJDK_BUILD_CPU_JLI_CFLAGS@
JVM_CFLAGS := @OPENJDK_BUILD_JVM_CFLAGS@
JVM_LDFLAGS := @OPENJDK_BUILD_JVM_LDFLAGS@
diff --git a/common/autoconf/flags.m4 b/common/autoconf/flags.m4
index f52d76762ef..e5ae8eed060 100644
--- a/common/autoconf/flags.m4
+++ b/common/autoconf/flags.m4
@@ -815,11 +815,6 @@ AC_DEFUN([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK_HELPER],
$2CXXFLAGS_JDK="${$2CXXFLAGS_JDK} -D__solaris__"
fi
- if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- $2CFLAGS_JDK="${$2CFLAGS_JDK} -D__solaris__"
- $2CXXFLAGS_JDK="${$2CXXFLAGS_JDK} -D__solaris__"
- fi
-
$2CFLAGS_JDK="${$2CFLAGS_JDK} ${$2EXTRA_CFLAGS}"
$2CXXFLAGS_JDK="${$2CXXFLAGS_JDK} ${$2EXTRA_CXXFLAGS}"
$2LDFLAGS_JDK="${$2LDFLAGS_JDK} ${$2EXTRA_LDFLAGS}"
diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh
index ad551b650c9..006fff3175c 100644
--- a/common/autoconf/generated-configure.sh
+++ b/common/autoconf/generated-configure.sh
@@ -3564,7 +3564,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
# Include these first...
#
-# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2017, 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
@@ -3731,6 +3731,8 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
# Check if build directory is on local disk. If not possible to determine,
# we prefer to claim it's local.
# Argument 1: directory to test
@@ -4122,7 +4124,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
#
-# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2017, 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
@@ -4237,6 +4239,17 @@ yum_help() {
esac
}
+brew_help() {
+ case $1 in
+ openjdk)
+ PKGHANDLER_COMMAND="brew cask install java" ;;
+ freetype)
+ PKGHANDLER_COMMAND="brew install freetype" ;;
+ ccache)
+ PKGHANDLER_COMMAND="brew install ccache" ;;
+ esac
+}
+
port_help() {
PKGHANDLER_COMMAND=""
}
@@ -4362,7 +4375,7 @@ VALID_JVM_VARIANTS="server client minimal core zero zeroshark custom"
#
-# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2017, 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
@@ -4667,7 +4680,7 @@ VALID_JVM_VARIANTS="server client minimal core zero zeroshark custom"
#
-# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2017, 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
@@ -5167,7 +5180,7 @@ VS_SDK_PLATFORM_NAME_2013=
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1483542685
+DATE_WHEN_GENERATED=1484571183
###############################################################################
#
@@ -17544,7 +17557,7 @@ $as_echo "$as_me: The path of OUTPUT_ROOT, which resolves as \"$path\", is inval
# Must be done before we can call HELP_MSG_MISSING_DEPENDENCY.
- for ac_prog in apt-get yum port pkgutil pkgadd
+ for ac_prog in apt-get yum brew port pkgutil pkgadd
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
@@ -21209,6 +21222,8 @@ $as_echo "yes" >&6; }
# Test which kind of tar was found
if test "x$($TAR --version | $GREP "GNU tar")" != "x"; then
TAR_TYPE="gnu"
+ elif test "x$($TAR --version | $GREP "bsdtar")" != "x"; then
+ TAR_TYPE="bsd"
elif test "x$($TAR -v | $GREP "bsdtar")" != "x"; then
TAR_TYPE="bsd"
elif test "x$OPENJDK_BUILD_OS" = "xsolaris"; then
@@ -21238,6 +21253,29 @@ $as_echo "$TAR_TYPE" >&6; }
+ # Test that grep supports -Fx with a list of pattern which includes null pattern.
+ # This is a problem for the grep resident on AIX.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking that grep ($GREP) -Fx handles empty lines in the pattern list correctly" >&5
+$as_echo_n "checking that grep ($GREP) -Fx handles empty lines in the pattern list correctly... " >&6; }
+ # Multiple subsequent spaces..
+ STACK_SPACES='aaa bbb ccc'
+ # ..converted to subsequent newlines, causes STACK_LIST to be a list with some empty
+ # patterns in it.
+ STACK_LIST=${STACK_SPACES// /$'\n'}
+ NEEDLE_SPACES='ccc bbb aaa'
+ NEEDLE_LIST=${NEEDLE_SPACES// /$'\n'}
+ RESULT="$($GREP -Fvx "$STACK_LIST" <<< "$NEEDLE_LIST")"
+ if test "x$RESULT" == "x"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ if test "x$OPENJDK_TARGET_OS" = "xaix"; then
+ ADDINFO="Please make sure you use GNU grep, usually found at /opt/freeware/bin."
+ fi
+ as_fn_error $? "grep does not handle -Fx correctly. ${ADDINFO}" "$LINENO" 5
+ fi
+
+
# These tools might not be installed by default,
# need hint on how to install them.
@@ -24359,15 +24397,13 @@ if test "${enable_keep_packaged_modules+set}" = set; then :
fi
- if test "x$enable_keep_packaged_modules" = "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if packaged modules are kept" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if packaged modules are kept" >&5
$as_echo_n "checking if packaged modules are kept... " >&6; }
+ if test "x$enable_keep_packaged_modules" = "xyes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
JLINK_KEEP_PACKAGED_MODULES=true
elif test "x$enable_keep_packaged_modules" = "xno"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if packaged modules are kept" >&5
-$as_echo_n "checking if packaged modules are kept... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
JLINK_KEEP_PACKAGED_MODULES=false
@@ -24376,6 +24412,8 @@ $as_echo "no" >&6; }
$as_echo "yes (default)" >&6; }
JLINK_KEEP_PACKAGED_MODULES=true
else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: error" >&5
+$as_echo "error" >&6; }
as_fn_error $? "--enable-keep-packaged-modules accepts no argument" "$LINENO" 5
fi
@@ -29942,6 +29980,8 @@ $as_echo "$BOOT_JDK_VERSION" >&6; }
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -33235,6 +33275,8 @@ done
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -34534,6 +34576,8 @@ done
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -48601,6 +48645,8 @@ $as_echo "$as_me: Failed to compile stdio.h. This likely implies missing compile
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -48762,6 +48808,8 @@ $as_echo "$as_me: The tested number of bits in the target ($TESTED_TARGET_CPU_BI
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -49897,11 +49945,6 @@ $as_echo "$supports" >&6; }
CXXFLAGS_JDK="${CXXFLAGS_JDK} -D__solaris__"
fi
- if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- CFLAGS_JDK="${CFLAGS_JDK} -D__solaris__"
- CXXFLAGS_JDK="${CXXFLAGS_JDK} -D__solaris__"
- fi
-
CFLAGS_JDK="${CFLAGS_JDK} ${EXTRA_CFLAGS}"
CXXFLAGS_JDK="${CXXFLAGS_JDK} ${EXTRA_CXXFLAGS}"
LDFLAGS_JDK="${LDFLAGS_JDK} ${EXTRA_LDFLAGS}"
@@ -50720,11 +50763,6 @@ $as_echo "$supports" >&6; }
OPENJDK_BUILD_CXXFLAGS_JDK="${OPENJDK_BUILD_CXXFLAGS_JDK} -D__solaris__"
fi
- if test "x$OPENJDK_TARGET_OS" = xsolaris; then
- OPENJDK_BUILD_CFLAGS_JDK="${OPENJDK_BUILD_CFLAGS_JDK} -D__solaris__"
- OPENJDK_BUILD_CXXFLAGS_JDK="${OPENJDK_BUILD_CXXFLAGS_JDK} -D__solaris__"
- fi
-
OPENJDK_BUILD_CFLAGS_JDK="${OPENJDK_BUILD_CFLAGS_JDK} ${OPENJDK_BUILD_EXTRA_CFLAGS}"
OPENJDK_BUILD_CXXFLAGS_JDK="${OPENJDK_BUILD_CXXFLAGS_JDK} ${OPENJDK_BUILD_EXTRA_CXXFLAGS}"
OPENJDK_BUILD_LDFLAGS_JDK="${OPENJDK_BUILD_LDFLAGS_JDK} ${OPENJDK_BUILD_EXTRA_LDFLAGS}"
@@ -52844,6 +52882,8 @@ $as_echo "no, missing dependencies" >&6; }
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -56649,6 +56689,8 @@ fi
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -56721,6 +56763,8 @@ done
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -56864,6 +56908,8 @@ done
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -60683,6 +60729,345 @@ $as_echo "$as_me: Rewriting POTENTIAL_FREETYPE_LIB_PATH to \"$new_path\"" >&6;}
fi
+ windows_path="$new_path"
+ if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
+ unix_path=`$CYGPATH -u "$windows_path"`
+ new_path="$unix_path"
+ elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
+ unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'`
+ new_path="$unix_path"
+ fi
+
+ if test "x$path" != "x$new_path"; then
+ POTENTIAL_FREETYPE_LIB_PATH="$new_path"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting POTENTIAL_FREETYPE_LIB_PATH to \"$new_path\"" >&5
+$as_echo "$as_me: Rewriting POTENTIAL_FREETYPE_LIB_PATH to \"$new_path\"" >&6;}
+ fi
+
+ # Save the first 10 bytes of this path to the storage, so fixpath can work.
+ all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}")
+
+ else
+ # We're on a unix platform. Hooray! :)
+ path="$POTENTIAL_FREETYPE_LIB_PATH"
+ has_space=`$ECHO "$path" | $GREP " "`
+ if test "x$has_space" != x; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: The path of POTENTIAL_FREETYPE_LIB_PATH, which resolves as \"$path\", is invalid." >&5
+$as_echo "$as_me: The path of POTENTIAL_FREETYPE_LIB_PATH, which resolves as \"$path\", is invalid." >&6;}
+ as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5
+ fi
+
+ # Use eval to expand a potential ~
+ eval path="$path"
+ if test ! -f "$path" && test ! -d "$path"; then
+ as_fn_error $? "The path of POTENTIAL_FREETYPE_LIB_PATH, which resolves as \"$path\", is not found." "$LINENO" 5
+ fi
+
+ if test -d "$path"; then
+ POTENTIAL_FREETYPE_LIB_PATH="`cd "$path"; $THEPWDCMD -L`"
+ else
+ dir="`$DIRNAME "$path"`"
+ base="`$BASENAME "$path"`"
+ POTENTIAL_FREETYPE_LIB_PATH="`cd "$dir"; $THEPWDCMD -L`/$base"
+ fi
+ fi
+ fi
+
+
+ FREETYPE_INCLUDE_PATH="$POTENTIAL_FREETYPE_INCLUDE_PATH"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype includes" >&5
+$as_echo_n "checking for freetype includes... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_INCLUDE_PATH" >&5
+$as_echo "$FREETYPE_INCLUDE_PATH" >&6; }
+ FREETYPE_LIB_PATH="$POTENTIAL_FREETYPE_LIB_PATH"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype libraries" >&5
+$as_echo_n "checking for freetype libraries... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_LIB_PATH" >&5
+$as_echo "$FREETYPE_LIB_PATH" >&6; }
+ fi
+
+ fi
+ if test "x$FOUND_FREETYPE" != xyes; then
+ FREETYPE_BASE_DIR="$SYSROOT/usr/local"
+
+ POTENTIAL_FREETYPE_INCLUDE_PATH="$FREETYPE_BASE_DIR/include"
+ POTENTIAL_FREETYPE_LIB_PATH="$FREETYPE_BASE_DIR/lib"
+ METHOD="well-known location"
+
+ # Let's start with an optimistic view of the world :-)
+ FOUND_FREETYPE=yes
+
+ # First look for the canonical freetype main include file ft2build.h.
+ if ! test -s "$POTENTIAL_FREETYPE_INCLUDE_PATH/ft2build.h"; then
+ # Oh no! Let's try in the freetype2 directory. This is needed at least at Mac OS X Yosemite.
+ POTENTIAL_FREETYPE_INCLUDE_PATH="$POTENTIAL_FREETYPE_INCLUDE_PATH/freetype2"
+ if ! test -s "$POTENTIAL_FREETYPE_INCLUDE_PATH/ft2build.h"; then
+ # Fail.
+ FOUND_FREETYPE=no
+ fi
+ fi
+
+ if test "x$FOUND_FREETYPE" = xyes; then
+ # Include file found, let's continue the sanity check.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Found freetype include files at $POTENTIAL_FREETYPE_INCLUDE_PATH using $METHOD" >&5
+$as_echo "$as_me: Found freetype include files at $POTENTIAL_FREETYPE_INCLUDE_PATH using $METHOD" >&6;}
+
+ # Reset to default value
+ FREETYPE_BASE_NAME=freetype
+ FREETYPE_LIB_NAME="${LIBRARY_PREFIX}${FREETYPE_BASE_NAME}${SHARED_LIBRARY_SUFFIX}"
+ if ! test -s "$POTENTIAL_FREETYPE_LIB_PATH/$FREETYPE_LIB_NAME"; then
+ if test "x$OPENJDK_TARGET_OS" = xmacosx \
+ && test -s "$POTENTIAL_FREETYPE_LIB_PATH/${LIBRARY_PREFIX}freetype.6${SHARED_LIBRARY_SUFFIX}"; then
+ # On Mac OS X Yosemite, the symlink from libfreetype.dylib to libfreetype.6.dylib disappeared. Check
+ # for the .6 version explicitly.
+ FREETYPE_BASE_NAME=freetype.6
+ FREETYPE_LIB_NAME="${LIBRARY_PREFIX}${FREETYPE_BASE_NAME}${SHARED_LIBRARY_SUFFIX}"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Compensating for missing symlink by using version 6 explicitly" >&5
+$as_echo "$as_me: Compensating for missing symlink by using version 6 explicitly" >&6;}
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $POTENTIAL_FREETYPE_LIB_PATH/$FREETYPE_LIB_NAME. Ignoring location." >&5
+$as_echo "$as_me: Could not find $POTENTIAL_FREETYPE_LIB_PATH/$FREETYPE_LIB_NAME. Ignoring location." >&6;}
+ FOUND_FREETYPE=no
+ fi
+ else
+ if test "x$OPENJDK_TARGET_OS" = xwindows; then
+ # On Windows, we will need both .lib and .dll file.
+ if ! test -s "$POTENTIAL_FREETYPE_LIB_PATH/${FREETYPE_BASE_NAME}.lib"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $POTENTIAL_FREETYPE_LIB_PATH/${FREETYPE_BASE_NAME}.lib. Ignoring location." >&5
+$as_echo "$as_me: Could not find $POTENTIAL_FREETYPE_LIB_PATH/${FREETYPE_BASE_NAME}.lib. Ignoring location." >&6;}
+ FOUND_FREETYPE=no
+ fi
+ elif test "x$OPENJDK_TARGET_OS" = xsolaris \
+ && test -s "$POTENTIAL_FREETYPE_LIB_PATH$OPENJDK_TARGET_CPU_ISADIR/$FREETYPE_LIB_NAME"; then
+ # Found lib in isa dir, use that instead.
+ POTENTIAL_FREETYPE_LIB_PATH="$POTENTIAL_FREETYPE_LIB_PATH$OPENJDK_TARGET_CPU_ISADIR"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting to use $POTENTIAL_FREETYPE_LIB_PATH instead" >&5
+$as_echo "$as_me: Rewriting to use $POTENTIAL_FREETYPE_LIB_PATH instead" >&6;}
+ fi
+ fi
+ fi
+
+ if test "x$FOUND_FREETYPE" = xyes; then
+
+ # Only process if variable expands to non-empty
+
+ if test "x$POTENTIAL_FREETYPE_INCLUDE_PATH" != x; then
+ if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
+
+ # Input might be given as Windows format, start by converting to
+ # unix format.
+ path="$POTENTIAL_FREETYPE_INCLUDE_PATH"
+ new_path=`$CYGPATH -u "$path"`
+
+ # Cygwin tries to hide some aspects of the Windows file system, such that binaries are
+ # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered
+ # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then
+ # "foo.exe" is OK but "foo" is an error.
+ #
+ # This test is therefore slightly more accurate than "test -f" to check for file precense.
+ # It is also a way to make sure we got the proper file name for the real test later on.
+ test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null`
+ if test "x$test_shortpath" = x; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: The path of POTENTIAL_FREETYPE_INCLUDE_PATH, which resolves as \"$path\", is invalid." >&5
+$as_echo "$as_me: The path of POTENTIAL_FREETYPE_INCLUDE_PATH, which resolves as \"$path\", is invalid." >&6;}
+ as_fn_error $? "Cannot locate the the path of POTENTIAL_FREETYPE_INCLUDE_PATH" "$LINENO" 5
+ fi
+
+ # Call helper function which possibly converts this using DOS-style short mode.
+ # If so, the updated path is stored in $new_path.
+
+ input_path="$new_path"
+ # Check if we need to convert this using DOS-style short mode. If the path
+ # contains just simple characters, use it. Otherwise (spaces, weird characters),
+ # take no chances and rewrite it.
+ # Note: m4 eats our [], so we need to use [ and ] instead.
+ has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]`
+ if test "x$has_forbidden_chars" != x; then
+ # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
+ shortmode_path=`$CYGPATH -s -m -a "$input_path"`
+ path_after_shortmode=`$CYGPATH -u "$shortmode_path"`
+ if test "x$path_after_shortmode" != "x$input_to_shortpath"; then
+ # Going to short mode and back again did indeed matter. Since short mode is
+ # case insensitive, let's make it lowercase to improve readability.
+ shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ # Now convert it back to Unix-style (cygpath)
+ input_path=`$CYGPATH -u "$shortmode_path"`
+ new_path="$input_path"
+ fi
+ fi
+
+ test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/`
+ if test "x$test_cygdrive_prefix" = x; then
+ # As a simple fix, exclude /usr/bin since it's not a real path.
+ if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then
+ # The path is in a Cygwin special directory (e.g. /home). We need this converted to
+ # a path prefixed by /cygdrive for fixpath to work.
+ new_path="$CYGWIN_ROOT_PATH$input_path"
+ fi
+ fi
+
+
+ if test "x$path" != "x$new_path"; then
+ POTENTIAL_FREETYPE_INCLUDE_PATH="$new_path"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting POTENTIAL_FREETYPE_INCLUDE_PATH to \"$new_path\"" >&5
+$as_echo "$as_me: Rewriting POTENTIAL_FREETYPE_INCLUDE_PATH to \"$new_path\"" >&6;}
+ fi
+
+ elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
+
+ path="$POTENTIAL_FREETYPE_INCLUDE_PATH"
+ has_colon=`$ECHO $path | $GREP ^.:`
+ new_path="$path"
+ if test "x$has_colon" = x; then
+ # Not in mixed or Windows style, start by that.
+ new_path=`cmd //c echo $path`
+ fi
+
+
+ input_path="$new_path"
+ # Check if we need to convert this using DOS-style short mode. If the path
+ # contains just simple characters, use it. Otherwise (spaces, weird characters),
+ # take no chances and rewrite it.
+ # Note: m4 eats our [], so we need to use [ and ] instead.
+ has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]`
+ if test "x$has_forbidden_chars" != x; then
+ # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
+ new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ fi
+
+
+ windows_path="$new_path"
+ if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
+ unix_path=`$CYGPATH -u "$windows_path"`
+ new_path="$unix_path"
+ elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
+ unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'`
+ new_path="$unix_path"
+ fi
+
+ if test "x$path" != "x$new_path"; then
+ POTENTIAL_FREETYPE_INCLUDE_PATH="$new_path"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting POTENTIAL_FREETYPE_INCLUDE_PATH to \"$new_path\"" >&5
+$as_echo "$as_me: Rewriting POTENTIAL_FREETYPE_INCLUDE_PATH to \"$new_path\"" >&6;}
+ fi
+
+ # Save the first 10 bytes of this path to the storage, so fixpath can work.
+ all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}")
+
+ else
+ # We're on a unix platform. Hooray! :)
+ path="$POTENTIAL_FREETYPE_INCLUDE_PATH"
+ has_space=`$ECHO "$path" | $GREP " "`
+ if test "x$has_space" != x; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: The path of POTENTIAL_FREETYPE_INCLUDE_PATH, which resolves as \"$path\", is invalid." >&5
+$as_echo "$as_me: The path of POTENTIAL_FREETYPE_INCLUDE_PATH, which resolves as \"$path\", is invalid." >&6;}
+ as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5
+ fi
+
+ # Use eval to expand a potential ~
+ eval path="$path"
+ if test ! -f "$path" && test ! -d "$path"; then
+ as_fn_error $? "The path of POTENTIAL_FREETYPE_INCLUDE_PATH, which resolves as \"$path\", is not found." "$LINENO" 5
+ fi
+
+ if test -d "$path"; then
+ POTENTIAL_FREETYPE_INCLUDE_PATH="`cd "$path"; $THEPWDCMD -L`"
+ else
+ dir="`$DIRNAME "$path"`"
+ base="`$BASENAME "$path"`"
+ POTENTIAL_FREETYPE_INCLUDE_PATH="`cd "$dir"; $THEPWDCMD -L`/$base"
+ fi
+ fi
+ fi
+
+
+ # Only process if variable expands to non-empty
+
+ if test "x$POTENTIAL_FREETYPE_LIB_PATH" != x; then
+ if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
+
+ # Input might be given as Windows format, start by converting to
+ # unix format.
+ path="$POTENTIAL_FREETYPE_LIB_PATH"
+ new_path=`$CYGPATH -u "$path"`
+
+ # Cygwin tries to hide some aspects of the Windows file system, such that binaries are
+ # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered
+ # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then
+ # "foo.exe" is OK but "foo" is an error.
+ #
+ # This test is therefore slightly more accurate than "test -f" to check for file precense.
+ # It is also a way to make sure we got the proper file name for the real test later on.
+ test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null`
+ if test "x$test_shortpath" = x; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: The path of POTENTIAL_FREETYPE_LIB_PATH, which resolves as \"$path\", is invalid." >&5
+$as_echo "$as_me: The path of POTENTIAL_FREETYPE_LIB_PATH, which resolves as \"$path\", is invalid." >&6;}
+ as_fn_error $? "Cannot locate the the path of POTENTIAL_FREETYPE_LIB_PATH" "$LINENO" 5
+ fi
+
+ # Call helper function which possibly converts this using DOS-style short mode.
+ # If so, the updated path is stored in $new_path.
+
+ input_path="$new_path"
+ # Check if we need to convert this using DOS-style short mode. If the path
+ # contains just simple characters, use it. Otherwise (spaces, weird characters),
+ # take no chances and rewrite it.
+ # Note: m4 eats our [], so we need to use [ and ] instead.
+ has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]`
+ if test "x$has_forbidden_chars" != x; then
+ # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
+ shortmode_path=`$CYGPATH -s -m -a "$input_path"`
+ path_after_shortmode=`$CYGPATH -u "$shortmode_path"`
+ if test "x$path_after_shortmode" != "x$input_to_shortpath"; then
+ # Going to short mode and back again did indeed matter. Since short mode is
+ # case insensitive, let's make it lowercase to improve readability.
+ shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ # Now convert it back to Unix-style (cygpath)
+ input_path=`$CYGPATH -u "$shortmode_path"`
+ new_path="$input_path"
+ fi
+ fi
+
+ test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/`
+ if test "x$test_cygdrive_prefix" = x; then
+ # As a simple fix, exclude /usr/bin since it's not a real path.
+ if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then
+ # The path is in a Cygwin special directory (e.g. /home). We need this converted to
+ # a path prefixed by /cygdrive for fixpath to work.
+ new_path="$CYGWIN_ROOT_PATH$input_path"
+ fi
+ fi
+
+
+ if test "x$path" != "x$new_path"; then
+ POTENTIAL_FREETYPE_LIB_PATH="$new_path"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting POTENTIAL_FREETYPE_LIB_PATH to \"$new_path\"" >&5
+$as_echo "$as_me: Rewriting POTENTIAL_FREETYPE_LIB_PATH to \"$new_path\"" >&6;}
+ fi
+
+ elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
+
+ path="$POTENTIAL_FREETYPE_LIB_PATH"
+ has_colon=`$ECHO $path | $GREP ^.:`
+ new_path="$path"
+ if test "x$has_colon" = x; then
+ # Not in mixed or Windows style, start by that.
+ new_path=`cmd //c echo $path`
+ fi
+
+
+ input_path="$new_path"
+ # Check if we need to convert this using DOS-style short mode. If the path
+ # contains just simple characters, use it. Otherwise (spaces, weird characters),
+ # take no chances and rewrite it.
+ # Note: m4 eats our [], so we need to use [ and ] instead.
+ has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]`
+ if test "x$has_forbidden_chars" != x; then
+ # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
+ new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ fi
+
+
windows_path="$new_path"
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
unix_path=`$CYGPATH -u "$windows_path"`
@@ -62122,6 +62507,8 @@ $as_echo "$FREETYPE_LIB_PATH" >&6; }
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -62477,6 +62864,8 @@ $as_echo "$as_me: Using FREETYPE_CFLAGS=$FREETYPE_CFLAGS and FREETYPE_LIBS=$FREE
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -62682,6 +63071,8 @@ done
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -62870,6 +63261,8 @@ done
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -62949,6 +63342,8 @@ $as_echo "$LIBFFI_WORKS" >&6; }
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -64058,6 +64453,8 @@ done
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -64142,6 +64539,8 @@ $as_echo "$LIBELF_WORKS" >&6; }
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
diff --git a/common/autoconf/help.m4 b/common/autoconf/help.m4
index 76824e54787..1a313e62236 100644
--- a/common/autoconf/help.m4
+++ b/common/autoconf/help.m4
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2017, 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,7 +25,7 @@
AC_DEFUN_ONCE([HELP_SETUP_DEPENDENCY_HELP],
[
- AC_CHECK_PROGS(PKGHANDLER, apt-get yum port pkgutil pkgadd)
+ AC_CHECK_PROGS(PKGHANDLER, apt-get yum brew port pkgutil pkgadd)
])
AC_DEFUN([HELP_MSG_MISSING_DEPENDENCY],
@@ -46,6 +46,8 @@ AC_DEFUN([HELP_MSG_MISSING_DEPENDENCY],
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
+ brew)
+ brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
@@ -147,6 +149,17 @@ yum_help() {
esac
}
+brew_help() {
+ case $1 in
+ openjdk)
+ PKGHANDLER_COMMAND="brew cask install java" ;;
+ freetype)
+ PKGHANDLER_COMMAND="brew install freetype" ;;
+ ccache)
+ PKGHANDLER_COMMAND="brew install ccache" ;;
+ esac
+}
+
port_help() {
PKGHANDLER_COMMAND=""
}
diff --git a/common/autoconf/jdk-options.m4 b/common/autoconf/jdk-options.m4
index 7b6b1f5fae2..2c21000845b 100644
--- a/common/autoconf/jdk-options.m4
+++ b/common/autoconf/jdk-options.m4
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2017, 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
@@ -382,18 +382,18 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_JLINK_OPTIONS],
AC_ARG_ENABLE([keep-packaged-modules], [AS_HELP_STRING([--disable-keep-packaged-modules],
[Do not keep packaged modules in jdk image @<:@enable@:>@])])
+ AC_MSG_CHECKING([if packaged modules are kept])
if test "x$enable_keep_packaged_modules" = "xyes"; then
- AC_MSG_CHECKING([if packaged modules are kept])
AC_MSG_RESULT([yes])
JLINK_KEEP_PACKAGED_MODULES=true
elif test "x$enable_keep_packaged_modules" = "xno"; then
- AC_MSG_CHECKING([if packaged modules are kept])
AC_MSG_RESULT([no])
JLINK_KEEP_PACKAGED_MODULES=false
elif test "x$enable_keep_packaged_modules" = "x"; then
AC_MSG_RESULT([yes (default)])
JLINK_KEEP_PACKAGED_MODULES=true
else
+ AC_MSG_RESULT([error])
AC_MSG_ERROR([--enable-keep-packaged-modules accepts no argument])
fi
diff --git a/common/autoconf/lib-freetype.m4 b/common/autoconf/lib-freetype.m4
index 99d84a28a7d..e7790caa64b 100644
--- a/common/autoconf/lib-freetype.m4
+++ b/common/autoconf/lib-freetype.m4
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2017, 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
@@ -348,6 +348,10 @@ AC_DEFUN_ONCE([LIB_SETUP_FREETYPE],
FREETYPE_BASE_DIR="$SYSROOT/usr/X11"
LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib], [well-known location])
fi
+ if test "x$FOUND_FREETYPE" != xyes; then
+ FREETYPE_BASE_DIR="$SYSROOT/usr/local"
+ LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib], [well-known location])
+ fi
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
if test "x$FOUND_FREETYPE" != xyes; then
diff --git a/common/autoconf/spec.gmk.in b/common/autoconf/spec.gmk.in
index a15b9f462fe..471f9096e01 100644
--- a/common/autoconf/spec.gmk.in
+++ b/common/autoconf/spec.gmk.in
@@ -274,8 +274,6 @@ JAVADOC_OUTPUTDIR = $(DOCS_IMAGE_DIR)
CONFIGURESUPPORT_OUTPUTDIR:=@CONFIGURESUPPORT_OUTPUTDIR@
BUILDJDK_OUTPUTDIR=$(BUILD_OUTPUT)/buildjdk
-BUILD_HOTSPOT=@BUILD_HOTSPOT@
-
BUILD_FAILURE_HANDLER := @BUILD_FAILURE_HANDLER@
ENABLE_GENERATE_CLASSLIST := @ENABLE_GENERATE_CLASSLIST@
@@ -642,7 +640,6 @@ NAWK:=@NAWK@
NICE:=@NICE@
PATCH:=@PATCH@
PRINTF:=@PRINTF@
-PWD:=@THEPWDCMD@
RM:=@RM@
RMDIR:=@RMDIR@
SED:=@SED@
@@ -778,11 +775,18 @@ OS_VERSION_MICRO:=@OS_VERSION_MICRO@
# Images directory definitions
JDK_IMAGE_SUBDIR:=jdk
JRE_IMAGE_SUBDIR:=jre
+JRE_COMPACT1_IMAGE_SUBDIR := jre-compact1
+JRE_COMPACT2_IMAGE_SUBDIR := jre-compact2
+JRE_COMPACT3_IMAGE_SUBDIR := jre-compact3
# Colon left out to be able to override output dir for bootcycle-images
JDK_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(JDK_IMAGE_SUBDIR)
JRE_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(JRE_IMAGE_SUBDIR)
+JRE_COMPACT1_IMAGE_DIR := $(IMAGES_OUTPUTDIR)/$(JRE_COMPACT1_IMAGE_SUBDIR)
+JRE_COMPACT2_IMAGE_DIR := $(IMAGES_OUTPUTDIR)/$(JRE_COMPACT2_IMAGE_SUBDIR)
+JRE_COMPACT3_IMAGE_DIR := $(IMAGES_OUTPUTDIR)/$(JRE_COMPACT3_IMAGE_SUBDIR)
+
# Test image, as above
TEST_IMAGE_SUBDIR:=test
TEST_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(TEST_IMAGE_SUBDIR)
@@ -818,6 +822,12 @@ else ifneq ($(DEBUG_LEVEL), release)
endif
JDK_BUNDLE_NAME := jdk-$(BASE_NAME)_bin$(DEBUG_PART).tar.gz
JRE_BUNDLE_NAME := jre-$(BASE_NAME)_bin$(DEBUG_PART).tar.gz
+JRE_COMPACT1_BUNDLE_NAME := \
+ jre-$(VERSION_SHORT)+$(VERSION_BUILD)-compact1_$(OPENJDK_TARGET_BUNDLE_PLATFORM)_bin$(DEBUG_PART).tar.gz
+JRE_COMPACT2_BUNDLE_NAME := \
+ jre-$(VERSION_SHORT)+$(VERSION_BUILD)-compact2_$(OPENJDK_TARGET_BUNDLE_PLATFORM)_bin$(DEBUG_PART).tar.gz
+JRE_COMPACT3_BUNDLE_NAME := \
+ jre-$(VERSION_SHORT)+$(VERSION_BUILD)-compact3_$(OPENJDK_TARGET_BUNDLE_PLATFORM)_bin$(DEBUG_PART).tar.gz
JDK_SYMBOLS_BUNDLE_NAME := jdk-$(BASE_NAME)_bin$(DEBUG_PART)-symbols.tar.gz
JRE_SYMBOLS_BUNDLE_NAME := jre-$(BASE_NAME)_bin$(DEBUG_PART)-symbols.tar.gz
ifeq ($(OPENJDK_TARGET_OS), windows)
diff --git a/common/conf/jib-profiles.js b/common/conf/jib-profiles.js
index af883b892b5..dcbb3639cd0 100644
--- a/common/conf/jib-profiles.js
+++ b/common/conf/jib-profiles.js
@@ -501,7 +501,7 @@ var getJibProfilesProfiles = function (input, common, data) {
// extra default target.
var openOnlyProfilesExtra = {
"linux-x86-open": {
- default_make_targets: "profiles",
+ default_make_targets: "profiles-bundles",
configure_args: "--with-jvm-variants=client,server"
}
};
@@ -587,6 +587,7 @@ var getJibProfilesProfiles = function (input, common, data) {
],
work_dir: input.get("src.full", "install_path") + "/test",
environment: {
+ "JT_JAVA": common.boot_jdk_home,
"PRODUCT_HOME": input.get(testedProfile + ".jdk", "home_path"),
"TEST_IMAGE_DIR": input.get(testedProfile + ".test", "home_path"),
"TEST_OUTPUT_DIR": input.src_top_dir
@@ -710,10 +711,15 @@ var getJibProfilesProfiles = function (input, common, data) {
local: "bundles/\\(jdk.*bin.tar.gz\\)",
remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
},
- jre: {
- local: "bundles/\\(jre.*[0-9]_linux-x86_bin.tar.gz\\)",
+ jdk_symbols: {
+ local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)",
remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
- },/* The build does not create these
+ },
+ jre: {
+ // This regexp needs to not match the compact* files below
+ local: "bundles/\\(jre.*[+][0-9]\\{1,\\}_linux-x86_bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
jre_compact1: {
local: "bundles/\\(jre.*-compact1_linux-x86_bin.tar.gz\\)",
remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
@@ -725,7 +731,7 @@ var getJibProfilesProfiles = function (input, common, data) {
jre_compact3: {
local: "bundles/\\(jre.*-compact3_linux-x86_bin.tar.gz\\)",
remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
- },*/
+ },
}
},
@@ -864,7 +870,7 @@ var getJibProfilesDependencies = function (input, common) {
jtreg: {
server: "javare",
revision: "4.2",
- build_number: "b04",
+ build_number: "b05",
checksum_file: "MD5_VALUES",
file: "jtreg_bin-4.2.zip",
environment_name: "JT_HOME",
diff --git a/corba/.hgtags b/corba/.hgtags
index 340cac95c4d..49bf178f515 100644
--- a/corba/.hgtags
+++ b/corba/.hgtags
@@ -394,3 +394,5 @@ f95cc86b6ac22ec1ade5d4f825dc7782adeea228 jdk-9+148
00b19338e505690abe93d5995ed74a473d969c2c jdk-9+149
9205e980062a5c4530b51021c6e274025f4ccbdf jdk-9+150
77f827f5bbad3ef795664bc675f72d98d156b9f8 jdk-9+151
+ff8cb43c07c069b1debdee44cb88ca22db1ec757 jdk-9+152
+68a8e8658511093b322a46ed04b2a321e1da2a43 jdk-9+153
diff --git a/hotspot/.hgtags b/hotspot/.hgtags
index c41ae6d0faa..de59ae64925 100644
--- a/hotspot/.hgtags
+++ b/hotspot/.hgtags
@@ -554,3 +554,5 @@ a82cb5350cad96a0b4de496afebe3ded89f27efa jdk-9+146
30e1996bd55da36183434f24ed964adebf9ca71e jdk-9+149
98fe046473c90204cbc9b34c512b9fc10dfb8479 jdk-9+150
2a2ac7d9f52c8cb2b80077e515b5840b947e640c jdk-9+151
+31f1d26c60df7b2e516a4f84160d76ba017d4e09 jdk-9+152
+217ba81b9a4ce8698200370175aa2db86a39f66c jdk-9+153
diff --git a/jaxp/.hgtags b/jaxp/.hgtags
index 0f4ff1ca773..17b1b7612c8 100644
--- a/jaxp/.hgtags
+++ b/jaxp/.hgtags
@@ -394,3 +394,5 @@ c45db75bfe8bc20bb80b4a009ae3f69c9cd2d885 jdk-9+148
5978df8bfa3894f2b3d07b7256f25f78dffb1f9c jdk-9+149
f85154af719f99a3b4d81b67a8b4c18a650d10f9 jdk-9+150
13c6906bfc861d99dc35a19c80b7a99f0b0ac58d jdk-9+151
+7e3da313b1746578da648155e37dd8526e83153d jdk-9+152
+1384504d2cd0e55c5e0becaeaf40ab05cae959d6 jdk-9+153
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/DOM2SAX.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/DOM2SAX.java
index 0ed98009a06..5b2893d4188 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/DOM2SAX.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/DOM2SAX.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -17,20 +17,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/*
- * $Id: DOM2SAX.java,v 1.2.4.1 2005/09/06 11:52:46 pvedula Exp $
- */
-
package com.sun.org.apache.xalan.internal.xsltc.trax;
import com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl;
import com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
-import java.util.Vector;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.xml.sax.ContentHandler;
@@ -58,7 +54,7 @@ public class DOM2SAX implements XMLReader, Locator {
private ContentHandler _sax = null;
private LexicalHandler _lex = null;
private SAXImpl _saxImpl = null;
- private Map _nsPrefixes = new HashMap<>();
+ private Map> _nsPrefixes = new HashMap<>();
public DOM2SAX(Node root) {
_dom = root;
@@ -73,7 +69,7 @@ public class DOM2SAX implements XMLReader, Locator {
{
_sax = handler;
if (handler instanceof LexicalHandler) {
- _lex = (LexicalHandler) handler;
+ _lex = (LexicalHandler)handler;
}
if (handler instanceof SAXImpl) {
@@ -90,25 +86,22 @@ public class DOM2SAX implements XMLReader, Locator {
throws SAXException
{
boolean pushed = true;
- Stack uriStack = _nsPrefixes.get(prefix);
+ Stack uriStack = _nsPrefixes.get(prefix);
if (uriStack != null) {
if (uriStack.isEmpty()) {
_sax.startPrefixMapping(prefix, uri);
uriStack.push(uri);
- }
- else {
- final String lastUri = (String) uriStack.peek();
+ } else {
+ final String lastUri = uriStack.peek();
if (!lastUri.equals(uri)) {
_sax.startPrefixMapping(prefix, uri);
uriStack.push(uri);
- }
- else {
+ } else {
pushed = false;
}
}
- }
- else {
+ } else {
_sax.startPrefixMapping(prefix, uri);
_nsPrefixes.put(prefix, uriStack = new Stack());
uriStack.push(uri);
@@ -123,7 +116,7 @@ public class DOM2SAX implements XMLReader, Locator {
private void endPrefixMapping(String prefix)
throws SAXException
{
- final Stack uriStack = _nsPrefixes.get(prefix);
+ final Stack uriStack = _nsPrefixes.get(prefix);
if (uriStack != null) {
_sax.endPrefixMapping(prefix);
@@ -131,22 +124,6 @@ public class DOM2SAX implements XMLReader, Locator {
}
}
- /**
- * If the DOM was created using a DOM 1.0 API, the local name may be
- * null. If so, get the local name from the qualified name before
- * generating the SAX event.
- */
- private static String getLocalName(Node node) {
- final String localName = node.getLocalName();
-
- if (localName == null) {
- final String qname = node.getNodeName();
- final int col = qname.lastIndexOf(':');
- return (col > 0) ? qname.substring(col + 1) : qname;
- }
- return localName;
- }
-
public void parse(InputSource unused) throws IOException, SAXException {
parse(_dom);
}
@@ -173,8 +150,8 @@ public class DOM2SAX implements XMLReader, Locator {
* declarations.
*/
private void parse(Node node) throws IOException, SAXException {
- Node first = null;
- if (node == null) return;
+ if (node == null)
+ return;
switch (node.getNodeType()) {
case Node.ATTRIBUTE_NODE: // handled by ELEMENT_NODE
@@ -198,7 +175,6 @@ public class DOM2SAX implements XMLReader, Locator {
_sax.characters(cdata.toCharArray(), 0, cdata.length());
}
break;
-
case Node.COMMENT_NODE: // should be handled!!!
if (_lex != null) {
final String value = node.getNodeValue();
@@ -216,10 +192,9 @@ public class DOM2SAX implements XMLReader, Locator {
}
_sax.endDocument();
break;
-
case Node.ELEMENT_NODE:
String prefix;
- Vector pushedPrefixes = new Vector();
+ ArrayList pushedPrefixes = new ArrayList<>();
final AttributesImpl attrs = new AttributesImpl();
final NamedNodeMap map = node.getAttributes();
final int length = map.getLength();
@@ -235,7 +210,7 @@ public class DOM2SAX implements XMLReader, Locator {
final int colon = qnameAttr.lastIndexOf(':');
prefix = (colon > 0) ? qnameAttr.substring(colon + 1) : EMPTYSTRING;
if (startPrefixMapping(prefix, uriAttr)) {
- pushedPrefixes.addElement(prefix);
+ pushedPrefixes.add(prefix);
}
}
}
@@ -248,27 +223,25 @@ public class DOM2SAX implements XMLReader, Locator {
// Ignore NS declarations here
if (!qnameAttr.startsWith(XMLNS_PREFIX)) {
final String uriAttr = attr.getNamespaceURI();
- final String localNameAttr = getLocalName(attr);
// Uri may be implicitly declared
if (uriAttr != null) {
final int colon = qnameAttr.lastIndexOf(':');
if (colon > 0) {
prefix = qnameAttr.substring(0, colon);
- }
- else {
+ } else {
// If no prefix for this attr, we need to create
// one because we cannot use the default ns
prefix = BasisLibrary.generatePrefix();
qnameAttr = prefix + ':' + qnameAttr;
}
if (startPrefixMapping(prefix, uriAttr)) {
- pushedPrefixes.addElement(prefix);
+ pushedPrefixes.add(prefix);
}
}
// Add attribute to list
- attrs.addAttribute(attr.getNamespaceURI(), getLocalName(attr),
+ attrs.addAttribute(attr.getNamespaceURI(), attr.getLocalName(),
qnameAttr, "CDATA", attr.getNodeValue());
}
}
@@ -276,22 +249,21 @@ public class DOM2SAX implements XMLReader, Locator {
// Now process the element itself
final String qname = node.getNodeName();
final String uri = node.getNamespaceURI();
- final String localName = getLocalName(node);
+ final String localName = node.getLocalName();
- // Uri may be implicitly declared
+ // URI may be implicitly declared
if (uri != null) {
final int colon = qname.lastIndexOf(':');
prefix = (colon > 0) ? qname.substring(0, colon) : EMPTYSTRING;
if (startPrefixMapping(prefix, uri)) {
- pushedPrefixes.addElement(prefix);
+ pushedPrefixes.add(prefix);
}
}
// Generate SAX event to start element
if (_saxImpl != null) {
_saxImpl.startElement(uri, localName, qname, attrs, node);
- }
- else {
+ } else {
_sax.startElement(uri, localName, qname, attrs);
}
@@ -308,15 +280,13 @@ public class DOM2SAX implements XMLReader, Locator {
// Generate endPrefixMapping() for all pushed prefixes
final int nPushedPrefixes = pushedPrefixes.size();
for (int i = 0; i < nPushedPrefixes; i++) {
- endPrefixMapping((String) pushedPrefixes.elementAt(i));
+ endPrefixMapping(pushedPrefixes.get(i));
}
break;
-
case Node.PROCESSING_INSTRUCTION_NODE:
_sax.processingInstruction(node.getNodeName(),
node.getNodeValue());
break;
-
case Node.TEXT_NODE:
final String data = node.getNodeValue();
_sax.characters(data.toCharArray(), 0, data.length());
@@ -449,36 +419,4 @@ public class DOM2SAX implements XMLReader, Locator {
public String getSystemId() {
return null;
}
-
- // Debugging
- private String getNodeTypeFromCode(short code) {
- String retval = null;
- switch (code) {
- case Node.ATTRIBUTE_NODE :
- retval = "ATTRIBUTE_NODE"; break;
- case Node.CDATA_SECTION_NODE :
- retval = "CDATA_SECTION_NODE"; break;
- case Node.COMMENT_NODE :
- retval = "COMMENT_NODE"; break;
- case Node.DOCUMENT_FRAGMENT_NODE :
- retval = "DOCUMENT_FRAGMENT_NODE"; break;
- case Node.DOCUMENT_NODE :
- retval = "DOCUMENT_NODE"; break;
- case Node.DOCUMENT_TYPE_NODE :
- retval = "DOCUMENT_TYPE_NODE"; break;
- case Node.ELEMENT_NODE :
- retval = "ELEMENT_NODE"; break;
- case Node.ENTITY_NODE :
- retval = "ENTITY_NODE"; break;
- case Node.ENTITY_REFERENCE_NODE :
- retval = "ENTITY_REFERENCE_NODE"; break;
- case Node.NOTATION_NODE :
- retval = "NOTATION_NODE"; break;
- case Node.PROCESSING_INSTRUCTION_NODE :
- retval = "PROCESSING_INSTRUCTION_NODE"; break;
- case Node.TEXT_NODE:
- retval = "TEXT_NODE"; break;
- }
- return retval;
- }
}
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM.java
index a87f26aa76e..9dd0491b69c 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -17,14 +17,18 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/*
- * $Id: SAX2DTM.java,v 1.2.4.1 2005/09/15 08:15:11 suresh_emailid Exp $
- */
+
package com.sun.org.apache.xml.internal.dtm.ref.sax2dtm;
-
-import com.sun.org.apache.xml.internal.dtm.*;
-import com.sun.org.apache.xml.internal.dtm.ref.*;
+import com.sun.org.apache.xml.internal.dtm.DTM;
+import com.sun.org.apache.xml.internal.dtm.DTMManager;
+import com.sun.org.apache.xml.internal.dtm.DTMWSFilter;
+import com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBaseIterators;
+import com.sun.org.apache.xml.internal.dtm.ref.DTMManagerDefault;
+import com.sun.org.apache.xml.internal.dtm.ref.DTMStringPool;
+import com.sun.org.apache.xml.internal.dtm.ref.DTMTreeWalker;
+import com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource;
+import com.sun.org.apache.xml.internal.dtm.ref.NodeLocator;
import com.sun.org.apache.xml.internal.res.XMLErrorResources;
import com.sun.org.apache.xml.internal.res.XMLMessages;
import com.sun.org.apache.xml.internal.utils.FastStringBuffer;
@@ -36,13 +40,23 @@ import com.sun.org.apache.xml.internal.utils.SystemIDResolver;
import com.sun.org.apache.xml.internal.utils.WrappedRuntimeException;
import com.sun.org.apache.xml.internal.utils.XMLString;
import com.sun.org.apache.xml.internal.utils.XMLStringFactory;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import javax.xml.transform.Source;
import javax.xml.transform.SourceLocator;
-import org.xml.sax.*;
-import org.xml.sax.ext.*;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.ext.DeclHandler;
+import org.xml.sax.ext.LexicalHandler;
/**
* This class implements a DTM that tends to be optimized more for speed than
@@ -82,7 +96,6 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*
* Made protected rather than private so SAX2RTFDTM can access it.
*/
- //private FastStringBuffer m_chars = new FastStringBuffer(13, 13);
protected FastStringBuffer m_chars;
/** This vector holds offset and length data.
@@ -102,8 +115,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
/** Namespace support, only relevent at construction time.
* Made protected rather than private so SAX2RTFDTM can access it.
*/
- transient protected java.util.Vector m_prefixMappings =
- new java.util.Vector();
+ transient protected Vector m_prefixMappings = new Vector<>();
/** Namespace support, only relevent at construction time.
* Made protected rather than private so SAX2RTFDTM can access it.
@@ -164,7 +176,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* Vector of entities. Each record is composed of four Strings:
* publicId, systemID, notationName, and name.
*/
- private Vector m_entities = null;
+ private ArrayList m_entities = null;
/** m_entities public ID offset. */
private static final int ENTITY_FIELD_PUBLICID = 0;
@@ -196,13 +208,15 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*/
protected boolean m_useSourceLocationProperty = false;
- /** Made protected for access by SAX2RTFDTM.
+ /** Made protected for access by SAX2RTFDTM.
*/
protected StringVector m_sourceSystemId;
- /** Made protected for access by SAX2RTFDTM.
+
+ /** Made protected for access by SAX2RTFDTM.
*/
protected IntVector m_sourceLine;
- /** Made protected for access by SAX2RTFDTM.
+
+ /** Made protected for access by SAX2RTFDTM.
*/
protected IntVector m_sourceColumn;
@@ -252,23 +266,19 @@ public class SAX2DTM extends DTMDefaultBaseIterators
boolean usePrevsib,
boolean newNameTable)
{
-
super(mgr, source, dtmIdentity, whiteSpaceFilter,
xstringfactory, doIndexing, blocksize, usePrevsib, newNameTable);
// %OPT% Use smaller sizes for all internal storage units when
// the blocksize is small. This reduces the cost of creating an RTF.
- if (blocksize <= 64)
- {
+ if (blocksize <= 64) {
m_data = new SuballocatedIntVector(blocksize, DEFAULT_NUMBLOCKS_SMALL);
m_dataOrQName = new SuballocatedIntVector(blocksize, DEFAULT_NUMBLOCKS_SMALL);
m_valuesOrPrefixes = new DTMStringPool(16);
m_chars = new FastStringBuffer(7, 10);
m_contextIndexes = new IntStack(4);
m_parents = new IntStack(4);
- }
- else
- {
+ } else {
m_data = new SuballocatedIntVector(blocksize, DEFAULT_NUMBLOCKS);
m_dataOrQName = new SuballocatedIntVector(blocksize, DEFAULT_NUMBLOCKS);
m_valuesOrPrefixes = new DTMStringPool();
@@ -289,7 +299,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
// m_useSourceLocationProperty=com.sun.org.apache.xalan.internal.processor.TransformerFactoryImpl.m_source_location;
m_useSourceLocationProperty = mgr.getSource_location();
m_sourceSystemId = (m_useSourceLocationProperty) ? new StringVector() : null;
- m_sourceLine = (m_useSourceLocationProperty) ? new IntVector() : null;
+ m_sourceLine = (m_useSourceLocationProperty) ? new IntVector() : null;
m_sourceColumn = (m_useSourceLocationProperty) ? new IntVector() : null;
}
@@ -297,8 +307,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* Set whether information about document source location
* should be maintained or not.
*/
- public void setUseSourceLocation(boolean useSourceLocation)
- {
+ public void setUseSourceLocation(boolean useSourceLocation) {
m_useSourceLocationProperty = useSourceLocation;
}
@@ -309,17 +318,14 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*
* @return The data or qualified name, or DTM.NULL.
*/
- protected int _dataOrQName(int identity)
- {
-
+ protected int _dataOrQName(int identity) {
if (identity < m_size)
return m_dataOrQName.elementAt(identity);
// Check to see if the information requested has been processed, and,
// if not, advance the iterator until we the information has been
// processed.
- while (true)
- {
+ while (true) {
boolean isMore = nextNode();
if (!isMore)
@@ -332,8 +338,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
/**
* Ask the CoRoutine parser to doTerminate and clear the reference.
*/
- public void clearCoRoutine()
- {
+ public void clearCoRoutine() {
clearCoRoutine(true);
}
@@ -344,11 +349,8 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param callDoTerminate true of doTerminate should be called on the
* coRoutine parser.
*/
- public void clearCoRoutine(boolean callDoTerminate)
- {
-
- if (null != m_incrementalSAXSource)
- {
+ public void clearCoRoutine(boolean callDoTerminate) {
+ if (null != m_incrementalSAXSource) {
if (callDoTerminate)
m_incrementalSAXSource.deliverMoreNodes(false);
@@ -368,9 +370,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param incrementalSAXSource The parser that we want to recieve events from
* on demand.
*/
- public void setIncrementalSAXSource(IncrementalSAXSource incrementalSAXSource)
- {
-
+ public void setIncrementalSAXSource(IncrementalSAXSource incrementalSAXSource) {
// Establish coroutine link so we can request more data
//
// Note: It's possible that some versions of IncrementalSAXSource may
@@ -406,11 +406,9 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* Note that IncrementalSAXSource_Filter is package private, hence
* it can be statically referenced using instanceof (CR 6537912).
*/
- public ContentHandler getContentHandler()
- {
-
- if (m_incrementalSAXSource.getClass()
- .getName().equals("com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Filter"))
+ public ContentHandler getContentHandler() {
+ if (m_incrementalSAXSource.getClass().getName()
+ .equals("com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Filter"))
return (ContentHandler) m_incrementalSAXSource;
else
return this;
@@ -429,11 +427,9 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* Note that IncrementalSAXSource_Filter is package private, hence
* it can be statically referenced using instanceof (CR 6537912).
*/
- public LexicalHandler getLexicalHandler()
- {
-
- if (m_incrementalSAXSource.getClass()
- .getName().equals("com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Filter"))
+ public LexicalHandler getLexicalHandler() {
+ if (m_incrementalSAXSource.getClass().getName()
+ .equals("com.sun.org.apache.xml.internal.dtm.ref.IncrementalSAXSource_Filter"))
return (LexicalHandler) m_incrementalSAXSource;
else
return this;
@@ -444,8 +440,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*
* @return null if this model doesn't respond to SAX entity ref events.
*/
- public EntityResolver getEntityResolver()
- {
+ public EntityResolver getEntityResolver() {
return this;
}
@@ -454,8 +449,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*
* @return null if this model doesn't respond to SAX dtd events.
*/
- public DTDHandler getDTDHandler()
- {
+ public DTDHandler getDTDHandler() {
return this;
}
@@ -464,8 +458,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*
* @return null if this model doesn't respond to SAX error events.
*/
- public ErrorHandler getErrorHandler()
- {
+ public ErrorHandler getErrorHandler() {
return this;
}
@@ -474,8 +467,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*
* @return null if this model doesn't respond to SAX Decl events.
*/
- public DeclHandler getDeclHandler()
- {
+ public DeclHandler getDeclHandler() {
return this;
}
@@ -485,8 +477,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* transformation and the parse run simultaneously. Guidance to the
* DTMManager.
*/
- public boolean needsTwoThreads()
- {
+ public boolean needsTwoThreads() {
return null != m_incrementalSAXSource;
}
@@ -509,9 +500,8 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*/
public void dispatchCharactersEvents(int nodeHandle, ContentHandler ch,
boolean normalize)
- throws SAXException
+ throws SAXException
{
-
int identity = makeNodeIdentity(nodeHandle);
if (identity == DTM.NULL)
@@ -519,8 +509,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
int type = _type(identity);
- if (isTextType(type))
- {
+ if (isTextType(type)) {
int dataIndex = m_dataOrQName.elementAt(identity);
int offset = m_data.elementAt(dataIndex);
int length = m_data.elementAt(dataIndex + 1);
@@ -529,13 +518,10 @@ public class SAX2DTM extends DTMDefaultBaseIterators
m_chars.sendNormalizedSAXcharacters(ch, offset, length);
else
m_chars.sendSAXcharacters(ch, offset, length);
- }
- else
- {
+ } else {
int firstChild = _firstch(identity);
- if (DTM.NULL != firstChild)
- {
+ if (DTM.NULL != firstChild) {
int offset = -1;
int length = 0;
int startNode = identity;
@@ -545,12 +531,10 @@ public class SAX2DTM extends DTMDefaultBaseIterators
do {
type = _type(identity);
- if (isTextType(type))
- {
+ if (isTextType(type)) {
int dataIndex = _dataOrQName(identity);
- if (-1 == offset)
- {
+ if (-1 == offset) {
offset = m_data.elementAt(dataIndex);
}
@@ -560,36 +544,31 @@ public class SAX2DTM extends DTMDefaultBaseIterators
identity = getNextNodeIdentity(identity);
} while (DTM.NULL != identity && (_parent(identity) >= startNode));
- if (length > 0)
- {
+ if (length > 0) {
if(normalize)
m_chars.sendNormalizedSAXcharacters(ch, offset, length);
else
m_chars.sendSAXcharacters(ch, offset, length);
}
- }
- else if(type != DTM.ELEMENT_NODE)
- {
+ } else if(type != DTM.ELEMENT_NODE) {
int dataIndex = _dataOrQName(identity);
- if (dataIndex < 0)
- {
+ if (dataIndex < 0) {
dataIndex = -dataIndex;
dataIndex = m_data.elementAt(dataIndex + 1);
}
String str = m_valuesOrPrefixes.indexToString(dataIndex);
- if(normalize)
- FastStringBuffer.sendNormalizedSAXcharacters(str.toCharArray(),
- 0, str.length(), ch);
- else
- ch.characters(str.toCharArray(), 0, str.length());
+ if(normalize)
+ FastStringBuffer.sendNormalizedSAXcharacters(str.toCharArray(),
+ 0, str.length(), ch);
+ else
+ ch.characters(str.toCharArray(), 0, str.length());
}
}
}
-
/**
* Given a node handle, return its DOM-style node name. This will
* include names such as #text or #document.
@@ -599,39 +578,29 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* %REVIEW% Document when empty string is possible...
* %REVIEW-COMMENT% It should never be empty, should it?
*/
- public String getNodeName(int nodeHandle)
- {
-
+ public String getNodeName(int nodeHandle) {
int expandedTypeID = getExpandedTypeID(nodeHandle);
// If just testing nonzero, no need to shift...
int namespaceID = m_expandedNameTable.getNamespaceID(expandedTypeID);
- if (0 == namespaceID)
- {
+ if (0 == namespaceID) {
// Don't retrieve name until/unless needed
// String name = m_expandedNameTable.getLocalName(expandedTypeID);
int type = getNodeType(nodeHandle);
- if (type == DTM.NAMESPACE_NODE)
- {
+ if (type == DTM.NAMESPACE_NODE) {
if (null == m_expandedNameTable.getLocalName(expandedTypeID))
return "xmlns";
else
return "xmlns:" + m_expandedNameTable.getLocalName(expandedTypeID);
- }
- else if (0 == m_expandedNameTable.getLocalNameID(expandedTypeID))
- {
+ } else if (0 == m_expandedNameTable.getLocalNameID(expandedTypeID)) {
return m_fixednames[type];
- }
- else
+ } else
return m_expandedNameTable.getLocalName(expandedTypeID);
- }
- else
- {
+ } else {
int qnameIndex = m_dataOrQName.elementAt(makeNodeIdentity(nodeHandle));
- if (qnameIndex < 0)
- {
+ if (qnameIndex < 0) {
qnameIndex = -qnameIndex;
qnameIndex = m_data.elementAt(qnameIndex);
}
@@ -648,27 +617,21 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param nodeHandle the id of the node.
* @return String Name of this node, which may be an empty string.
*/
- public String getNodeNameX(int nodeHandle)
- {
-
+ public String getNodeNameX(int nodeHandle) {
int expandedTypeID = getExpandedTypeID(nodeHandle);
int namespaceID = m_expandedNameTable.getNamespaceID(expandedTypeID);
- if (0 == namespaceID)
- {
+ if (namespaceID == 0) {
String name = m_expandedNameTable.getLocalName(expandedTypeID);
if (name == null)
return "";
else
return name;
- }
- else
- {
+ } else {
int qnameIndex = m_dataOrQName.elementAt(makeNodeIdentity(nodeHandle));
- if (qnameIndex < 0)
- {
+ if (qnameIndex < 0) {
qnameIndex = -qnameIndex;
qnameIndex = m_data.elementAt(qnameIndex);
}
@@ -686,11 +649,9 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @return true if the attribute was specified;
* false if it was defaulted.
*/
- public boolean isAttributeSpecified(int attributeHandle)
- {
-
+ public boolean isAttributeSpecified(int attributeHandle) {
// I'm not sure if I want to do anything with this...
- return true; // ??
+ return true; // ??
}
/**
@@ -701,9 +662,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*
* @return the system identifier String object, or null if there is none.
*/
- public String getDocumentTypeDeclarationSystemIdentifier()
- {
-
+ public String getDocumentTypeDeclarationSystemIdentifier() {
/** @todo: implement this com.sun.org.apache.xml.internal.dtm.DTMDefaultBase abstract method */
error(XMLMessages.createXMLMessage(XMLErrorResources.ER_METHOD_NOT_SUPPORTED, null));//"Not yet supported!");
@@ -717,14 +676,11 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param identity The node identity (index).
* @return identity+1, or DTM.NULL.
*/
- protected int getNextNodeIdentity(int identity)
- {
-
+ protected int getNextNodeIdentity(int identity) {
identity += 1;
- while (identity >= m_size)
- {
- if (null == m_incrementalSAXSource)
+ while (identity >= m_size) {
+ if (m_incrementalSAXSource == null)
return DTM.NULL;
nextNode();
@@ -739,10 +695,10 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param nodeHandle The node ID.
* @param ch A non-null reference to a ContentHandler.
*
- * @throws org.xml.sax.SAXException
+ * @throws SAXException
*/
- public void dispatchToEvents(int nodeHandle, org.xml.sax.ContentHandler ch)
- throws org.xml.sax.SAXException
+ public void dispatchToEvents(int nodeHandle, ContentHandler ch)
+ throws SAXException
{
DTMTreeWalker treeWalker = m_walker;
@@ -1087,28 +1043,22 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @return String containing the URI of the Unparsed Entity, or an
* empty string if no such entity exists.
*/
- public String getUnparsedEntityURI(String name)
- {
-
+ public String getUnparsedEntityURI(String name) {
String url = "";
- if (null == m_entities)
+ if (null == m_entities) {
return url;
+ }
int n = m_entities.size();
- for (int i = 0; i < n; i += ENTITY_FIELDS_PER)
- {
- String ename = (String) m_entities.elementAt(i + ENTITY_FIELD_NAME);
+ for (int i = 0; i < n; i += ENTITY_FIELDS_PER) {
+ String ename = m_entities.get(i + ENTITY_FIELD_NAME);
- if (null != ename && ename.equals(name))
- {
- String nname = (String) m_entities.elementAt(i
- + ENTITY_FIELD_NOTATIONNAME);
-
- if (null != nname)
- {
+ if (null != ename && ename.equals(name)) {
+ String nname = m_entities.get(i + ENTITY_FIELD_NOTATIONNAME);
+ if (null != nname) {
// The draft says: "The XSLT processor may use the public
// identifier to generate a URI for the entity instead of the URI
// specified in the system identifier. If the XSLT processor does
@@ -1118,11 +1068,10 @@ public class SAX2DTM extends DTMDefaultBaseIterators
// the resource containing the entity declaration as the base
// URI [RFC2396]."
// So I'm falling a bit short here.
- url = (String) m_entities.elementAt(i + ENTITY_FIELD_SYSTEMID);
+ url = m_entities.get(i + ENTITY_FIELD_SYSTEMID);
- if (null == url)
- {
- url = (String) m_entities.elementAt(i + ENTITY_FIELD_PUBLICID);
+ if (null == url) {
+ url = m_entities.get(i + ENTITY_FIELD_PUBLICID);
}
}
@@ -1400,26 +1349,18 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*
* @return The prefix if there is one, or null.
*/
- public String getPrefix(String qname, String uri)
- {
-
+ public String getPrefix(String qname, String uri) {
String prefix;
int uriIndex = -1;
- if (null != uri && uri.length() > 0)
- {
-
- do
- {
+ if (null != uri && uri.length() > 0) {
+ do {
uriIndex = m_prefixMappings.indexOf(uri, ++uriIndex);
- } while ( (uriIndex & 0x01) == 0);
+ } while ((uriIndex & 0x01) == 0);
- if (uriIndex >= 0)
- {
- prefix = (String) m_prefixMappings.elementAt(uriIndex - 1);
- }
- else if (null != qname)
- {
+ if (uriIndex >= 0) {
+ prefix = m_prefixMappings.elementAt(uriIndex - 1);
+ } else if (null != qname) {
int indexOfNSSep = qname.indexOf(':');
if (qname.equals("xmlns"))
@@ -1429,33 +1370,24 @@ public class SAX2DTM extends DTMDefaultBaseIterators
else
prefix = (indexOfNSSep > 0)
? qname.substring(0, indexOfNSSep) : null;
- }
- else
- {
+ } else {
prefix = null;
}
- }
- else if (null != qname)
- {
+ } else if (null != qname) {
int indexOfNSSep = qname.indexOf(':');
- if (indexOfNSSep > 0)
- {
+ if (indexOfNSSep > 0) {
if (qname.startsWith("xmlns:"))
prefix = qname.substring(indexOfNSSep + 1);
else
prefix = qname.substring(0, indexOfNSSep);
- }
- else
- {
+ } else {
if (qname.equals("xmlns"))
prefix = "";
else
prefix = null;
}
- }
- else
- {
+ } else {
prefix = null;
}
@@ -1470,38 +1402,31 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*
* @return The prefix if there is one, or null.
*/
- public int getIdForNamespace(String uri)
- {
-
+ public int getIdForNamespace(String uri) {
return m_valuesOrPrefixes.stringToIndex(uri);
-
}
- /**
+ /**
* Get a prefix either from the qname or from the uri mapping, or just make
* one up!
*
* @return The prefix if there is one, or null.
*/
- public String getNamespaceURI(String prefix)
- {
-
+ public String getNamespaceURI(String prefix) {
String uri = "";
int prefixIndex = m_contextIndexes.peek() - 1 ;
- if(null == prefix)
+ if (null == prefix) {
prefix = "";
+ }
- do
- {
- prefixIndex = m_prefixMappings.indexOf(prefix, ++prefixIndex);
- } while ( (prefixIndex >= 0) && (prefixIndex & 0x01) == 0x01);
-
- if (prefixIndex > -1)
- {
- uri = (String) m_prefixMappings.elementAt(prefixIndex + 1);
- }
+ do {
+ prefixIndex = m_prefixMappings.indexOf(prefix, ++prefixIndex);
+ } while ((prefixIndex >= 0) && (prefixIndex & 0x01) == 0x01);
+ if (prefixIndex > -1) {
+ uri = m_prefixMappings.elementAt(prefixIndex + 1);
+ }
return uri;
}
@@ -1578,7 +1503,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* default behaviour.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.EntityResolver#resolveEntity
+ * @see EntityResolver#resolveEntity
*
* @throws SAXException
*/
@@ -1605,7 +1530,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param systemId The notation system identifier.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.DTDHandler#notationDecl
+ * @see DTDHandler#notationDecl
*
* @throws SAXException
*/
@@ -1630,41 +1555,35 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param notationName The name of the associated notation.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.DTDHandler#unparsedEntityDecl
+ * @see DTDHandler#unparsedEntityDecl
*
* @throws SAXException
*/
- public void unparsedEntityDecl(
- String name, String publicId, String systemId, String notationName)
- throws SAXException
+ public void unparsedEntityDecl(String name, String publicId, String systemId,
+ String notationName) throws SAXException
{
-
- if (null == m_entities)
- {
- m_entities = new Vector();
+ if (null == m_entities) {
+ m_entities = new ArrayList<>();
}
- try
- {
+ try {
systemId = SystemIDResolver.getAbsoluteURI(systemId,
getDocumentBaseURI());
- }
- catch (Exception e)
- {
- throw new org.xml.sax.SAXException(e);
+ } catch (Exception e) {
+ throw new SAXException(e);
}
// private static final int ENTITY_FIELD_PUBLICID = 0;
- m_entities.addElement(publicId);
+ m_entities.add(publicId);
// private static final int ENTITY_FIELD_SYSTEMID = 1;
- m_entities.addElement(systemId);
+ m_entities.add(systemId);
// private static final int ENTITY_FIELD_NOTATIONNAME = 2;
- m_entities.addElement(notationName);
+ m_entities.add(notationName);
// private static final int ENTITY_FIELD_NAME = 3;
- m_entities.addElement(name);
+ m_entities.add(name);
}
////////////////////////////////////////////////////////////////////
@@ -1679,8 +1598,8 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* with other document events.
*
* @param locator A locator for all SAX document events.
- * @see org.xml.sax.ContentHandler#setDocumentLocator
- * @see org.xml.sax.Locator
+ * @see ContentHandler#setDocumentLocator
+ * @see Locator
*/
public void setDocumentLocator(Locator locator)
{
@@ -1693,7 +1612,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#startDocument
+ * @see ContentHandler#startDocument
*/
public void startDocument() throws SAXException
{
@@ -1716,7 +1635,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
*
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#endDocument
+ * @see ContentHandler#endDocument
*/
public void endDocument() throws SAXException
{
@@ -1754,7 +1673,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param uri The Namespace URI mapped to the prefix.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#startPrefixMapping
+ * @see ContentHandler#startPrefixMapping
*/
public void startPrefixMapping(String prefix, String uri)
throws SAXException
@@ -1780,7 +1699,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param prefix The Namespace prefix being declared.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#endPrefixMapping
+ * @see ContentHandler#endPrefixMapping
*/
public void endPrefixMapping(String prefix) throws SAXException
{
@@ -1815,16 +1734,13 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @return true if the declaration has already been declared in the
* current context.
*/
- protected boolean declAlreadyDeclared(String prefix)
- {
-
+ protected boolean declAlreadyDeclared(String prefix) {
int startDecls = m_contextIndexes.peek();
- java.util.Vector prefixMappings = m_prefixMappings;
+ Vector prefixMappings = m_prefixMappings;
int nDecls = prefixMappings.size();
- for (int i = startDecls; i < nDecls; i += 2)
- {
- String prefixDecl = (String) prefixMappings.elementAt(i);
+ for (int i = startDecls; i < nDecls; i += 2) {
+ String prefixDecl = prefixMappings.elementAt(i);
if (prefixDecl == null)
continue;
@@ -1836,7 +1752,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
return false;
}
- boolean m_pastFirstElement=false;
+ boolean m_pastFirstElement=false;
/**
* Receive notification of the start of an element.
@@ -1857,35 +1773,38 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param attributes The specified or defaulted attributes.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#startElement
+ * @see ContentHandler#startElement
*/
- public void startElement(
- String uri, String localName, String qName, Attributes attributes)
- throws SAXException
+ public void startElement(String uri, String localName, String qName,
+ Attributes attributes) throws SAXException
{
- if (DEBUG)
- {
- System.out.println("startElement: uri: " + uri + ", localname: "
- + localName + ", qname: "+qName+", atts: " + attributes);
+ if (DEBUG) {
+ System.out.println("startElement: uri: " + uri +
+ ", localname: " + localName +
+ ", qname: "+qName+", atts: " + attributes);
- boolean DEBUG_ATTRS=true;
- if(DEBUG_ATTRS & attributes!=null)
- {
- int n = attributes.getLength();
- if(n==0)
- System.out.println("\tempty attribute list");
- else for (int i = 0; i < n; i++)
- System.out.println("\t attr: uri: " + attributes.getURI(i) +
- ", localname: " + attributes.getLocalName(i) +
- ", qname: " + attributes.getQName(i) +
- ", type: " + attributes.getType(i) +
- ", value: " + attributes.getValue(i)
- );
- }
- }
+ boolean DEBUG_ATTRS=true;
+ if (DEBUG_ATTRS & attributes!=null) {
+ int n = attributes.getLength();
+ if (n==0) {
+ System.out.println("\tempty attribute list");
+ } else for (int i = 0; i < n; i++) {
+ System.out.println("\t attr: uri: " + attributes.getURI(i) +
+ ", localname: " + attributes.getLocalName(i) +
+ ", qname: " + attributes.getQName(i) +
+ ", type: " + attributes.getType(i) +
+ ", value: " + attributes.getValue(i));
+ }
+ }
+ }
charactersFlush();
+ if ((localName == null || localName.isEmpty()) &&
+ (uri == null || uri.isEmpty())) {
+ localName = qName;
+ }
+
int exName = m_expandedNameTable.getExpandedTypeID(uri, localName, DTM.ELEMENT_NODE);
String prefix = getPrefix(qName, uri);
int prefixIndex = (null != prefix)
@@ -1894,20 +1813,18 @@ public class SAX2DTM extends DTMDefaultBaseIterators
int elemNode = addNode(DTM.ELEMENT_NODE, exName,
m_parents.peek(), m_previous, prefixIndex, true);
- if(m_indexing)
+ if (m_indexing)
indexNode(exName, elemNode);
-
m_parents.push(elemNode);
int startDecls = m_contextIndexes.peek();
int nDecls = m_prefixMappings.size();
int prev = DTM.NULL;
- if(!m_pastFirstElement)
- {
+ if (!m_pastFirstElement) {
// SPECIAL CASE: Implied declaration at root element
- prefix="xml";
+ prefix = "xml";
String declURL = "http://www.w3.org/XML/1998/namespace";
exName = m_expandedNameTable.getExpandedTypeID(null, prefix, DTM.NAMESPACE_NODE);
int val = m_valuesOrPrefixes.stringToIndex(declURL);
@@ -1916,14 +1833,13 @@ public class SAX2DTM extends DTMDefaultBaseIterators
m_pastFirstElement=true;
}
- for (int i = startDecls; i < nDecls; i += 2)
- {
- prefix = (String) m_prefixMappings.elementAt(i);
+ for (int i = startDecls; i < nDecls; i += 2) {
+ prefix = m_prefixMappings.elementAt(i);
if (prefix == null)
continue;
- String declURL = (String) m_prefixMappings.elementAt(i + 1);
+ String declURL = m_prefixMappings.elementAt(i + 1);
exName = m_expandedNameTable.getExpandedTypeID(null, prefix, DTM.NAMESPACE_NODE);
@@ -1935,8 +1851,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
int n = attributes.getLength();
- for (int i = 0; i < n; i++)
- {
+ for (int i = 0; i < n; i++) {
String attrUri = attributes.getURI(i);
String attrQName = attributes.getQName(i);
String valString = attributes.getValue(i);
@@ -1947,17 +1862,13 @@ public class SAX2DTM extends DTMDefaultBaseIterators
String attrLocalName = attributes.getLocalName(i);
- if ((null != attrQName)
- && (attrQName.equals("xmlns")
- || attrQName.startsWith("xmlns:")))
- {
+ if ((null != attrQName) &&
+ (attrQName.equals("xmlns") || attrQName.startsWith("xmlns:"))) {
if (declAlreadyDeclared(prefix))
continue; // go to the next attribute.
nodeType = DTM.NAMESPACE_NODE;
- }
- else
- {
+ } else {
nodeType = DTM.ATTRIBUTE_NODE;
if (attributes.getType(i).equalsIgnoreCase("ID"))
@@ -1966,15 +1877,13 @@ public class SAX2DTM extends DTMDefaultBaseIterators
// Bit of a hack... if somehow valString is null, stringToIndex will
// return -1, which will make things very unhappy.
- if(null == valString)
+ if (null == valString)
valString = "";
int val = m_valuesOrPrefixes.stringToIndex(valString);
//String attrLocalName = attributes.getLocalName(i);
- if (null != prefix)
- {
-
+ if (null != prefix) {
prefixIndex = m_valuesOrPrefixes.stringToIndex(attrQName);
int dataIndex = m_data.size();
@@ -1993,8 +1902,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
if (DTM.NULL != prev)
m_nextsib.setElementAt(DTM.NULL,prev);
- if (null != m_wsfilter)
- {
+ if (null != m_wsfilter) {
short wsv = m_wsfilter.getShouldStripSpace(makeNodeHandle(elemNode), this);
boolean shouldStrip = (DTMWSFilter.INHERIT == wsv)
? getShouldStripWhitespace()
@@ -2026,7 +1934,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* empty string if qualified names are not available.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#endElement
+ * @see ContentHandler#endElement
*/
public void endElement(String uri, String localName, String qName)
throws SAXException
@@ -2074,7 +1982,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* character array.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#characters
+ * @see ContentHandler#characters
*/
public void characters(char ch[], int start, int length) throws SAXException
{
@@ -2109,7 +2017,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* character array.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#ignorableWhitespace
+ * @see ContentHandler#ignorableWhitespace
*/
public void ignorableWhitespace(char ch[], int start, int length)
throws SAXException
@@ -2133,7 +2041,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* none is supplied.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#processingInstruction
+ * @see ContentHandler#processingInstruction
*/
public void processingInstruction(String target, String data)
throws SAXException
@@ -2163,7 +2071,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param name The name of the skipped entity.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#processingInstruction
+ * @see ContentHandler#processingInstruction
*/
public void skippedEntity(String name) throws SAXException
{
@@ -2187,8 +2095,8 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param e The warning information encoded as an exception.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ErrorHandler#warning
- * @see org.xml.sax.SAXParseException
+ * @see ErrorHandler#warning
+ * @see SAXParseException
*/
public void warning(SAXParseException e) throws SAXException
{
@@ -2208,8 +2116,8 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param e The warning information encoded as an exception.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ErrorHandler#warning
- * @see org.xml.sax.SAXParseException
+ * @see ErrorHandler#warning
+ * @see SAXParseException
*/
public void error(SAXParseException e) throws SAXException
{
@@ -2230,8 +2138,8 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param e The error information encoded as an exception.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ErrorHandler#fatalError
- * @see org.xml.sax.SAXParseException
+ * @see ErrorHandler#fatalError
+ * @see SAXParseException
*/
public void fatalError(SAXParseException e) throws SAXException
{
@@ -2299,7 +2207,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param value The replacement text of the entity.
* @throws SAXException The application may raise an exception.
* @see #externalEntityDecl
- * @see org.xml.sax.DTDHandler#unparsedEntityDecl
+ * @see DTDHandler#unparsedEntityDecl
*/
public void internalEntityDecl(String name, String value)
throws SAXException
@@ -2321,7 +2229,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* @param systemId The declared system identifier of the entity.
* @throws SAXException The application may raise an exception.
* @see #internalEntityDecl
- * @see org.xml.sax.DTDHandler#unparsedEntityDecl
+ * @see DTDHandler#unparsedEntityDecl
*/
public void externalEntityDecl(
String name, String publicId, String systemId) throws SAXException
@@ -2386,15 +2294,15 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* properly nested within start/end entity events.
*
*
Note that skipped entities will be reported through the
- * {@link org.xml.sax.ContentHandler#skippedEntity skippedEntity}
+ * {@link ContentHandler#skippedEntity skippedEntity}
* event, which is part of the ContentHandler interface.
*
* @param name The name of the entity. If it is a parameter
* entity, the name will begin with '%'.
* @throws SAXException The application may raise an exception.
* @see #endEntity
- * @see org.xml.sax.ext.DeclHandler#internalEntityDecl
- * @see org.xml.sax.ext.DeclHandler#externalEntityDecl
+ * @see DeclHandler#internalEntityDecl
+ * @see DeclHandler#externalEntityDecl
*/
public void startEntity(String name) throws SAXException
{
@@ -2419,7 +2327,7 @@ public class SAX2DTM extends DTMDefaultBaseIterators
* Report the start of a CDATA section.
*
*
The contents of the CDATA section will be reported through
- * the regular {@link org.xml.sax.ContentHandler#characters
+ * the regular {@link ContentHandler#characters
* characters} event.
*
* @throws SAXException The application may raise an exception.
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java
index 526f5e1b5f0..be63de6b4df 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 1999-2005 The Apache Software Foundation.
- *
- * Licensed 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
+ * 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
*
@@ -17,13 +17,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/*
- * $Id: SAX2DTM2.java,v 1.2.4.1 2005/09/15 08:15:12 suresh_emailid Exp $
- */
+
package com.sun.org.apache.xml.internal.dtm.ref.sax2dtm;
-import com.sun.org.apache.xml.internal.dtm.*;
-import com.sun.org.apache.xml.internal.dtm.ref.*;
+import com.sun.org.apache.xml.internal.dtm.DTM;
+import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
+import com.sun.org.apache.xml.internal.dtm.DTMException;
+import com.sun.org.apache.xml.internal.dtm.DTMManager;
+import com.sun.org.apache.xml.internal.dtm.DTMWSFilter;
+import com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase;
+import com.sun.org.apache.xml.internal.dtm.ref.ExpandedNameTable;
+import com.sun.org.apache.xml.internal.dtm.ref.ExtendedType;
import com.sun.org.apache.xml.internal.utils.FastStringBuffer;
import com.sun.org.apache.xml.internal.utils.XMLString;
import com.sun.org.apache.xml.internal.utils.XMLStringDefault;
@@ -31,11 +35,12 @@ import com.sun.org.apache.xml.internal.utils.XMLStringFactory;
import com.sun.org.apache.xml.internal.res.XMLMessages;
import com.sun.org.apache.xml.internal.res.XMLErrorResources;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
-
-import javax.xml.transform.Source;
-import java.util.Vector;
import com.sun.org.apache.xml.internal.utils.SuballocatedIntVector;
-import org.xml.sax.*;
+import java.util.ArrayList;
+import javax.xml.transform.Source;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
/**
* SAX2DTM2 is an optimized version of SAX2DTM which is used in non-incremental situation.
@@ -53,10 +58,6 @@ import org.xml.sax.*;
* The design of SAX2DTM2 may limit its extensibilty. If you have a reason to extend the
* SAX2DTM model, please extend from SAX2DTM instead of this class.
*
- * TODO: This class is currently only used by XSLTC. We need to investigate the possibility
- * of also using it in Xalan-J Interpretive. Xalan's performance is likely to get an instant
- * boost if we use SAX2DTM2 instead of SAX2DTM in non-incremental case.
- *
* %MK% The code in this class is critical to the XSLTC_DTM performance. Be very careful
* when making changes here!
*/
@@ -87,11 +88,10 @@ public class SAX2DTM2 extends SAX2DTM
*/
public DTMAxisIterator setStartNode(int node)
{
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
_currentNode = (node == DTM.NULL) ? DTM.NULL
: _firstch2(makeNodeIdentity(node));
@@ -108,8 +108,7 @@ public class SAX2DTM2 extends SAX2DTM
* @return The next node handle in the iteration, or END if no more
* are available.
*/
- public int next()
- {
+ public int next() {
if (_currentNode != NULL) {
int node = _currentNode;
_currentNode = _nextsib2(node);
@@ -139,13 +138,11 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ public DTMAxisIterator setStartNode(int node) {
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
if (node != DTM.NULL)
@@ -229,8 +226,7 @@ public class SAX2DTM2 extends SAX2DTM
*
* @param nodeType The extended type ID being requested.
*/
- public TypedChildrenIterator(int nodeType)
- {
+ public TypedChildrenIterator(int nodeType) {
_nodeType = nodeType;
}
@@ -242,17 +238,14 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ public DTMAxisIterator setStartNode(int node) {
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
- _currentNode = (node == DTM.NULL)
- ? DTM.NULL
- : _firstch2(makeNodeIdentity(_startNode));
+ _currentNode = (node == DTM.NULL) ? DTM.NULL :
+ _firstch2(makeNodeIdentity(_startNode));
return resetPosition();
}
@@ -265,8 +258,7 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
+ public int next() {
int node = _currentNode;
if (node == DTM.NULL)
return DTM.NULL;
@@ -301,14 +293,12 @@ public class SAX2DTM2 extends SAX2DTM
_currentNode = _nextsib2(node);
return returnNode(makeNodeHandle(node));
}
-
}
/**
* Return the node at the given position.
*/
- public int getNodeByPosition(int position)
- {
+ public int getNodeByPosition(int position) {
if (position <= 0)
return DTM.NULL;
@@ -327,8 +317,7 @@ public class SAX2DTM2 extends SAX2DTM
node = _nextsib2(node);
}
return NULL;
- }
- else {
+ } else {
while (node != DTM.NULL) {
if (_exptype2(node) >= DTM.NTYPES) {
pos++;
@@ -415,13 +404,11 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ public DTMAxisIterator setStartNode(int node) {
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
_currentNode = makeNodeIdentity(node);
@@ -436,8 +423,7 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
+ public int next() {
_currentNode = (_currentNode == DTM.NULL) ? DTM.NULL
: _nextsib2(_currentNode);
return returnNode(makeNodeHandle(_currentNode));
@@ -460,8 +446,7 @@ public class SAX2DTM2 extends SAX2DTM
*
* @param type The extended type ID being requested.
*/
- public TypedFollowingSiblingIterator(int type)
- {
+ public TypedFollowingSiblingIterator(int type) {
_nodeType = type;
}
@@ -470,8 +455,7 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
+ public int next() {
if (_currentNode == DTM.NULL) {
return DTM.NULL;
}
@@ -481,8 +465,7 @@ public class SAX2DTM2 extends SAX2DTM
if (nodeType != DTM.ELEMENT_NODE) {
while ((node = _nextsib2(node)) != DTM.NULL && _exptype2(node) != nodeType) {}
- }
- else {
+ } else {
while ((node = _nextsib2(node)) != DTM.NULL && _exptype2(node) < DTM.NTYPES) {}
}
@@ -498,8 +481,7 @@ public class SAX2DTM2 extends SAX2DTM
/**
* Iterator that returns attribute nodes (of what nodes?)
*/
- public final class AttributeIterator extends InternalAxisIteratorBase
- {
+ public final class AttributeIterator extends InternalAxisIteratorBase {
// assumes caller will pass element nodes
@@ -511,13 +493,11 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ public DTMAxisIterator setStartNode(int node) {
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
_currentNode = getFirstAttributeIdentity(makeNodeIdentity(node));
@@ -532,9 +512,7 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
-
+ public int next() {
final int node = _currentNode;
if (node != NULL) {
@@ -561,8 +539,7 @@ public class SAX2DTM2 extends SAX2DTM
*
* @param nodeType The extended type ID that is requested.
*/
- public TypedAttributeIterator(int nodeType)
- {
+ public TypedAttributeIterator(int nodeType) {
_nodeType = nodeType;
}
@@ -576,14 +553,10 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
- if (_isRestartable)
- {
+ public DTMAxisIterator setStartNode(int node) {
+ if (_isRestartable) {
_startNode = node;
-
_currentNode = getTypedAttribute(node, _nodeType);
-
return resetPosition();
}
@@ -595,9 +568,7 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
-
+ public int next() {
final int node = _currentNode;
// singleton iterator, since there can only be one attribute of
@@ -624,8 +595,7 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return true.
*/
- public boolean isReverse()
- {
+ public boolean isReverse() {
return true;
}
@@ -637,30 +607,25 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ public DTMAxisIterator setStartNode(int node) {
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
node = _startNodeID = makeNodeIdentity(node);
- if(node == NULL)
- {
+ if(node == NULL) {
_currentNode = node;
return resetPosition();
}
int type = _type2(node);
- if(ExpandedNameTable.ATTRIBUTE == type
- || ExpandedNameTable.NAMESPACE == type )
+ if (ExpandedNameTable.ATTRIBUTE == type ||
+ ExpandedNameTable.NAMESPACE == type)
{
_currentNode = node;
- }
- else
- {
+ } else {
// Be careful to handle the Document node properly
_currentNode = _parent2(node);
if(NULL!=_currentNode)
@@ -680,18 +645,12 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
-
- if (_currentNode == _startNodeID || _currentNode == DTM.NULL)
- {
+ public int next() {
+ if (_currentNode == _startNodeID || _currentNode == DTM.NULL) {
return NULL;
- }
- else
- {
+ } else {
final int node = _currentNode;
_currentNode = _nextsib2(node);
-
return returnNode(makeNodeHandle(node));
}
}
@@ -714,8 +673,7 @@ public class SAX2DTM2 extends SAX2DTM
*
* @param type The extended type ID being requested.
*/
- public TypedPrecedingSiblingIterator(int type)
- {
+ public TypedPrecedingSiblingIterator(int type) {
_nodeType = type;
}
@@ -724,8 +682,7 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
+ public int next() {
int node = _currentNode;
final int nodeType = _nodeType;
@@ -735,8 +692,7 @@ public class SAX2DTM2 extends SAX2DTM
while (node != NULL && node != startNodeID && _exptype2(node) != nodeType) {
node = _nextsib2(node);
}
- }
- else {
+ } else {
while (node != NULL && node != startNodeID && _exptype2(node) < DTM.NTYPES) {
node = _nextsib2(node);
}
@@ -745,8 +701,7 @@ public class SAX2DTM2 extends SAX2DTM
if (node == DTM.NULL || node == startNodeID) {
_currentNode = NULL;
return NULL;
- }
- else {
+ } else {
_currentNode = _nextsib2(node);
return returnNode(makeNodeHandle(node));
}
@@ -755,8 +710,7 @@ public class SAX2DTM2 extends SAX2DTM
/**
* Return the index of the last node in this iterator.
*/
- public int getLast()
- {
+ public int getLast() {
if (_last != -1)
return _last;
@@ -774,8 +728,7 @@ public class SAX2DTM2 extends SAX2DTM
}
node = _nextsib2(node);
}
- }
- else {
+ } else {
while (node != NULL && node != startNodeID) {
if (_exptype2(node) >= DTM.NTYPES) {
last++;
@@ -860,7 +813,7 @@ public class SAX2DTM2 extends SAX2DTM
*/
public DTMAxisIterator setStartNode(int node)
{
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
if (_isRestartable)
@@ -1799,9 +1752,7 @@ public class SAX2DTM2 extends SAX2DTM
// %OPT% These values are unlikely to be equal. Storing
// them in a plain Vector is more efficient than storing in the
// DTMStringPool because we can save the cost for hash calculation.
- //
- // %REVISIT% Do we need a custom class (e.g. StringVector) here?
- protected Vector m_values;
+ protected ArrayList m_values;
// The current index into the m_values Vector.
private int m_valueIndex = 0;
@@ -1881,9 +1832,8 @@ public class SAX2DTM2 extends SAX2DTM
m_buildIdIndex = buildIdIndex;
// Some documents do not have attribute nodes. That is why
- // we set the initial size of this Vector to be small and set
- // the increment to a bigger number.
- m_values = new Vector(32, 512);
+ // we set the initial size of this ArrayList to be small.
+ m_values = new ArrayList<>(32);
m_maxNodeIndex = 1 << DTMManager.IDENT_DTM_NODE_BITS;
@@ -1953,10 +1903,7 @@ public class SAX2DTM2 extends SAX2DTM
* @param identity A node identity, which must not be equal to
* DTM.NULL
*/
- public final int _firstch2(int identity)
- {
- //return m_firstch.elementAt(identity);
-
+ public final int _firstch2(int identity) {
if (identity < m_blocksize)
return m_firstch_map0[identity];
else
@@ -1969,10 +1916,7 @@ public class SAX2DTM2 extends SAX2DTM
* @param identity A node identity, which must not be equal to
* DTM.NULL
*/
- public final int _parent2(int identity)
- {
- //return m_parent.elementAt(identity);
-
+ public final int _parent2(int identity) {
if (identity < m_blocksize)
return m_parent_map0[identity];
else
@@ -1985,9 +1929,7 @@ public class SAX2DTM2 extends SAX2DTM
* @param identity A node identity, which must not be equal to
* DTM.NULL
*/
- public final int _type2(int identity)
- {
- //int eType = _exptype2(identity);
+ public final int _type2(int identity) {
int eType;
if (identity < m_blocksize)
eType = m_exptype_map0[identity];
@@ -2006,12 +1948,9 @@ public class SAX2DTM2 extends SAX2DTM
*
This one is only used by DOMAdapter.getExpandedTypeID(int), which
* is mostly called from the compiled translets.
*/
- public final int getExpandedTypeID2(int nodeHandle)
- {
+ public final int getExpandedTypeID2(int nodeHandle) {
int nodeID = makeNodeIdentity(nodeHandle);
- //return (nodeID != NULL) ? _exptype2(nodeID) : NULL;
-
if (nodeID != NULL) {
if (nodeID < m_blocksize)
return m_exptype_map0[nodeID];
@@ -2026,12 +1965,10 @@ public class SAX2DTM2 extends SAX2DTM
* END of DTM base accessor interfaces
*************************************************************************/
-
/**
* Return the node type from the expanded type
*/
- public final int _exptype2Type(int exptype)
- {
+ public final int _exptype2Type(int exptype) {
if (NULL != exptype)
return m_extendedTypes[exptype].getNodeType();
else
@@ -2046,16 +1983,14 @@ public class SAX2DTM2 extends SAX2DTM
*
* @return The prefix if there is one, or null.
*/
- public int getIdForNamespace(String uri)
- {
+ public int getIdForNamespace(String uri) {
int index = m_values.indexOf(uri);
- if (index < 0)
- {
- m_values.addElement(uri);
+ if (index < 0) {
+ m_values.add(uri);
return m_valueIndex++;
- }
- else
+ } else {
return index;
+ }
}
/**
@@ -2079,15 +2014,25 @@ public class SAX2DTM2 extends SAX2DTM
* @param attributes The specified or defaulted attributes.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#startElement
+ * @see ContentHandler#startElement
*/
- public void startElement(String uri, String localName, String qName, Attributes attributes)
- throws SAXException
+ public void startElement(String uri, String localName, String qName,
+ Attributes attributes) throws SAXException
{
-
charactersFlush();
- int exName = m_expandedNameTable.getExpandedTypeID(uri, localName, DTM.ELEMENT_NODE);
+ // in case URI and localName are empty, the input is not using the
+ // namespaces feature. Then we should take the part after the last
+ // colon of qName as localName (strip all namespace prefixes)
+ if ((uri == null || uri.isEmpty()) &&
+ (localName == null || localName.isEmpty()))
+ {
+ final int colon = qName.lastIndexOf(':');
+ localName = (colon > -1) ? qName.substring(colon + 1) : qName;
+ }
+
+ int exName = m_expandedNameTable.getExpandedTypeID(uri, localName,
+ DTM.ELEMENT_NODE);
int prefixIndex = (qName.length() != localName.length())
? m_valuesOrPrefixes.stringToIndex(qName) : 0;
@@ -2095,7 +2040,7 @@ public class SAX2DTM2 extends SAX2DTM
int elemNode = addNode(DTM.ELEMENT_NODE, exName,
m_parents.peek(), m_previous, prefixIndex, true);
- if(m_indexing)
+ if (m_indexing)
indexNode(exName, elemNode);
m_parents.push(elemNode);
@@ -2104,31 +2049,31 @@ public class SAX2DTM2 extends SAX2DTM
int nDecls = m_prefixMappings.size();
String prefix;
- if(!m_pastFirstElement)
- {
+ if (!m_pastFirstElement) {
// SPECIAL CASE: Implied declaration at root element
- prefix="xml";
+ prefix = "xml";
String declURL = "http://www.w3.org/XML/1998/namespace";
- exName = m_expandedNameTable.getExpandedTypeID(null, prefix, DTM.NAMESPACE_NODE);
- m_values.addElement(declURL);
+ exName = m_expandedNameTable.getExpandedTypeID(null, prefix,
+ DTM.NAMESPACE_NODE);
+ m_values.add(declURL);
int val = m_valueIndex++;
addNode(DTM.NAMESPACE_NODE, exName, elemNode,
DTM.NULL, val, false);
m_pastFirstElement=true;
}
- for (int i = startDecls; i < nDecls; i += 2)
- {
- prefix = (String) m_prefixMappings.elementAt(i);
+ for (int i = startDecls; i < nDecls; i += 2) {
+ prefix = m_prefixMappings.elementAt(i);
if (prefix == null)
continue;
- String declURL = (String) m_prefixMappings.elementAt(i + 1);
+ String declURL = m_prefixMappings.elementAt(i + 1);
- exName = m_expandedNameTable.getExpandedTypeID(null, prefix, DTM.NAMESPACE_NODE);
+ exName = m_expandedNameTable.getExpandedTypeID(null, prefix,
+ DTM.NAMESPACE_NODE);
- m_values.addElement(declURL);
+ m_values.add(declURL);
int val = m_valueIndex++;
addNode(DTM.NAMESPACE_NODE, exName, elemNode, DTM.NULL, val, false);
@@ -2136,28 +2081,37 @@ public class SAX2DTM2 extends SAX2DTM
int n = attributes.getLength();
- for (int i = 0; i < n; i++)
- {
+ for (int i = 0; i < n; i++) {
String attrUri = attributes.getURI(i);
+ String attrLocalName = attributes.getLocalName(i);
String attrQName = attributes.getQName(i);
String valString = attributes.getValue(i);
+ // in case URI and localName are empty, the input is not using the
+ // namespaces feature. Then we should take the part after the last
+ // colon of qName as localName (strip all namespace prefixes)
+ // When the URI is empty but localName has colons then we can also
+ // assume non namespace aware and prefixes can be stripped
+ if (attrUri == null || attrUri.isEmpty()) {
+ if (attrLocalName == null || attrLocalName.isEmpty()) {
+ final int colon = attrQName.lastIndexOf(':');
+ attrLocalName = (colon > -1) ? attrQName.substring(colon + 1) : attrQName;
+ } else {
+ final int colon = attrLocalName.lastIndexOf(':');
+ attrLocalName = (colon > -1) ? attrLocalName.substring(colon + 1) : attrLocalName;
+ }
+ }
+
int nodeType;
-
- String attrLocalName = attributes.getLocalName(i);
-
- if ((null != attrQName)
- && (attrQName.equals("xmlns")
- || attrQName.startsWith("xmlns:")))
+ if ((null != attrQName) &&
+ (attrQName.equals("xmlns") || attrQName.startsWith("xmlns:")))
{
prefix = getPrefix(attrQName, attrUri);
if (declAlreadyDeclared(prefix))
continue; // go to the next attribute.
nodeType = DTM.NAMESPACE_NODE;
- }
- else
- {
+ } else {
nodeType = DTM.ATTRIBUTE_NODE;
if (m_buildIdIndex && attributes.getType(i).equalsIgnoreCase("ID"))
@@ -2166,36 +2120,31 @@ public class SAX2DTM2 extends SAX2DTM
// Bit of a hack... if somehow valString is null, stringToIndex will
// return -1, which will make things very unhappy.
- if(null == valString)
+ if (null == valString)
valString = "";
- m_values.addElement(valString);
+ m_values.add(valString);
int val = m_valueIndex++;
- if (attrLocalName.length() != attrQName.length())
- {
-
+ if (attrLocalName.length() != attrQName.length()) {
prefixIndex = m_valuesOrPrefixes.stringToIndex(attrQName);
-
int dataIndex = m_data.size();
-
m_data.addElement(prefixIndex);
m_data.addElement(val);
-
val = -dataIndex;
}
- exName = m_expandedNameTable.getExpandedTypeID(attrUri, attrLocalName, nodeType);
- addNode(nodeType, exName, elemNode, DTM.NULL, val,
- false);
+ exName = m_expandedNameTable.getExpandedTypeID(attrUri, attrLocalName,
+ nodeType);
+ addNode(nodeType, exName, elemNode, DTM.NULL, val, false);
}
- if (null != m_wsfilter)
- {
- short wsv = m_wsfilter.getShouldStripSpace(makeNodeHandle(elemNode), this);
- boolean shouldStrip = (DTMWSFilter.INHERIT == wsv)
- ? getShouldStripWhitespace()
- : (DTMWSFilter.STRIP == wsv);
+ if (null != m_wsfilter) {
+ short wsv = m_wsfilter.getShouldStripSpace(makeNodeHandle(elemNode),
+ this);
+ boolean shouldStrip = (DTMWSFilter.INHERIT == wsv) ?
+ getShouldStripWhitespace() :
+ (DTMWSFilter.STRIP == wsv);
pushShouldStripWhitespace(shouldStrip);
}
@@ -2223,7 +2172,7 @@ public class SAX2DTM2 extends SAX2DTM
* empty string if qualified names are not available.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#endElement
+ * @see ContentHandler#endElement
*/
public void endElement(String uri, String localName, String qName)
throws SAXException
@@ -2257,9 +2206,7 @@ public class SAX2DTM2 extends SAX2DTM
* @param length The number of characters to use from the array.
* @throws SAXException The application may raise an exception.
*/
- public void comment(char ch[], int start, int length) throws SAXException
- {
-
+ public void comment(char ch[], int start, int length) throws SAXException {
if (m_insideDTD) // ignore comments if we're inside the DTD
return;
@@ -2267,7 +2214,7 @@ public class SAX2DTM2 extends SAX2DTM
// %OPT% Saving the comment string in a Vector has a lower cost than
// saving it in DTMStringPool.
- m_values.addElement(new String(ch, start, length));
+ m_values.add(new String(ch, start, length));
int dataIndex = m_valueIndex++;
m_previous = addNode(DTM.COMMENT_NODE, DTM.COMMENT_NODE,
@@ -2279,13 +2226,10 @@ public class SAX2DTM2 extends SAX2DTM
*
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#startDocument
+ * @see ContentHandler#startDocument
*/
- public void startDocument() throws SAXException
- {
-
- int doc = addNode(DTM.DOCUMENT_NODE,
- DTM.DOCUMENT_NODE,
+ public void startDocument() throws SAXException {
+ int doc = addNode(DTM.DOCUMENT_NODE, DTM.DOCUMENT_NODE,
DTM.NULL, DTM.NULL, 0, true);
m_parents.push(doc);
@@ -2299,10 +2243,9 @@ public class SAX2DTM2 extends SAX2DTM
*
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#endDocument
+ * @see ContentHandler#endDocument
*/
- public void endDocument() throws SAXException
- {
+ public void endDocument() throws SAXException {
super.endDocument();
// Add a NULL entry to the end of the node arrays as
@@ -2334,16 +2277,15 @@ public class SAX2DTM2 extends SAX2DTM
* @return The index identity of the node that was added.
*/
protected final int addNode(int type, int expandedTypeID,
- int parentIndex, int previousSibling,
- int dataOrPrefix, boolean canHaveFirstChild)
+ int parentIndex, int previousSibling,
+ int dataOrPrefix, boolean canHaveFirstChild)
{
// Common to all nodes:
int nodeIndex = m_size++;
// Have we overflowed a DTM Identity's addressing range?
//if(m_dtmIdent.size() == (nodeIndex>>>DTMManager.IDENT_DTM_NODE_BITS))
- if (nodeIndex == m_maxNodeIndex)
- {
+ if (nodeIndex == m_maxNodeIndex) {
addNewDTMID(nodeIndex);
m_maxNodeIndex += (1 << DTMManager.IDENT_DTM_NODE_BITS);
}
@@ -2366,8 +2308,7 @@ public class SAX2DTM2 extends SAX2DTM
// is called, to handle successive characters() events.
// Special handling by type: Declare namespaces, attach first child
- switch(type)
- {
+ switch(type) {
case DTM.NAMESPACE_NODE:
declareNamespaceInContext(parentIndex,nodeIndex);
break;
@@ -2376,8 +2317,7 @@ public class SAX2DTM2 extends SAX2DTM
default:
if (DTM.NULL != previousSibling) {
m_nextsib.setElementAt(nodeIndex,previousSibling);
- }
- else if (DTM.NULL != parentIndex) {
+ } else if (DTM.NULL != parentIndex) {
m_firstch.setElementAt(nodeIndex,parentIndex);
}
break;
@@ -2390,16 +2330,12 @@ public class SAX2DTM2 extends SAX2DTM
* Check whether accumulated text should be stripped; if not,
* append the appropriate flavor of text/cdata node.
*/
- protected final void charactersFlush()
- {
-
- if (m_textPendingStart >= 0) // -1 indicates no-text-in-progress
- {
+ protected final void charactersFlush() {
+ if (m_textPendingStart >= 0) { // -1 indicates no-text-in-progress
int length = m_chars.size() - m_textPendingStart;
boolean doStrip = false;
- if (getShouldStripWhitespace())
- {
+ if (getShouldStripWhitespace()) {
doStrip = m_chars.isWhitespace(m_textPendingStart, length);
}
@@ -2412,19 +2348,19 @@ public class SAX2DTM2 extends SAX2DTM
// If the offset and length do not exceed the given limits
// (offset < 2^21 and length < 2^10), then save both the offset
// and length in a bitwise encoded value.
- if (length <= TEXT_LENGTH_MAX
- && m_textPendingStart <= TEXT_OFFSET_MAX) {
+ if (length <= TEXT_LENGTH_MAX &&
+ m_textPendingStart <= TEXT_OFFSET_MAX) {
m_previous = addNode(m_coalescedTextType, DTM.TEXT_NODE,
- m_parents.peek(), m_previous,
- length + (m_textPendingStart << TEXT_LENGTH_BITS),
- false);
+ m_parents.peek(), m_previous,
+ length + (m_textPendingStart << TEXT_LENGTH_BITS),
+ false);
} else {
// Store offset and length in the m_data array if one exceeds
// the given limits. Use a negative dataIndex as an indication.
int dataIndex = m_data.size();
m_previous = addNode(m_coalescedTextType, DTM.TEXT_NODE,
- m_parents.peek(), m_previous, -dataIndex, false);
+ m_parents.peek(), m_previous, -dataIndex, false);
m_data.addElement(m_textPendingStart);
m_data.addElement(length);
@@ -2452,7 +2388,7 @@ public class SAX2DTM2 extends SAX2DTM
* none is supplied.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#processingInstruction
+ * @see ContentHandler#processingInstruction
*/
public void processingInstruction(String target, String data)
throws SAXException
@@ -2467,7 +2403,7 @@ public class SAX2DTM2 extends SAX2DTM
-dataIndex, false);
m_data.addElement(m_valuesOrPrefixes.stringToIndex(target));
- m_values.addElement(data);
+ m_values.add(data);
m_data.addElement(m_valueIndex++);
}
@@ -2865,9 +2801,9 @@ public class SAX2DTM2 extends SAX2DTM
}
if (m_xstrf != null)
- return m_xstrf.newstr((String)m_values.elementAt(dataIndex));
+ return m_xstrf.newstr(m_values.get(dataIndex));
else
- return new XMLStringDefault((String)m_values.elementAt(dataIndex));
+ return new XMLStringDefault(m_values.get(dataIndex));
}
}
@@ -2966,7 +2902,7 @@ public class SAX2DTM2 extends SAX2DTM
dataIndex = m_data.elementAt(dataIndex + 1);
}
- return (String)m_values.elementAt(dataIndex);
+ return m_values.get(dataIndex);
}
}
@@ -3106,7 +3042,7 @@ public class SAX2DTM2 extends SAX2DTM
dataIndex = m_data.elementAt(dataIndex + 1);
}
- String str = (String)m_values.elementAt(dataIndex);
+ String str = m_values.get(dataIndex);
if(normalize)
FastStringBuffer.sendNormalizedSAXcharacters(str.toCharArray(),
@@ -3160,7 +3096,7 @@ public class SAX2DTM2 extends SAX2DTM
dataIndex = m_data.elementAt(dataIndex + 1);
}
- return (String)m_values.elementAt(dataIndex);
+ return m_values.get(dataIndex);
}
}
@@ -3202,8 +3138,7 @@ public class SAX2DTM2 extends SAX2DTM
if (uri.length() == 0) {
handler.startElement(name);
return name;
- }
- else {
+ } else {
int qnameIndex = m_dataOrQName.elementAt(nodeID);
if (qnameIndex == 0) {
@@ -3223,14 +3158,12 @@ public class SAX2DTM2 extends SAX2DTM
String prefix;
if (prefixIndex > 0) {
prefix = qName.substring(0, prefixIndex);
- }
- else {
+ } else {
prefix = null;
}
handler.namespaceAfterStartElement(prefix, uri);
return qName;
}
-
}
/**
@@ -3285,7 +3218,7 @@ public class SAX2DTM2 extends SAX2DTM
dataIndex = m_data.elementAt(dataIndex + 1);
}
- String nodeValue = (String)m_values.elementAt(dataIndex);
+ String nodeValue = m_values.get(dataIndex);
handler.namespaceAfterStartElement(nodeName, nodeValue);
@@ -3335,7 +3268,6 @@ public class SAX2DTM2 extends SAX2DTM
}
-
/**
* Copy an Attribute node to a SerializationHandler
*
@@ -3347,14 +3279,6 @@ public class SAX2DTM2 extends SAX2DTM
SerializationHandler handler)
throws SAXException
{
- /*
- final String uri = getNamespaceName(node);
- if (uri.length() != 0) {
- final String prefix = getPrefix(node);
- handler.namespaceAfterStartElement(prefix, uri);
- }
- handler.addAttribute(getNodeName(node), getNodeValue(node));
- */
final ExtendedType extType = m_extendedTypes[exptype];
final String uri = extType.getNamespace();
final String localName = extType.getLocalName();
@@ -3377,7 +3301,7 @@ public class SAX2DTM2 extends SAX2DTM
}
String nodeName = (prefix != null) ? qname : localName;
- String nodeValue = (String)m_values.elementAt(valueIndex);
+ String nodeValue = m_values.get(valueIndex);
handler.addAttribute(uri, localName, nodeName, "CDATA", nodeValue);
}
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/AltCatalog.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/AltCatalog.java
index 3bb99efec67..07e9ee1fd77 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/AltCatalog.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/AltCatalog.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -58,7 +58,7 @@ class AltCatalog extends BaseEntry {
}
/**
- * Returns the catalog attribute as an URI String.
+ * Returns the catalog attribute as a URI String.
* @return The value of the catalog attribute
*/
String getCatalogId() {
@@ -66,7 +66,7 @@ class AltCatalog extends BaseEntry {
}
/**
- * Returns the catalog attribute as an URI.
+ * Returns the catalog attribute as a URI.
* @return The value of the catalog attribute
*/
URI getCatalogURI() {
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/BaseEntry.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/BaseEntry.java
index 943b9f23264..3d5718d661d 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/BaseEntry.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/BaseEntry.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -27,6 +27,7 @@ package javax.xml.catalog;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Objects;
+import static javax.xml.catalog.CatalogMessages.ERR_INVALID_ARGUMENT;
/**
* Represents a general Catalog entry.
@@ -210,13 +211,12 @@ abstract class BaseEntry {
* @param arg The name of the argument
* @param uri The URI to be verified
* @return The URI created from the specified uri
- * @throws IllegalArgumentException if the specified uri is null,
- * or an URL can not be created based on the specified base and uri
+ * @throws NullPointerException if the specified uri is null
+ * @throws IllegalArgumentException if a URL can not be created based on
+ * the specified base and uri
*/
URL verifyURI(String arg, URL base, String uri) {
- if (uri == null) {
- CatalogMessages.reportIAE(new Object[]{uri, arg}, null);
- }
+ CatalogMessages.reportNPEOnNull(arg, uri);
URL url = null;
uri = Normalizer.normalizeURI(uri);
@@ -228,32 +228,9 @@ abstract class BaseEntry {
url = new URL(uri);
}
} catch (MalformedURLException e) {
- CatalogMessages.reportIAE(new Object[]{uri, arg}, e);
+ CatalogMessages.reportIAE(ERR_INVALID_ARGUMENT,
+ new Object[]{uri, arg}, e);
}
return url;
}
-
- /**
- * Construct an absolute URI from a relative one, using the current base
- * URI.
- *
- * @param sysid The (possibly relative) system identifier
- * @return The system identifier made absolute with respect to the current
- * {@link #base}.
- */
- protected String makeAbsolute(String sysid) {
- URL local = null;
-
- sysid = Util.fixSlashes(sysid);
- /**
- * try { local = new URL(base, sysid); } catch (MalformedURLException e)
- * { catalogManager.debug.message(1, "Malformed URL on system
- * identifier", sysid); }
- */
- if (local != null) {
- return local.toString();
- } else {
- return sysid;
- }
- }
}
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/Catalog.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/Catalog.java
index 16f70ad7581..fcefd012666 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/Catalog.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/Catalog.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -44,7 +44,7 @@ import java.util.stream.Stream;
*
*
Locate the external resources with a public or system identifier;
*
- *
Locate an alternate URI reference with an URI.
+ *
Locate an alternate URI reference with a URI.
*
*
*
@@ -84,7 +84,7 @@ public interface Catalog {
*
* @param systemId the system identifier of the entity to be matched
*
- * @return an URI string if a mapping is found, or null otherwise
+ * @return a URI string if a mapping is found, or null otherwise
*/
public String matchSystem(String systemId);
@@ -108,7 +108,7 @@ public interface Catalog {
*
* @param publicId the public identifier of the entity to be matched
* @see CatalogFeatures.Feature
- * @return an URI string if a mapping is found, or null otherwise
+ * @return a URI string if a mapping is found, or null otherwise
*/
public String matchPublic(String publicId);
@@ -134,7 +134,7 @@ public interface Catalog {
*
* @param uri the URI reference of the entity to be matched
*
- * @return an URI string if a mapping is found, or null otherwise
+ * @return a URI string if a mapping is found, or null otherwise
*/
public String matchURI(String uri);
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java
index e448e47ae5c..01d0b533055 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogFeatures.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -56,14 +56,14 @@ import jdk.xml.internal.SecuritySupport;
*
*
A semicolon-delimited list of catalog files. Relative file paths are
- * considered relative to ${user.dir}.
+ *
A semicolon-delimited list of URIs to locate the catalog files.
+ * The URIs must be absolute and have a URL protocol handler for the URI scheme.
*
*
javax.xml.catalog.files
*
javax.xml.catalog.files
*
javax.xml.catalog.files
*
String
- *
File paths
+ *
URIs
*
* Reads the first catalog as the current catalog; Loads others if no match
* is found in the current catalog including delegate catalogs if any.
@@ -170,7 +170,7 @@ import jdk.xml.internal.SecuritySupport;
* Properties set through the Catalog API override those that may have been set
* by system properties and/or in {@code jaxp.properties}. In case of multiple
* interfaces, the latest in a procedure shall take preference. For
- * {@link Feature#FILES}, this means that the path(s) specified through the methods
+ * {@link Feature#FILES}, this means that the URI(s) specified through the methods
* of the {@link CatalogManager} will override any that may have been entered
* through the {@link Builder}.
*
@@ -188,7 +188,7 @@ import jdk.xml.internal.SecuritySupport;
* in the following sample code:
*
{@code
CatalogFeatures f = CatalogFeatures.builder()
- .with(Feature.FILES, "catalog.xml")
+ .with(Feature.FILES, "file:///etc/xml/catalog")
.with(Feature.PREFER, "public")
.with(Feature.DEFER, "true")
.with(Feature.RESOLVE, "ignore")
@@ -202,14 +202,14 @@ import jdk.xml.internal.SecuritySupport;
* Schema Validation ({@link javax.xml.validation}), and XML Transformation
* ({@link javax.xml.transform}). The features described above can be set through JAXP
* factories or processors that define a setProperty or setAttribute interface.
- * For example, the following code snippet sets a path to a catalog file on a SAX
+ * For example, the following code snippet sets a URI to a catalog file on a SAX
* parser through the {@code javax.xml.catalog.files} property:
*
* [1] Note that this statement is not required since the default value of
@@ -275,7 +275,7 @@ import jdk.xml.internal.SecuritySupport;
The following XInclude element:
- can be resolved using an uri entry:
+ can be resolved using a URI entry:
or
@@ -291,7 +291,7 @@ import jdk.xml.internal.SecuritySupport;
- can be resolved using an uri entry:
+ can be resolved using a URI entry:
or
@@ -308,7 +308,7 @@ import jdk.xml.internal.SecuritySupport;
The following include element:
- can be resolved using an uri entry:
+ can be resolved using a URI entry:
or
@@ -323,7 +323,7 @@ import jdk.xml.internal.SecuritySupport;
The following include element:
- can be resolved using an uri entry:
+ can be resolved using a URI entry:
or
@@ -338,7 +338,7 @@ import jdk.xml.internal.SecuritySupport;
The document in the following element:
- can be resolved using an uri entry:
+ can be resolved using a URI entry:
or
@@ -559,7 +559,7 @@ public class CatalogFeatures {
values = new String[Feature.values().length];
states = new State[Feature.values().length];
for (Feature cf : Feature.values()) {
- setProperty(cf.ordinal(), State.DEFAULT, cf.defaultValue());
+ setProperty(cf, State.DEFAULT, cf.defaultValue());
}
//read system properties or jaxp.properties
readSystemProperties();
@@ -571,52 +571,27 @@ public class CatalogFeatures {
*/
private void setProperties(Builder builder) {
builder.values.entrySet().stream().forEach((entry) -> {
- setProperty(entry.getKey().ordinal(), State.APIPROPERTY, entry.getValue());
+ setProperty(entry.getKey(), State.APIPROPERTY, entry.getValue());
});
}
/**
- * Sets the value of a property by its index, updates only if it shall override.
+ * Sets the value of a property, updates only if it shall override.
*
* @param index the index of the property
* @param state the state of the property
* @param value the value of the property
* @throws IllegalArgumentException if the value is invalid
*/
- private void setProperty(int index, State state, String value) {
+ private void setProperty(Feature feature, State state, String value) {
+ int index = feature.ordinal();
if (value != null && value.length() != 0) {
- if (index == Feature.PREFER.ordinal()) {
- if (!value.equals(PREFER_SYSTEM) && !value.equals(PREFER_PUBLIC)) {
- CatalogMessages.reportIAE(new Object[]{value, Feature.PREFER.name()}, null);
- }
- } else if (index == Feature.DEFER.ordinal()) {
- if (!value.equals(DEFER_TRUE) && !value.equals(DEFER_FALSE)) {
- CatalogMessages.reportIAE(new Object[]{value, Feature.DEFER.name()}, null);
- }
- } else if (index == Feature.RESOLVE.ordinal()) {
- if (!value.equals(RESOLVE_STRICT) && !value.equals(RESOLVE_CONTINUE)
- && !value.equals(RESOLVE_IGNORE)) {
- CatalogMessages.reportIAE(new Object[]{value, Feature.RESOLVE.name()}, null);
- }
- } else if (index == Feature.FILES.ordinal()) {
- try {
- String[] catalogFile = value.split(";[ ]*");
- for (String temp : catalogFile) {
- if (Util.verifyAndGetURI(temp, null) == null) {
- CatalogMessages.reportIAE(new Object[]{value, Feature.FILES.name()}, null);
- }
- }
- }catch (MalformedURLException | URISyntaxException | IllegalArgumentException ex) {
- CatalogMessages.reportIAE(new Object[]{value, Feature.FILES.name()}, ex);
- }
+ if (state != State.APIPROPERTY) {
+ Util.validateFeatureInput(feature, value);
}
if (states[index] == null || state.compareTo(states[index]) >= 0) {
values[index] = value;
states[index] = state;
}
- } else {
- if (state == State.SYSTEMPROPERTY || state == State.JAXPDOTPROPERTIES) {
- CatalogMessages.reportIAE(new Object[]{value, Feature.values()[index].name()}, null);
- }
}
}
@@ -639,13 +614,13 @@ public class CatalogFeatures {
if (cf.hasSystemProperty()) {
String value = SecuritySupport.getSystemProperty(sysPropertyName);
if (value != null && !value.equals("")) {
- setProperty(cf.ordinal(), State.SYSTEMPROPERTY, value);
+ setProperty(cf, State.SYSTEMPROPERTY, value);
return true;
}
value = SecuritySupport.readJAXPProperty(sysPropertyName);
if (value != null && !value.equals("")) {
- setProperty(cf.ordinal(), State.JAXPDOTPROPERTIES, value);
+ setProperty(cf, State.JAXPDOTPROPERTIES, value);
return true;
}
}
@@ -685,9 +660,7 @@ public class CatalogFeatures {
* property
*/
public Builder with(Feature feature, String value) {
- if (value == null || value.length() == 0) {
- CatalogMessages.reportIAE(new Object[]{value, feature.name()}, null);
- }
+ Util.validateFeatureInput(feature, value);
values.put(feature, value);
return this;
}
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogImpl.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogImpl.java
index 6630424c15a..cbf77e5c9c0 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogImpl.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -75,7 +75,7 @@ class CatalogImpl extends GroupEntry implements Catalog {
/*
A list of catalog entry files from the input, excluding the current catalog.
- Paths in the List are normalized.
+ URIs in the List are verified during input validation or property retrieval.
*/
List inputFiles;
@@ -86,43 +86,44 @@ class CatalogImpl extends GroupEntry implements Catalog {
SAXParser parser;
/**
- * Construct a Catalog with specified path.
+ * Construct a Catalog with specified URI.
*
- * @param file The path to a catalog file.
+ * @param uris the uri(s) to one or more catalogs
* @throws CatalogException If an error happens while parsing the specified
* catalog file.
*/
- public CatalogImpl(CatalogFeatures f, String... file) throws CatalogException {
- this(null, f, file);
+ public CatalogImpl(CatalogFeatures f, URI... uris) throws CatalogException {
+ this(null, f, uris);
}
/**
- * Construct a Catalog with specified path.
+ * Construct a Catalog with specified URI.
*
* @param parent The parent catalog
- * @param file The path to a catalog file.
+ * @param uris the uri(s) to one or more catalogs
* @throws CatalogException If an error happens while parsing the specified
* catalog file.
*/
- public CatalogImpl(CatalogImpl parent, CatalogFeatures f, String... file) throws CatalogException {
+ public CatalogImpl(CatalogImpl parent, CatalogFeatures f, URI... uris) throws CatalogException {
super(CatalogEntryType.CATALOG, parent);
if (f == null) {
throw new NullPointerException(
formatMessage(CatalogMessages.ERR_NULL_ARGUMENT, new Object[]{"CatalogFeatures"}));
}
- if (file.length > 0) {
- CatalogMessages.reportNPEOnNull("The path to the catalog file", file[0]);
- }
-
init(f);
//Path of catalog files
- String[] catalogFile = file;
- if (level == 0 && file.length == 0) {
+ String[] catalogFile = null;
+ if (level == 0 && uris.length == 0) {
String files = features.get(Feature.FILES);
if (files != null) {
- catalogFile = files.split(";[ ]*");
+ catalogFile = files.split(";");
+ }
+ } else {
+ catalogFile = new String[uris.length];
+ for (int i=0; i {
- getCatalog(getSystemId(file));
+ inputFiles.stream().forEach((uri) -> {
+ getCatalog(URI.create(uri));
});
}
}
@@ -454,12 +432,11 @@ class CatalogImpl extends GroupEntry implements Catalog {
}
CatalogImpl c = null;
- String path = uri.toASCIIString();
if (verifyCatalogFile(uri)) {
- c = getLoadedCatalog(path);
+ c = getLoadedCatalog(uri.toASCIIString());
if (c == null) {
- c = new CatalogImpl(this, features, path);
+ c = new CatalogImpl(this, features, uri);
c.load();
}
}
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogManager.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogManager.java
index 7dd1e9cf873..f8ce697b266 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogManager.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -24,6 +24,7 @@
*/
package javax.xml.catalog;
+import java.net.URI;
/**
* The Catalog Manager manages the creation of XML Catalogs and Catalog Resolvers.
@@ -39,30 +40,36 @@ public final class CatalogManager {
/**
* Creates a {@code Catalog} object using the specified feature settings and
- * path to one or more catalog files.
+ * uri(s) to one or more catalog files.
*
- * If {@code paths} is empty, system property {@code javax.xml.catalog.files}
- * will be read to locate the initial list of catalog files.
+ * If {@code uris} is empty, system property {@code javax.xml.catalog.files},
+ * as defined in {@link CatalogFeatures}, will be read to locate the initial
+ * list of catalog files.
*
- * If more than one catalog files are specified through the paths argument or
+ * If multiple catalog files are specified through the {@code uris} argument or
* {@code javax.xml.catalog.files} property, the first entry is considered
* the main catalog, while others are treated as alternative catalogs after
* those referenced by the {@code nextCatalog} elements in the main catalog.
*
* As specified in
*
- * XML Catalogs, OASIS Standard V1.1, invalid path entries will be ignored.
- * No error will be reported. In case all entries are invalid, the resolver
- * will return as no mapping is found.
+ * XML Catalogs, OASIS Standard V1.1, if a catalog entry is invalid, it
+ * is ignored. In case all entries are invalid, the resulting Catalog object
+ * will contain no Catalog elements. Any matching operation using the Catalog
+ * will return null.
*
* @param features the catalog features
- * @param paths path(s) to one or more catalogs.
+ * @param uris uri(s) to one or more catalogs.
*
* @return an instance of a {@code Catalog}
+ * @throws IllegalArgumentException if either the URIs are not absolute
+ * or do not have a URL protocol handler for the URI scheme
* @throws CatalogException If an error occurs while parsing the catalog
+ * @throws SecurityException if access to the resource is denied by the security manager
*/
- public static Catalog catalog(CatalogFeatures features, String... paths) {
- CatalogImpl catalog = new CatalogImpl(features, paths);
+ public static Catalog catalog(CatalogFeatures features, URI... uris) {
+ Util.validateUrisSyntax(uris);
+ CatalogImpl catalog = new CatalogImpl(features, uris);
catalog.load();
return catalog;
}
@@ -80,30 +87,36 @@ public final class CatalogManager {
/**
* Creates an instance of a {@code CatalogResolver} using the specified feature
- * settings and path to one or more catalog files.
+ * settings and uri(s) to one or more catalog files.
*
- * If {@code paths} is empty, system property {@code javax.xml.catalog.files}
- * will be read to locate the initial list of catalog files.
+ * If {@code uris} is empty, system property {@code javax.xml.catalog.files},
+ * as defined in {@link CatalogFeatures}, will be read to locate the initial
+ * list of catalog files.
*
- * If more than one catalog files are specified through the paths argument or
+ * If multiple catalog files are specified through the {@code uris} argument or
* {@code javax.xml.catalog.files} property, the first entry is considered
* the main catalog, while others are treated as alternative catalogs after
* those referenced by the {@code nextCatalog} elements in the main catalog.
*
* As specified in
*
- * XML Catalogs, OASIS Standard V1.1, invalid path entries will be ignored.
- * No error will be reported. In case all entries are invalid, the resolver
- * will return as no mapping is found.
+ * XML Catalogs, OASIS Standard V1.1, if a catalog entry is invalid, it
+ * is ignored. In case all entries are invalid, the resulting CatalogResolver
+ * object will contain no valid catalog. Any resolution operation using the
+ * resolver therefore will return as no mapping is found. See {@link CatalogResolver}
+ * for the behavior when no mapping is found.
*
* @param features the catalog features
- * @param paths the path(s) to one or more catalogs
+ * @param uris the uri(s) to one or more catalogs
*
* @return an instance of a {@code CatalogResolver}
+ * @throws IllegalArgumentException if either the URIs are not absolute
+ * or do not have a URL protocol handler for the URI scheme
* @throws CatalogException If an error occurs while parsing the catalog
+ * @throws SecurityException if access to the resource is denied by the security manager
*/
- public static CatalogResolver catalogResolver(CatalogFeatures features, String... paths) {
- Catalog catalog = catalog(features, paths);
+ public static CatalogResolver catalogResolver(CatalogFeatures features, URI... uris) {
+ Catalog catalog = catalog(features, uris);
return new CatalogResolverImpl(catalog);
}
}
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogMessages.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogMessages.java
index 97a0cd57cc7..6a6996fa686 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogMessages.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogMessages.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -24,10 +24,11 @@
*/
package javax.xml.catalog;
-import jdk.xml.internal.SecuritySupport;
+import java.net.URI;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
+import jdk.xml.internal.SecuritySupport;
/**
* Catalog Error messages
@@ -38,6 +39,8 @@ final class CatalogMessages {
public static final String ERR_INVALID_CATALOG = "InvalidCatalog";
public static final String ERR_INVALID_ENTRY_TYPE = "InvalidEntryType";
+ public static final String ERR_URI_NOTABSOLUTE = "UriNotAbsolute";
+ public static final String ERR_URI_NOTVALIDURL = "UriNotValidUrl";
public static final String ERR_INVALID_ARGUMENT = "InvalidArgument";
public static final String ERR_NULL_ARGUMENT = "NullArgument";
public static final String ERR_CIRCULAR_REFERENCE = "CircularReference";
@@ -120,7 +123,7 @@ final class CatalogMessages {
* @param name the name of the argument
* @param value the value of the argument
*/
- static void reportNPEOnNull(String name, String value) {
+ static void reportNPEOnNull(String name, Object value) {
if (value == null) {
throw new NullPointerException(
formatMessage(ERR_NULL_ARGUMENT, new Object[]{name}));
@@ -132,9 +135,9 @@ final class CatalogMessages {
* @param arguments the arguments for formating the error message
* @param cause the cause if any
*/
- static void reportIAE(Object[] arguments, Throwable cause) {
+ static void reportIAE(String key, Object[] arguments, Throwable cause) {
throw new IllegalArgumentException(
- formatMessage(ERR_INVALID_ARGUMENT, arguments), cause);
+ formatMessage(key, arguments), cause);
}
/**
@@ -174,7 +177,7 @@ final class CatalogMessages {
/**
* Returns sanitized URI.
- * @param uri an URI to be sanitized
+ * @param uri a URI to be sanitized
*/
static String sanitize(String uri) {
if (uri == null) {
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogMessages.properties b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogMessages.properties
index 69341fdbd84..a1133ca9da5 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogMessages.properties
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogMessages.properties
@@ -31,6 +31,8 @@ InvalidEntryType = The entry type ''{0}'' is not valid.
CircularReference = Circular reference is not allowed: ''{0}''.
#errors
+UriNotAbsolute = The specified URI ''{0}'' is not absolute.
+UriNotValidUrl = The specified URI ''{0}'' is not a valid URL.
InvalidArgument = The specified argument ''{0}'' (case sensitive) for ''{1}'' is not valid.
NullArgument = The argument ''{0}'' can not be null.
InvalidPath = The path ''{0}'' is invalid.
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogReader.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogReader.java
index 5f08c54cc12..64b2ea85071 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogReader.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogReader.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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,10 +25,6 @@
package javax.xml.catalog;
import java.io.StringReader;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import javax.xml.catalog.BaseEntry.CatalogEntryType;
import javax.xml.parsers.SAXParser;
import javax.xml.transform.Source;
@@ -94,25 +90,6 @@ class CatalogReader extends DefaultHandler implements EntityResolver, URIResolve
this.parser = parser;
}
- /**
- * Returns when the specified path is valid.
- * @param path a path
- * @return true if the path is valid, false otherwise
- */
- boolean isValidPath(String path) {
- boolean valid = true;
- try {
- Path p = Paths.get(new URI(path));
- if (!p.toFile().exists()) {
- valid = false;
- }
- } catch (URISyntaxException ex) {
- valid = false;
- }
-
- return valid;
- }
-
@Override
public void startElement(String namespaceURI,
String localName,
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolver.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolver.java
index ecf506f5cab..fe1b6f2177d 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolver.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolver.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -47,7 +47,7 @@ import org.xml.sax.InputSource;
* {@link javax.xml.stream.XMLResolver} and {@link org.w3c.dom.ls.LSResourceResolver}
* however, make no such distinction.
* In consistent with the existing Java API, this CatalogResolver recognizes a
- * system identifier as an URI and will search both {@code system} and {@code uri}
+ * system identifier as a URI and will search both {@code system} and {@code uri}
* entries in a catalog in order to find a matching entry.
*
* The search is started in the current catalog. If a match is found,
@@ -137,9 +137,9 @@ public interface CatalogResolver extends EntityResolver, XMLResolver,
* with the specified {@code href} attribute. The {@code href} attribute will
* be used literally, with no attempt to be made absolute to the {@code base}.
*
- * If the value is an URN, the {@code href} attribute is recognized as a
+ * If the value is a URN, the {@code href} attribute is recognized as a
* {@code publicId}, and used to search {@code public} entries.
- * If the value is an URI, it is taken as a {@code systemId}, and used to
+ * If the value is a URI, it is taken as a {@code systemId}, and used to
* search both {@code system} and {@code uri} entries.
*
*
@@ -219,7 +219,7 @@ public interface CatalogResolver extends EntityResolver, XMLResolver,
* @param publicId the public identifier of the external entity being
* referenced, or {@code null} if no public identifier was
* supplied or if the resource is not an entity.
- * @param systemId the system identifier, an URI reference of the
+ * @param systemId the system identifier, a URI reference of the
* external resource being referenced
* @param baseUri the absolute base URI, not used by the CatalogResolver
*
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolverImpl.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolverImpl.java
index fe6223d9324..0977479ca9d 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolverImpl.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogResolverImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -73,7 +73,7 @@ final class CatalogResolverImpl implements CatalogResolver {
systemId = Normalizer.normalizeURI(Util.getNotNullOrEmpty(systemId));
publicId = Normalizer.normalizePublicId(Normalizer.decodeURN(Util.getNotNullOrEmpty(publicId)));
- //check whether systemId is an urn
+ //check whether systemId is a urn
if (systemId != null && systemId.startsWith(Util.URN)) {
systemId = Normalizer.decodeURN(systemId);
if (publicId != null && !publicId.equals(systemId)) {
@@ -123,7 +123,7 @@ final class CatalogResolverImpl implements CatalogResolver {
return null;
}
- //check whether uri is an urn
+ //check whether uri is a urn
if (uri != null && uri.startsWith(Util.URN)) {
String publicId = Normalizer.decodeURN(uri);
if (publicId != null) {
@@ -131,7 +131,7 @@ final class CatalogResolverImpl implements CatalogResolver {
}
}
- //if no match with a public id, continue search for an URI
+ //if no match with a public id, continue search for a URI
if (result == null) {
//remove fragment if any.
int hashPos = uri.indexOf("#");
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/GroupEntry.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/GroupEntry.java
index e04f8cdb363..b0dd80c733f 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/GroupEntry.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/GroupEntry.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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,8 +25,6 @@
package javax.xml.catalog;
import java.net.URI;
-import java.nio.file.Files;
-import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -217,7 +215,7 @@ class GroupEntry extends BaseEntry {
* @param systemId The system identifier of the external entity being
* referenced.
*
- * @return An URI string if a mapping is found, or null otherwise.
+ * @return a URI string if a mapping is found, or null otherwise.
*/
public String matchSystem(String systemId) {
systemEntrySearched = true;
@@ -285,7 +283,7 @@ class GroupEntry extends BaseEntry {
* @param publicId The public identifier of the external entity being
* referenced.
*
- * @return An URI string if a mapping is found, or null otherwise.
+ * @return a URI string if a mapping is found, or null otherwise.
*/
public String matchPublic(String publicId) {
/*
@@ -329,7 +327,7 @@ class GroupEntry extends BaseEntry {
*
* @param uri The URI reference of a resource.
*
- * @return An URI string if a mapping is found, or null otherwise.
+ * @return a URI string if a mapping is found, or null otherwise.
*/
public String matchURI(String uri) {
String match = null;
@@ -455,7 +453,7 @@ class GroupEntry extends BaseEntry {
delegateCatalog = getLoadedCatalog(catalogId);
if (delegateCatalog == null) {
if (verifyCatalogFile(catalogURI)) {
- delegateCatalog = new CatalogImpl(catalog, features, catalogId);
+ delegateCatalog = new CatalogImpl(catalog, features, catalogURI);
delegateCatalog.load();
delegateCatalogs.put(catalogId, delegateCatalog);
}
@@ -504,7 +502,8 @@ class GroupEntry extends BaseEntry {
}
//Ignore it if it doesn't exist
- if (!Files.exists(Paths.get(catalogURI))) {
+ if (Util.isFileUri(catalogURI) &&
+ !Util.isFileUriExist(catalogURI, false)) {
return false;
}
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/UriEntry.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/UriEntry.java
index 0c1aa295c9c..9f5b4987008 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/UriEntry.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/UriEntry.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -27,7 +27,7 @@ package javax.xml.catalog;
import java.net.URL;
/**
- * Represents an uriEntry entry.
+ * Represents a uri entry.
*
* @since 9
*/
@@ -36,7 +36,7 @@ final class UriEntry extends BaseEntry {
URL uri;
/**
- * Construct a group entry.
+ * Construct a uri entry.
* @param name The name attribute.
* @param uri The uri attribute.
*/
diff --git a/jaxp/src/java.xml/share/classes/javax/xml/catalog/Util.java b/jaxp/src/java.xml/share/classes/javax/xml/catalog/Util.java
index f2b00a21ee6..bec119f1143 100644
--- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/Util.java
+++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/Util.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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,13 +25,20 @@
package javax.xml.catalog;
import java.io.File;
+import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import java.util.Iterator;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import static javax.xml.catalog.CatalogFeatures.DEFER_FALSE;
+import static javax.xml.catalog.CatalogFeatures.DEFER_TRUE;
+import javax.xml.catalog.CatalogFeatures.Feature;
+import static javax.xml.catalog.CatalogFeatures.PREFER_PUBLIC;
+import static javax.xml.catalog.CatalogFeatures.PREFER_SYSTEM;
+import static javax.xml.catalog.CatalogFeatures.RESOLVE_CONTINUE;
+import static javax.xml.catalog.CatalogFeatures.RESOLVE_IGNORE;
+import static javax.xml.catalog.CatalogFeatures.RESOLVE_STRICT;
import jdk.xml.internal.SecuritySupport;
/**
@@ -39,22 +46,25 @@ import jdk.xml.internal.SecuritySupport;
* @since 9
*/
class Util {
+
final static String URN = "urn:publicid:";
final static String PUBLICID_PREFIX = "-//";
final static String PUBLICID_PREFIX_ALT = "+//";
+ final static String SCHEME_FILE = "file";
+ final static String SCHEME_JAR = "jar";
+ final static String SCHEME_JARFILE = "jar:file:";
/**
* Finds an entry in the catalog that matches with the publicId or systemId.
*
- * The resolution follows the following rules determined by the prefer setting:
+ * The resolution follows the following rules determined by the prefer
+ * setting:
*
- * prefer "system": attempts to resolve with a system entry;
- * attempts to resolve with a public entry when only
- * publicId is specified.
+ * prefer "system": attempts to resolve with a system entry; attempts to
+ * resolve with a public entry when only publicId is specified.
*
- * prefer "public": attempts to resolve with a system entry;
- * attempts to resolve with a public entry if no matching
- * system entry is found.
+ * prefer "public": attempts to resolve with a system entry; attempts to
+ * resolve with a public entry if no matching system entry is found.
*
* If no match is found, continue searching uri entries
*
@@ -70,9 +80,9 @@ class Util {
catalog.reset();
if (systemId != null) {
/*
- If a system identifier is specified, it is used no matter how
- prefer is set.
- */
+ If a system identifier is specified, it is used no matter how
+ prefer is set.
+ */
resolvedSystemId = catalog.matchSystem(systemId);
}
@@ -91,7 +101,7 @@ class Util {
if (resolvedSystemId == null) {
Iterator iter = catalog.catalogs().iterator();
while (iter.hasNext()) {
- resolvedSystemId = resolve((CatalogImpl)iter.next(), publicId, systemId);
+ resolvedSystemId = resolve((CatalogImpl) iter.next(), publicId, systemId);
if (resolvedSystemId != null) {
break;
}
@@ -102,73 +112,112 @@ class Util {
return resolvedSystemId;
}
- /**
- * Resolves the specified file path to an absolute systemId. If it is
- * relative, it shall be resolved using the base or user.dir property if
- * base is not specified.
- *
- * @param file The specified file path
- * @param baseURI the base URI
- * @return The URI
- * @throws CatalogException if the specified file path can not be converted
- * to a system id
- */
- static URI verifyAndGetURI(String file, URL baseURI)
- throws MalformedURLException, URISyntaxException, IllegalArgumentException {
- URL filepath;
- URI temp;
- if (file != null && file.length() > 0) {
- File f = new File(file);
-
- if (baseURI != null && !f.isAbsolute()) {
- filepath = new URL(baseURI, fixSlashes(file));
- temp = filepath.toURI();
- } else {
- temp = resolveURI(file);
- }
- //Paths.get may throw IllegalArgumentException
- Path path = Paths.get(temp);
- if (path.toFile().isFile()) {
- return temp;
- }
+ static void validateUrisSyntax(URI... uris) {
+ for (URI uri : uris) {
+ validateUriSyntax(uri);
+ }
+ }
+
+ static void validateUrisSyntax(String... uris) {
+ for (String uri : uris) {
+ validateUriSyntax(URI.create(uri));
}
- return null;
}
/**
- * Resolves the specified uri. If the uri is relative, makes it absolute by
- * the user.dir directory.
+ * Validate that the URI must be absolute and a valid URL.
*
- * @param uri The specified URI.
- * @return The resolved URI
+ * Note that this method does not verify the existence of the resource. The
+ * Catalog standard requires that such resources be ignored.
+ *
+ * @param uri
+ * @throws IllegalArgumentException if the uri is not absolute and a valid
+ * URL
*/
- static URI resolveURI(String uri) throws MalformedURLException {
- if (uri == null) {
- uri = "";
+ static void validateUriSyntax(URI uri) {
+ CatalogMessages.reportNPEOnNull("URI input", uri);
+
+ if (!uri.isAbsolute()) {
+ CatalogMessages.reportIAE(CatalogMessages.ERR_URI_NOTABSOLUTE,
+ new Object[]{uri}, null);
}
- URI temp = null;
try {
- URL url = new URL(uri);
- temp = url.toURI();
- } catch (MalformedURLException | URISyntaxException mue) {
- File file = new File(uri);
- temp = file.toURI();
+ // check if the scheme was valid
+ uri.toURL();
+ } catch (MalformedURLException ex) {
+ CatalogMessages.reportIAE(CatalogMessages.ERR_URI_NOTVALIDURL,
+ new Object[]{uri}, null);
}
- return temp;
+ // verify the resource exists where possible
+ if (isFileUri(uri)) {
+ if (!isFileUriExist(uri, false)) {
+ CatalogMessages.reportIAE(CatalogMessages.ERR_URI_NOTVALIDURL,
+ new Object[]{uri}, null);
+ }
+ }
}
/**
- * Replace backslashes with forward slashes. (URLs always use forward
- * slashes.)
+ * Checks whether the URI is a file URI, including JAR file.
*
- * @param sysid The input system identifier.
- * @return The same system identifier with backslashes turned into forward
- * slashes.
+ * @param uri the specified URI.
+ * @return true if it is a file or JAR file URI, false otherwise
*/
- static String fixSlashes(String sysid) {
- return sysid.replace('\\', '/');
+ static boolean isFileUri(URI uri) {
+ if (SCHEME_FILE.equals(uri.getScheme())
+ || SCHEME_JAR.equals(uri.getScheme())) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Verifies whether the file resource exists.
+ *
+ * @param uri the URI to locate the resource
+ * @param openJarFile a flag to indicate whether a JAR file should be
+ * opened. This operation may be expensive.
+ * @return true if the resource exists, false otherwise.
+ */
+ static boolean isFileUriExist(URI uri, boolean openJarFile) {
+ if (uri != null && uri.isAbsolute()) {
+ if (null != uri.getScheme()) {
+ switch (uri.getScheme()) {
+ case SCHEME_FILE:
+ String path = uri.getPath();
+ File f1 = new File(path);
+ if (f1.isFile()) {
+ return true;
+ }
+ break;
+ case SCHEME_JAR:
+ String tempUri = uri.toString();
+ int pos = tempUri.indexOf("!");
+ if (pos < 0) {
+ return false;
+ }
+ if (openJarFile) {
+ String jarFile = tempUri.substring(SCHEME_JARFILE.length(), pos);
+ String entryName = tempUri.substring(pos + 2);
+ try {
+ JarFile jf = new JarFile(jarFile);
+ JarEntry je = jf.getJarEntry(entryName);
+ if (je != null) {
+ return true;
+ }
+ } catch (IOException ex) {
+ return false;
+ }
+ } else {
+ return true;
+ }
+ break;
+ }
+ }
+ }
+ return false;
}
/**
@@ -187,11 +236,12 @@ class Util {
}
/**
- * Checks whether the specified string is null or empty, returns the original
- * string with leading and trailing spaces removed if not.
+ * Checks whether the specified string is null or empty, returns the
+ * original string with leading and trailing spaces removed if not.
+ *
* @param test the string to be tested
- * @return the original string with leading and trailing spaces removed,
- * or null if it is null or empty
+ * @return the original string with leading and trailing spaces removed, or
+ * null if it is null or empty
*
*/
static String getNotNullOrEmpty(String test) {
@@ -206,4 +256,39 @@ class Util {
}
}
}
+
+ /**
+ * Validates the input for features.
+ *
+ * @param f the feature
+ * @param value the value
+ * @throws IllegalArgumentException if the value is invalid for the feature
+ */
+ static void validateFeatureInput(Feature f, String value) {
+ CatalogMessages.reportNPEOnNull(f.name(), value);
+ if (value.length() == 0) {
+ CatalogMessages.reportIAE(CatalogMessages.ERR_INVALID_ARGUMENT,
+ new Object[]{value, f.name()}, null);
+ }
+
+ if (f == Feature.PREFER) {
+ if (!value.equals(PREFER_SYSTEM) && !value.equals(PREFER_PUBLIC)) {
+ CatalogMessages.reportIAE(CatalogMessages.ERR_INVALID_ARGUMENT,
+ new Object[]{value, Feature.PREFER.name()}, null);
+ }
+ } else if (f == Feature.DEFER) {
+ if (!value.equals(DEFER_TRUE) && !value.equals(DEFER_FALSE)) {
+ CatalogMessages.reportIAE(CatalogMessages.ERR_INVALID_ARGUMENT,
+ new Object[]{value, Feature.DEFER.name()}, null);
+ }
+ } else if (f == Feature.RESOLVE) {
+ if (!value.equals(RESOLVE_STRICT) && !value.equals(RESOLVE_CONTINUE)
+ && !value.equals(RESOLVE_IGNORE)) {
+ CatalogMessages.reportIAE(CatalogMessages.ERR_INVALID_ARGUMENT,
+ new Object[]{value, Feature.RESOLVE.name()}, null);
+ }
+ } else if (f == Feature.FILES) {
+ Util.validateUrisSyntax(value.split(";"));
+ }
+ }
}
diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java b/jaxp/test/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java
index 47506989742..e81a84b020b 100644
--- a/jaxp/test/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java
+++ b/jaxp/test/javax/xml/jaxp/functional/catalog/SpecifyCatalogTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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
@@ -81,7 +81,7 @@ public class SpecifyCatalogTest {
@Test
public void specifyCatalogViaSysProps() {
setSystemProperty(FEATURE_FILES,
- getCatalogPath("specifyCatalog-sysProps.xml"));
+ getCatalogPath("specifyCatalog-sysProps.xml").toASCIIString());
checkResolutionOnEntityResolver(catalogResolver((String[]) null),
"http://local/base/dtd/docSysPropsSys.dtd");
@@ -107,6 +107,6 @@ public class SpecifyCatalogTest {
}
private static CatalogFeatures createFeature(String catalogName) {
- return builder().with(FILES, getCatalogPath(catalogName)).build();
+ return builder().with(FILES, getCatalogPath(catalogName).toASCIIString()).build();
}
}
diff --git a/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/dummy.xml b/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/dummy.xml
new file mode 100644
index 00000000000..f6fed01ba5a
--- /dev/null
+++ b/jaxp/test/javax/xml/jaxp/functional/catalog/catalogFiles/dummy.xml
@@ -0,0 +1 @@
+
diff --git a/jaxp/test/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java b/jaxp/test/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java
index 01d45ff591b..36f4e239fa8 100644
--- a/jaxp/test/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java
+++ b/jaxp/test/javax/xml/jaxp/libs/catalog/CatalogTestUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, 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,17 +25,16 @@ package catalog;
import java.io.File;
import java.io.IOException;
+import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-
import javax.xml.catalog.CatalogFeatures;
import javax.xml.catalog.CatalogManager;
import javax.xml.catalog.CatalogResolver;
-
import jaxp.library.JAXPTestUtilities;
/*
@@ -115,20 +114,20 @@ final class CatalogTestUtils {
}
// Gets the paths of the specified catalogs.
- private static String[] getCatalogPaths(String... catalogNames) {
+ private static URI[] getCatalogPaths(String... catalogNames) {
return catalogNames == null
? null
: Stream.of(catalogNames).map(
catalogName -> getCatalogPath(catalogName)).collect(
- Collectors.toList()).toArray(new String[0]);
+ Collectors.toList()).toArray(new URI[0]);
}
// Gets the paths of the specified catalogs.
- static String getCatalogPath(String catalogName) {
+ static URI getCatalogPath(String catalogName) {
return catalogName == null
? null
- : JAXPTestUtilities.getPathByClassName(CatalogTestUtils.class, "catalogFiles")
- + catalogName;
+ : Paths.get(JAXPTestUtilities.getPathByClassName(CatalogTestUtils.class, "catalogFiles")
+ + catalogName).toUri();
}
/* ********** jaxp.properties ********** */
diff --git a/jaxp/test/javax/xml/jaxp/libs/jaxp/library/JarUtils.java b/jaxp/test/javax/xml/jaxp/libs/jaxp/library/JarUtils.java
new file mode 100644
index 00000000000..bc579a352fe
--- /dev/null
+++ b/jaxp/test/javax/xml/jaxp/libs/jaxp/library/JarUtils.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2015, 2017, 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 jaxp.library;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * This class consists exclusively of static utility methods that are useful
+ * for creating and manipulating JAR files.
+ */
+
+public final class JarUtils {
+ private JarUtils() { }
+
+ /**
+ * Creates a JAR file.
+ *
+ * Equivalent to {@code jar cfm -C file...}
+ *
+ * The input files are resolved against the given directory. Any input
+ * files that are directories are processed recursively.
+ */
+ public static void createJarFile(Path jarfile, Manifest man, Path dir, Path... file)
+ throws IOException
+ {
+ // create the target directory
+ Path parent = jarfile.getParent();
+ if (parent != null)
+ Files.createDirectories(parent);
+
+ List entries = new ArrayList<>();
+ for (Path entry : file) {
+ Files.find(dir.resolve(entry), Integer.MAX_VALUE,
+ (p, attrs) -> attrs.isRegularFile())
+ .map(e -> dir.relativize(e))
+ .forEach(entries::add);
+ }
+
+ try (OutputStream out = Files.newOutputStream(jarfile);
+ JarOutputStream jos = new JarOutputStream(out))
+ {
+ if (man != null) {
+ JarEntry je = new JarEntry(JarFile.MANIFEST_NAME);
+ jos.putNextEntry(je);
+ man.write(jos);
+ jos.closeEntry();
+ }
+
+ for (Path entry : entries) {
+ String name = toJarEntryName(entry);
+ jos.putNextEntry(new JarEntry(name));
+ Files.copy(dir.resolve(entry), jos);
+ jos.closeEntry();
+ }
+ }
+ }
+
+ /**
+ * Creates a JAR file.
+ *
+ * Equivalent to {@code jar cf -C file...}
+ *
+ * The input files are resolved against the given directory. Any input
+ * files that are directories are processed recursively.
+ */
+ public static void createJarFile(Path jarfile, Path dir, Path... file)
+ throws IOException
+ {
+ createJarFile(jarfile, null, dir, file);
+ }
+
+ /**
+ * Creates a JAR file.
+ *
+ * Equivalent to {@code jar cf -C file...}
+ *
+ * The input files are resolved against the given directory. Any input
+ * files that are directories are processed recursively.
+ */
+ public static void createJarFile(Path jarfile, Path dir, String... input)
+ throws IOException
+ {
+ Path[] paths = Stream.of(input).map(Paths::get).toArray(Path[]::new);
+ createJarFile(jarfile, dir, paths);
+ }
+
+ /**
+ * Creates a JAR file from the contents of a directory.
+ *
+ * Equivalent to {@code jar cf -C .}
+ */
+ public static void createJarFile(Path jarfile, Path dir) throws IOException {
+ createJarFile(jarfile, dir, Paths.get("."));
+ }
+
+ /**
+ * Map a file path to the equivalent name in a JAR file
+ */
+ private static String toJarEntryName(Path file) {
+ Path normalized = file.normalize();
+ return normalized.subpath(0, normalized.getNameCount()) // drop root
+ .toString()
+ .replace(File.separatorChar, '/');
+ }
+}
diff --git a/jaxp/test/javax/xml/jaxp/libs/jaxp/library/SimpleHttpServer.java b/jaxp/test/javax/xml/jaxp/libs/jaxp/library/SimpleHttpServer.java
new file mode 100644
index 00000000000..290697d81c9
--- /dev/null
+++ b/jaxp/test/javax/xml/jaxp/libs/jaxp/library/SimpleHttpServer.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (c) 2017, 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 jaxp.library;
+
+import com.sun.net.httpserver.Headers;
+import com.sun.net.httpserver.HttpContext;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import com.sun.net.httpserver.HttpServer;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.net.URI;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * A simple HTTP Server
+ */
+public class SimpleHttpServer {
+ HttpServer _httpserver;
+ ExecutorService _executor;
+
+ String _address;
+
+ String _context, _docroot;
+ int _port;
+
+ public SimpleHttpServer(String context, String docroot) {
+ //let the system pick up an ephemeral port in a bind operation
+ this(0, context, docroot);
+ }
+
+ public SimpleHttpServer(int port, String context, String docroot) {
+ _port = port;
+ _context = context;
+ _docroot = docroot;
+ }
+
+ public void start() {
+ MyHttpHandler handler = new MyHttpHandler(_docroot);
+ InetSocketAddress addr = new InetSocketAddress(_port);
+ try {
+ _httpserver = HttpServer.create(addr, 0);
+ } catch (IOException ex) {
+ throw new RuntimeException("cannot create httpserver", ex);
+ }
+
+ //TestHandler is mapped to /test
+ HttpContext ctx = _httpserver.createContext(_context, handler);
+
+ _executor = Executors.newCachedThreadPool();
+ _httpserver.setExecutor(_executor);
+ _httpserver.start();
+
+ _address = "http://localhost:" + _httpserver.getAddress().getPort();
+ }
+
+ public void stop() {
+ _httpserver.stop(2);
+ _executor.shutdown();
+ }
+
+ public String getAddress() {
+ return _address;
+ }
+
+ static class MyHttpHandler implements HttpHandler {
+
+ String _docroot;
+
+ public MyHttpHandler(String docroot) {
+ _docroot = docroot;
+ }
+
+ public void handle(HttpExchange t)
+ throws IOException {
+ InputStream is = t.getRequestBody();
+ Headers map = t.getRequestHeaders();
+ Headers rmap = t.getResponseHeaders();
+ OutputStream os = t.getResponseBody();
+ URI uri = t.getRequestURI();
+ String path = uri.getPath();
+
+
+ while (is.read() != -1) ;
+ is.close();
+
+ File f = new File(_docroot, path);
+ if (!f.exists()) {
+ notfound(t, path);
+ return;
+ }
+
+ String method = t.getRequestMethod();
+ if (method.equals("HEAD")) {
+ rmap.set("Content-Length", Long.toString(f.length()));
+ t.sendResponseHeaders(200, -1);
+ t.close();
+ } else if (!method.equals("GET")) {
+ t.sendResponseHeaders(405, -1);
+ t.close();
+ return;
+ }
+
+ if (path.endsWith(".html") || path.endsWith(".htm")) {
+ rmap.set("Content-Type", "text/html");
+ } else {
+ rmap.set("Content-Type", "text/plain");
+ }
+
+ t.sendResponseHeaders (200, f.length());
+
+ FileInputStream fis = new FileInputStream(f);
+ int count = 0;
+ try {
+ byte[] buf = new byte[16 * 1024];
+ int len;
+ while ((len = fis.read(buf)) != -1) {
+ os.write(buf, 0, len);
+ count += len;
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ fis.close();
+ os.close();
+ }
+
+ void moved(HttpExchange t) throws IOException {
+ Headers req = t.getRequestHeaders();
+ Headers map = t.getResponseHeaders();
+ URI uri = t.getRequestURI();
+ String host = req.getFirst("Host");
+ String location = "http://" + host + uri.getPath() + "/";
+ map.set("Content-Type", "text/html");
+ map.set("Location", location);
+ t.sendResponseHeaders(301, -1);
+ t.close();
+ }
+
+ void notfound(HttpExchange t, String p) throws IOException {
+ t.getResponseHeaders().set("Content-Type", "text/html");
+ t.sendResponseHeaders(404, 0);
+ OutputStream os = t.getResponseBody();
+ String s = "
File not found
";
+ s = s + p + "
";
+ os.write(s.getBytes());
+ os.close();
+ t.close();
+ }
+ }
+
+}
diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogAccessTest.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogAccessTest.java
new file mode 100644
index 00000000000..d2e7edee6f0
--- /dev/null
+++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogAccessTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2017, 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 catalog;
+
+import java.net.URI;
+import javax.xml.catalog.CatalogFeatures;
+import javax.xml.catalog.CatalogManager;
+import javax.xml.catalog.CatalogResolver;
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Listeners;
+import org.testng.annotations.Test;
+import org.xml.sax.InputSource;
+import static jaxp.library.JAXPTestUtilities.tryRunWithAllPerm;
+
+/*
+ * @test
+ * @bug 8171243
+ * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
+ * @run testng/othervm -DrunSecMngr=true catalog.CatalogAccessTest
+ * @summary the Catalog API grants no privilege to external resources. This test
+ * verifies that SecurityException will be thrown if access to resources is denied
+ * by the security manager.
+ */
+@Listeners({jaxp.library.BasePolicy.class})
+public class CatalogAccessTest {
+ static final CatalogFeatures FEATURES = CatalogFeatures.builder().
+ with(CatalogFeatures.Feature.PREFER, "system").build();
+
+ /*
+ * Verifies that the SecurityException is thrown if access to the resource is
+ * denied by the security manager.
+ */
+ @Test(dataProvider = "accessTest", expectedExceptions = SecurityException.class)
+ public void testSecurity(String cfile, String sysId, String pubId) throws Exception {
+ CatalogResolver cr = CatalogManager.catalogResolver(FEATURES, URI.create(cfile));
+ InputSource is = cr.resolveEntity(pubId, sysId);
+ Assert.fail("Failed to throw SecurityException");
+ }
+
+ /*
+ DataProvider: used for SecurityException testing
+ Data columns:
+ catalog uri, systemId, publicId
+ */
+ @DataProvider(name = "accessTest")
+ Object[][] getDataForAccessTest() throws Exception {
+ String systemId = "http://www.sys00test.com/rewrite.dtd";
+ String publicId = "PUB-404";
+ String urlFile = tryRunWithAllPerm(() ->
+ getClass().getResource("rewriteSystem_id.xml").toExternalForm());
+ return new Object[][]{
+ {urlFile, systemId, publicId}
+ };
+ }
+}
diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogFileInputTest.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogFileInputTest.java
new file mode 100644
index 00000000000..44d52295bd7
--- /dev/null
+++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogFileInputTest.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (c) 2017, 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 catalog;
+
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import static java.nio.file.StandardOpenOption.APPEND;
+import static java.nio.file.StandardOpenOption.CREATE;
+import javax.xml.catalog.Catalog;
+import javax.xml.catalog.CatalogException;
+import javax.xml.catalog.CatalogFeatures;
+import javax.xml.catalog.CatalogManager;
+import javax.xml.catalog.CatalogResolver;
+import static jaxp.library.JAXPTestUtilities.getSystemProperty;
+import jaxp.library.JarUtils;
+import jaxp.library.SimpleHttpServer;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Listeners;
+import org.testng.annotations.Test;
+import org.xml.sax.InputSource;
+
+/*
+ * @test
+ * @bug 8151154 8171243
+ * @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
+ * @run testng/othervm catalog.CatalogFileInputTest
+ * @summary Verifies that the Catalog API accepts valid URIs only;
+ Verifies that the CatalogFeatures' builder throws
+ * IllegalArgumentException on invalid file inputs.
+ * This test was splitted from CatalogTest.java due to
+ * JDK-8168968, it has to only run without SecurityManager
+ * because an ACE will be thrown for invalid path.
+ */
+@Listeners({jaxp.library.FilePolicy.class, jaxp.library.NetAccessPolicy.class})
+public class CatalogFileInputTest extends CatalogSupportBase {
+
+ static final CatalogFeatures FEATURES = CatalogFeatures.builder().
+ with(CatalogFeatures.Feature.PREFER, "system").build();
+ static String USER_DIR = getSystemProperty("user.dir");
+ static String CLS_DIR = getSystemProperty("test.classes");
+ static String SRC_DIR = System.getProperty("test.src");
+ static String JAR_CONTENT = "META-INF";
+ final static String SCHEME_JARFILE = "jar:";
+ static final String REMOTE_FILE_LOCATION = "/jar/META-INF";
+ static final String DOCROOT = SRC_DIR;
+ static final String TESTCONTEXT = REMOTE_FILE_LOCATION; //mapped to local file path
+ SimpleHttpServer _httpserver;
+ String _remoteFilePath;
+
+ /*
+ * Initializing fields
+ */
+ @BeforeClass
+ public void setUpClass() throws Exception {
+ super.setUp();
+
+ // set up HttpServer
+ _httpserver = new SimpleHttpServer(TESTCONTEXT, DOCROOT);
+ _httpserver.start();
+ _remoteFilePath = _httpserver.getAddress() + REMOTE_FILE_LOCATION;
+
+ }
+
+ @AfterClass
+ protected void tearDown() throws Exception {
+ if (_httpserver != null) {
+ _httpserver.stop();
+ }
+ }
+
+ /*
+ * Verifies that the Catalog can be created with file system paths including JAR
+ * and http URL, and used to resolve a systemId as expected.
+ */
+ @Test(dataProvider = "acceptedURI")
+ public void testMatch(String uri, String sysId, String pubId,
+ String expectedId, String msg) throws Exception {
+ CatalogResolver cr = CatalogManager.catalogResolver(FEATURES, URI.create(uri));
+ InputSource is = cr.resolveEntity(pubId, sysId);
+ Assert.assertNotNull(is, msg);
+ Assert.assertEquals(expectedId, is.getSystemId(), msg);
+ }
+
+ @Test(dataProvider = "invalidCatalog")
+ public void testEmptyCatalog(String uri, String publicId, String msg) {
+ Catalog c = CatalogManager.catalog(FEATURES, uri != null? URI.create(uri) : null);
+ Assert.assertNull(c.matchSystem(publicId), msg);
+ }
+
+ @Test(dataProvider = "invalidCatalog", expectedExceptions = CatalogException.class)
+ public void testCatalogResolverWEmptyCatalog(String uri, String publicId, String msg) {
+ CatalogResolver cr = CatalogManager.catalogResolver(
+ CatalogFeatures.builder().with(CatalogFeatures.Feature.RESOLVE, "strict").build(),
+ uri != null? URI.create(uri) : null);
+ InputSource is = cr.resolveEntity(publicId, "");
+ }
+
+ @Test(dataProvider = "invalidCatalog")
+ public void testCatalogResolverWEmptyCatalog1(String uri, String publicId, String msg) {
+ CatalogResolver cr = CatalogManager.catalogResolver(
+ CatalogFeatures.builder().with(CatalogFeatures.Feature.RESOLVE, "continue").build(),
+ uri != null? URI.create(uri) : null);
+ Assert.assertNull(cr.resolveEntity(publicId, ""), msg);
+ }
+
+ @Test(dataProvider = "invalidInput", expectedExceptions = IllegalArgumentException.class)
+ public void testFileInput(String file) {
+ CatalogFeatures features = CatalogFeatures.builder()
+ .with(CatalogFeatures.Feature.FILES, file)
+ .build();
+ }
+
+ @Test(dataProvider = "invalidInput", expectedExceptions = IllegalArgumentException.class)
+ public void testInvalidUri(String file) {
+ CatalogResolver cr = CatalogManager.catalogResolver(FEATURES, file != null? URI.create(file) : null);
+ }
+
+ @Test(dataProvider = "invalidInput", expectedExceptions = IllegalArgumentException.class)
+ public void testInvalidUri1(String file) {
+ Catalog c = CatalogManager.catalog(FEATURES, file != null? URI.create(file) : null);
+ System.err.println("Catalog =" + c);
+ }
+
+
+ @Test(expectedExceptions = NullPointerException.class)
+ public void testNullFileInput() {
+ CatalogFeatures features = CatalogFeatures.builder()
+ .with(CatalogFeatures.Feature.FILES, null)
+ .build();
+ }
+
+ @Test(expectedExceptions = NullPointerException.class)
+ public void testNullUri() {
+ URI uri = null;
+ CatalogResolver cr = CatalogManager.catalogResolver(FEATURES, uri);
+ }
+
+ @Test(expectedExceptions = NullPointerException.class)
+ public void testNullUri1() {
+ URI uri = null;
+ Catalog c = CatalogManager.catalog(FEATURES, uri);
+ }
+
+ String systemId = "http://www.sys00test.com/rewrite.dtd";
+ String publicId = "PUB-404";
+ String expected = "http://www.groupxmlbase.com/dtds/rewrite.dtd";
+ String errMsg = "Relative rewriteSystem with xml:base at group level failed";
+
+ /*
+ DataProvider: used to verify CatalogResolver's resolveEntity function.
+ Data columns:
+ catalog, systemId, publicId, expectedUri, msg
+ */
+ @DataProvider(name = "acceptedURI")
+ Object[][] getData() throws Exception {
+ String filename = "rewriteSystem_id.xml";
+ String urlFile = getClass().getResource(filename).toExternalForm();
+ String urlHttp = _remoteFilePath + "/jax-ws-catalog.xml";
+ String remoteXSD = _remoteFilePath + "/catalog/ws-addr.xsd";
+ File file = new File(CLS_DIR + "/JDK8171243.jar!/META-INF/jax-ws-catalog.xml");
+ String jarPath = SCHEME_JARFILE + file.toURI().toString();
+ String xsd = jarPath.substring(0, jarPath.lastIndexOf("/")) + "/catalog/ws-addr.xsd";
+
+ // create JAR file
+ try {
+ JarUtils.createJarFile(Paths.get(CLS_DIR + "/JDK8171243.jar"),
+ Paths.get(SRC_DIR + "/jar"), JAR_CONTENT);
+ } catch (IOException ex) {
+ Assert.fail("Failed to create JAR: " + ex.getMessage());
+ }
+
+ return new Object[][]{
+ // URL
+ {urlFile, systemId, publicId, expected, errMsg},
+ {urlHttp, "http://www.w3.org/2006/03/addressing/ws-addr.xsd", "", remoteXSD, "http test failed."},
+ // JAR file
+ {jarPath, "http://www.w3.org/2006/03/addressing/ws-addr.xsd", "", xsd, "jar file test failed."},
+ };
+ }
+
+ /*
+ * DataProvider: invalid catalog result in empty catalog
+ * Note: the difference from invalidInput is that invalidInput is syntactically
+ * rejected with an IAE.
+ */
+ @DataProvider(name = "invalidCatalog")
+ public Object[][] getInvalidCatalog() throws Exception {
+ String catalogUri = getClass().getResource("catalog_invalid.xml").toExternalForm();
+ return new Object[][]{
+ {catalogUri, "-//W3C//DTD XHTML 1.0 Strict//EN",
+ "The catalog is invalid, attempting to match the public entry shall return null."}
+ };
+ }
+
+ /*
+ * DataProvider: a list of invalid inputs, expects IAE
+ * Note: exclude null since NPE would have been expected
+ */
+ @DataProvider(name = "invalidInput")
+ public Object[][] getFiles() throws Exception {
+ String filename = "rewriteSystem_id.xml";
+ copyFile(Paths.get(SRC_DIR + "/" + filename), Paths.get(filename));
+ String absolutePath = getClass().getResource(filename).getFile();
+
+ return new Object[][]{
+ {""},
+ {"file:a/b\\c"},
+ {"file:/../../.."},
+ {"c:/te:t"},
+ {"c:/te?t"},
+ {"c/te*t"},
+ {"in|valid.txt"},
+ {"shema:invalid.txt"},
+ // relative file path
+ {filename},
+ // absolute file path
+ {absolutePath}
+ };
+ }
+
+ /*
+ DataProvider: a list of invalid inputs
+ */
+ @DataProvider(name = "nullTest")
+ public Object[][] getNull() throws Exception {
+
+ return new Object[][]{
+ {null},
+ };
+ }
+
+ void copyFile(Path src, Path target) throws Exception {
+
+ try (InputStream in = Files.newInputStream(src);
+ BufferedReader reader
+ = new BufferedReader(new InputStreamReader(in));
+ OutputStream out = new BufferedOutputStream(
+ Files.newOutputStream(target, CREATE, APPEND));
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out))) {
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ bw.write(line);
+ }
+ } catch (IOException x) {
+ throw new Exception(x.getMessage());
+ }
+ }
+}
diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogInvalidPathTest.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogInvalidPathTest.java
deleted file mode 100644
index e8da1d0c3f4..00000000000
--- a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogInvalidPathTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2016, 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 catalog;
-
-import javax.xml.catalog.CatalogFeatures;
-
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-/*
- * @test
- * @bug 8151154
- * @run testng/othervm catalog.CatalogInvalidPathTest
- * @summary Verifies that the CatalogFeatures' builder throws
- * IllegalArgumentException on invalid file inputs.
- * This test was splitted from CatalogTest.java due to
- * JDK-8168968, it has to only run without SecurityManager
- * because an ACE will be thrown for invalid path.
- */
-public class CatalogInvalidPathTest {
- /*
- DataProvider: for testing the verification of file paths by
- the CatalogFeatures builder
- */
- @DataProvider(name = "invalidPaths")
- public Object[][] getFiles() {
- return new Object[][]{
- {null},
- {""},
- {"file:a/b\\c"},
- {"file:/../../.."},
- {"c:/te:t"},
- {"c:/te?t"},
- {"c/te*t"},
- {"in|valid.txt"},
- {"shema:invalid.txt"},
- };
- }
-
- @Test(dataProvider = "invalidPaths", expectedExceptions = IllegalArgumentException.class)
- public void testFileInput(String file) {
- CatalogFeatures features = CatalogFeatures.builder()
- .with(CatalogFeatures.Feature.FILES, file)
- .build();
- }
-}
diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupportBase.java b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupportBase.java
index 236e5cda0dc..0f603014c88 100644
--- a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupportBase.java
+++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogSupportBase.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -35,6 +35,13 @@ import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
+import java.nio.file.Paths;
+import java.security.CodeSource;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.Permissions;
+import java.security.Policy;
+import java.security.ProtectionDomain;
import javax.xml.XMLConstants;
import javax.xml.catalog.CatalogFeatures;
import javax.xml.catalog.CatalogResolver;
@@ -133,8 +140,8 @@ public class CatalogSupportBase {
dtd_system = filepath + "system.dtd";
dtd_systemResolved = "";
- xml_catalog = filepath + "CatalogSupport.xml";
- xml_bogus_catalog = filepath + "CatalogSupport_bogus.xml";
+ xml_catalog = Paths.get(filepath + "CatalogSupport.xml").toUri().toASCIIString();
+ xml_bogus_catalog = Paths.get(filepath + "CatalogSupport_bogus.xml").toUri().toASCIIString();
xml_xInclude = "\n" +
" 0) {
result = c.matchPublic(publicId);
@@ -430,8 +434,9 @@ public class CatalogTest extends CatalogSupportBase {
* system entry is found.
*/
@Test(dataProvider = "resolveWithPrefer")
- public void resolveWithPrefer(String prefer, String cfile, String publicId, String systemId, String expected) {
- String catalogFile = getClass().getResource(cfile).getFile();
+ public void resolveWithPrefer(String prefer, String cfile, String publicId,
+ String systemId, String expected) throws Exception {
+ URI catalogFile = getClass().getResource(cfile).toURI();
CatalogFeatures f = CatalogFeatures.builder().with(CatalogFeatures.Feature.PREFER, prefer).with(CatalogFeatures.Feature.RESOLVE, "ignore").build();
CatalogResolver catalogResolver = CatalogManager.catalogResolver(f, catalogFile);
String result = catalogResolver.resolveEntity(publicId, systemId).getSystemId();
@@ -445,8 +450,8 @@ public class CatalogTest extends CatalogSupportBase {
* be loaded is determined by the defer attribute.
*/
@Test(dataProvider = "invalidAltCatalogs", expectedExceptions = CatalogException.class)
- public void testDeferAltCatalogs(String file) {
- String catalogFile = getClass().getResource(file).getFile();
+ public void testDeferAltCatalogs(String file) throws Exception {
+ URI catalogFile = getClass().getResource(file).toURI();
CatalogFeatures features = CatalogFeatures.builder().with(CatalogFeatures.Feature.DEFER, "true").build();
/*
Since the defer attribute is set to false in the specified catalog file,
@@ -462,8 +467,8 @@ public class CatalogTest extends CatalogSupportBase {
* PREFER from Features API taking precedence over catalog file
*/
@Test
- public void testJDK8146237() {
- String catalogFile = getClass().getResource("JDK8146237_catalog.xml").getFile();
+ public void testJDK8146237() throws Exception {
+ URI catalogFile = getClass().getResource("JDK8146237_catalog.xml").toURI();
try {
CatalogFeatures features = CatalogFeatures.builder().with(CatalogFeatures.Feature.PREFER, "system").build();
@@ -482,8 +487,8 @@ public class CatalogTest extends CatalogSupportBase {
Verifies that the resulting systemId does not contain duplicate slashes
*/
@Test
- public void testRewriteSystem() {
- String catalog = getClass().getResource("rewriteCatalog.xml").getFile();
+ public void testRewriteSystem() throws Exception {
+ URI catalog = getClass().getResource("rewriteCatalog.xml").toURI();
try {
CatalogResolver resolver = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalog);
@@ -500,8 +505,8 @@ public class CatalogTest extends CatalogSupportBase {
Verifies that the resulting systemId does not contain duplicate slashes
*/
@Test
- public void testRewriteUri() {
- String catalog = getClass().getResource("rewriteCatalog.xml").getFile();
+ public void testRewriteUri() throws Exception {
+ URI catalog = getClass().getResource("rewriteCatalog.xml").toURI();
try {
@@ -519,18 +524,18 @@ public class CatalogTest extends CatalogSupportBase {
*/
@Test(expectedExceptions = NullPointerException.class)
public void testFeatureNull() {
- CatalogResolver resolver = CatalogManager.catalogResolver(null, "");
+ CatalogResolver resolver = CatalogManager.catalogResolver(null, null);
}
/*
@bug 8144966
- Verifies that passing null as the path will result in a NPE.
+ Verifies that passing null as the URI will result in a NPE.
*/
@Test(expectedExceptions = NullPointerException.class)
public void testPathNull() {
- String path = null;
- CatalogResolver resolver = CatalogManager.catalogResolver(CatalogFeatures.defaults(), path);
+ URI uri = null;
+ CatalogResolver resolver = CatalogManager.catalogResolver(CatalogFeatures.defaults(), uri);
}
/*
@@ -540,10 +545,11 @@ public class CatalogTest extends CatalogSupportBase {
that matches the expected value.
*/
@Test(dataProvider = "catalog")
- public void testCatalogResolver(String test, String expected, String catalogFile, String xml, SAXParser saxParser) {
- String catalog = null;
+ public void testCatalogResolver(String test, String expected, String catalogFile,
+ String xml, SAXParser saxParser) throws Exception {
+ URI catalog = null;
if (catalogFile != null) {
- catalog = getClass().getResource(catalogFile).getFile();
+ catalog = getClass().getResource(catalogFile).toURI();
}
String url = getClass().getResource(xml).getFile();
try {
@@ -565,8 +571,8 @@ public class CatalogTest extends CatalogSupportBase {
catalog is provided, the resolver will throw an exception by default.
*/
@Test
- public void testInvalidCatalog() {
- String catalog = getClass().getResource("catalog_invalid.xml").getFile();
+ public void testInvalidCatalog() throws Exception {
+ URI catalog = getClass().getResource("catalog_invalid.xml").toURI();
String test = "testInvalidCatalog";
try {
@@ -590,7 +596,7 @@ public class CatalogTest extends CatalogSupportBase {
*/
@Test
public void testIgnoreInvalidCatalog() {
- String catalog = getClass().getResource("catalog_invalid.xml").getFile();
+ String catalog = getClass().getResource("catalog_invalid.xml").toExternalForm();
CatalogFeatures f = CatalogFeatures.builder()
.with(Feature.FILES, catalog)
.with(Feature.PREFER, "public")
@@ -600,7 +606,7 @@ public class CatalogTest extends CatalogSupportBase {
String test = "testInvalidCatalog";
try {
- CatalogResolver resolver = CatalogManager.catalogResolver(f, "");
+ CatalogResolver resolver = CatalogManager.catalogResolver(f);
String actualSystemId = resolver.resolveEntity(null, "http://remote/xml/dtd/sys/alice/docAlice.dtd").getSystemId();
System.out.println("testIgnoreInvalidCatalog: expected [null]");
System.out.println("testIgnoreInvalidCatalog: expected [null]");
diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/jar/META-INF/MANIFEST.MF b/jaxp/test/javax/xml/jaxp/unittest/catalog/jar/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..81f87a7e492
--- /dev/null
+++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/jar/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Created-By: 9-ea (Oracle Corporation)
+
diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/jar/META-INF/catalog/ws-addr.xsd b/jaxp/test/javax/xml/jaxp/unittest/catalog/jar/META-INF/catalog/ws-addr.xsd
new file mode 100644
index 00000000000..47362edbe22
--- /dev/null
+++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/jar/META-INF/catalog/ws-addr.xsd
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jaxp/test/javax/xml/jaxp/unittest/catalog/jar/META-INF/jax-ws-catalog.xml b/jaxp/test/javax/xml/jaxp/unittest/catalog/jar/META-INF/jax-ws-catalog.xml
new file mode 100644
index 00000000000..9de01d468e8
--- /dev/null
+++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/jar/META-INF/jax-ws-catalog.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/jaxp/test/javax/xml/jaxp/unittest/transform/TransformerTest.java b/jaxp/test/javax/xml/jaxp/unittest/transform/TransformerTest.java
index 1ae853d81e0..7b67f09760c 100644
--- a/jaxp/test/javax/xml/jaxp/unittest/transform/TransformerTest.java
+++ b/jaxp/test/javax/xml/jaxp/unittest/transform/TransformerTest.java
@@ -37,6 +37,7 @@ import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
@@ -74,11 +75,30 @@ import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
* @run testng/othervm -DrunSecMngr=true transform.TransformerTest
* @run testng/othervm transform.TransformerTest
* @summary Transformer Tests
- * @bug 6272879 6305029 6505031 8150704 8162598 8169112 8169772
+ * @bug 6272879 6305029 6505031 8150704 8162598 8169112 8169631 8169772
*/
@Listeners({jaxp.library.FilePolicy.class})
public class TransformerTest {
+ // some global constants
+ private static final String LINE_SEPARATOR =
+ getSystemProperty("line.separator");
+
+ private static final String NAMESPACES =
+ "http://xml.org/sax/features/namespaces";
+
+ private static final String NAMESPACE_PREFIXES =
+ "http://xml.org/sax/features/namespace-prefixes";
+
+ private static abstract class TestTemplate {
+ protected void printSnippet(String title, String snippet) {
+ StringBuilder div = new StringBuilder();
+ for (int i = 0; i < title.length(); i++)
+ div.append("=");
+ System.out.println(title + "\n" + div + "\n" + snippet + "\n");
+ }
+ }
+
/**
* Reads the contents of the given file into a string.
* WARNING: this method adds a final line feed even if the last line of the file doesn't contain one.
@@ -101,44 +121,7 @@ public class TransformerTest {
}
}
- /**
- * Utility method for testBug8162598().
- * Provides a convenient way to check/assert the expected namespaces
- * of a Node and its siblings.
- *
- * @param test
- * The node to check
- * @param nstest
- * Expected namespace of the node
- * @param nsb
- * Expected namespace of the first sibling
- * @param nsc
- * Expected namespace of the first sibling of the first sibling
- */
- private void checkNodeNS8162598(Node test, String nstest, String nsb, String nsc) {
- String testNodeName = test.getNodeName();
- if (nstest == null) {
- Assert.assertNull(test.getNamespaceURI(), "unexpected namespace for " + testNodeName);
- } else {
- Assert.assertEquals(test.getNamespaceURI(), nstest, "unexpected namespace for " + testNodeName);
- }
- Node b = test.getChildNodes().item(0);
- if (nsb == null) {
- Assert.assertNull(b.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b");
- } else {
- Assert.assertEquals(b.getNamespaceURI(), nsb, "unexpected namespace for " + testNodeName + "->b");
- }
- Node c = b.getChildNodes().item(0);
- if (nsc == null) {
- Assert.assertNull(c.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b->c");
- } else {
- Assert.assertEquals(c.getNamespaceURI(), nsc, "unexpected namespace for " + testNodeName + "->b->c");
- }
- }
-
private class XMLReaderFor6305029 implements XMLReader {
- private static final String NAMESPACES = "http://xml.org/sax/features/namespaces";
- private static final String NAMESPACE_PREFIXES = "http://xml.org/sax/features/namespace-prefixes";
private boolean namespaces = true;
private boolean namespacePrefixes = false;
private EntityResolver resolver;
@@ -235,8 +218,6 @@ public class TransformerTest {
*/
@Test
public final void testBug6272879() throws IOException, TransformerException {
- final String LINE_SEPARATOR = getSystemProperty("line.separator");
-
final String xsl =
"" + LINE_SEPARATOR +
"" + LINE_SEPARATOR +
@@ -349,9 +330,125 @@ public class TransformerTest {
Assert.assertTrue(s.contains("map1key1value") && s.contains("map2key1value"));
}
+ private static class Test8169631 extends TestTemplate {
+ private final static String xsl =
+ "" + LINE_SEPARATOR +
+ "" + LINE_SEPARATOR +
+ " " + LINE_SEPARATOR +
+ " " + LINE_SEPARATOR +
+ " " + LINE_SEPARATOR +
+ " " + LINE_SEPARATOR +
+ " " + LINE_SEPARATOR +
+ " " + LINE_SEPARATOR +
+ "" + LINE_SEPARATOR;
+
+ private final static String sourceXml =
+ "" + LINE_SEPARATOR +
+ "" + LINE_SEPARATOR +
+ " 1" + LINE_SEPARATOR +
+ " 2" + LINE_SEPARATOR +
+ " 3" + LINE_SEPARATOR +
+ "" + LINE_SEPARATOR;
+
+ /**
+ * Utility method to print out transformation result and check values.
+ *
+ * @param type
+ * Text describing type of transformation
+ * @param result
+ * Resulting output of transformation
+ * @param elementCount
+ * Counter of elements to check
+ * @param attribCount
+ * Counter of attributes to check
+ */
+ private void verifyResult(String type, String result, int elementCount,
+ int attribCount)
+ {
+ printSnippet("Result of transformation from " + type + ":",
+ result);
+ Assert.assertEquals(
+ result.contains("" + elementCount + ""),
+ true, "Result of transformation from " + type +
+ " should have count of " + elementCount + " elements.");
+ Assert.assertEquals(
+ result.contains("" + attribCount +
+ ""), true, "Result of transformation from " +
+ type + " should have count of "+ attribCount + " attributes.");
+ }
+
+ public void run() throws IOException, TransformerException,
+ SAXException, ParserConfigurationException
+ {
+ printSnippet("Source:", sourceXml);
+
+ printSnippet("Stylesheet:", xsl);
+
+ // create default transformer (namespace aware)
+ TransformerFactory tf1 = TransformerFactory.newInstance();
+ ByteArrayInputStream bais = new ByteArrayInputStream(xsl.getBytes());
+ Transformer t1 = tf1.newTransformer(new StreamSource(bais));
+
+ // test transformation from stream source with namespace support
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ bais = new ByteArrayInputStream(sourceXml.getBytes());
+ t1.transform(new StreamSource(bais), new StreamResult(baos));
+ verifyResult("StreamSource with namespace support", baos.toString(), 0, 1);
+
+ // test transformation from DOM source with namespace support
+ bais.reset();
+ baos.reset();
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ Document doc = dbf.newDocumentBuilder().parse(new InputSource(bais));
+ t1.transform(new DOMSource(doc), new StreamResult(baos));
+ verifyResult("DOMSource with namespace support", baos.toString(), 0, 1);
+
+ // test transformation from DOM source without namespace support
+ bais.reset();
+ baos.reset();
+ dbf.setNamespaceAware(false);
+ doc = dbf.newDocumentBuilder().parse(new InputSource(bais));
+ t1.transform(new DOMSource(doc), new StreamResult(baos));
+ verifyResult("DOMSource without namespace support", baos.toString(), 3, 3);
+
+ // test transformation from SAX source with namespace support
+ bais.reset();
+ baos.reset();
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlr = spf.newSAXParser().getXMLReader();
+ SAXSource saxS = new SAXSource(xmlr, new InputSource(bais));
+ t1.transform(saxS, new StreamResult(baos));
+ verifyResult("SAXSource with namespace support", baos.toString(), 0, 1);
+
+ // test transformation from SAX source without namespace support
+ bais.reset();
+ baos.reset();
+ spf.setNamespaceAware(false);
+ xmlr = spf.newSAXParser().getXMLReader();
+ saxS = new SAXSource(xmlr, new InputSource(bais));
+ t1.transform(saxS, new StreamResult(baos));
+ verifyResult("SAXSource without namespace support", baos.toString(), 3, 3);
+ }
+ }
+
+ /*
+ * @bug 8169631
+ * @summary Test combinations of namespace awareness settings on
+ * XSL transformations
+ */
+ @Test
+ public final void testBug8169631() throws IOException, SAXException,
+ TransformerException, ParserConfigurationException
+ {
+ new Test8169631().run();
+ }
+
/*
* @bug 8150704
- * @summary Test that XSL transformation with lots of temporary result trees will not run out of DTM IDs.
+ * @summary Test that XSL transformation with lots of temporary result
+ * trees will not run out of DTM IDs.
*/
@Test
public final void testBug8150704() throws TransformerException, IOException {
@@ -375,16 +472,8 @@ public class TransformerTest {
System.out.println("Passed.");
}
- /*
- * @bug 8162598
- * @summary Test XSLTC handling of namespaces, especially empty namespace definitions to reset the
- * default namespace
- */
- @Test
- public final void testBug8162598() throws IOException, TransformerException {
- final String LINE_SEPARATOR = getSystemProperty("line.separator");
-
- final String xsl =
+ private static class Test8162598 extends TestTemplate {
+ private static final String xsl =
"" + LINE_SEPARATOR +
"" + LINE_SEPARATOR +
" " + LINE_SEPARATOR +
@@ -402,39 +491,85 @@ public class TransformerTest {
" " + LINE_SEPARATOR +
"";
+ private static final String sourceXml =
+ "" + LINE_SEPARATOR;
+ /**
+ * Utility method for testBug8162598().
+ * Provides a convenient way to check/assert the expected namespaces
+ * of a Node and its siblings.
+ *
+ * @param test
+ * The node to check
+ * @param nstest
+ * Expected namespace of the node
+ * @param nsb
+ * Expected namespace of the first sibling
+ * @param nsc
+ * Expected namespace of the first sibling of the first sibling
+ */
- final String sourceXml =
- "" + LINE_SEPARATOR;
+ private void checkNodeNS(Node test, String nstest, String nsb, String nsc) {
+ String testNodeName = test.getNodeName();
+ if (nstest == null) {
+ Assert.assertNull(test.getNamespaceURI(), "unexpected namespace for " + testNodeName);
+ } else {
+ Assert.assertEquals(test.getNamespaceURI(), nstest, "unexpected namespace for " + testNodeName);
+ }
+ Node b = test.getChildNodes().item(0);
+ if (nsb == null) {
+ Assert.assertNull(b.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b");
+ } else {
+ Assert.assertEquals(b.getNamespaceURI(), nsb, "unexpected namespace for " + testNodeName + "->b");
+ }
+ Node c = b.getChildNodes().item(0);
+ if (nsc == null) {
+ Assert.assertNull(c.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b->c");
+ } else {
+ Assert.assertEquals(c.getNamespaceURI(), nsc, "unexpected namespace for " + testNodeName + "->b->c");
+ }
+ }
- System.out.println("Stylesheet:");
- System.out.println("=============================");
- System.out.println(xsl);
- System.out.println();
+ public void run() throws IOException, TransformerException {
+ printSnippet("Source:", sourceXml);
- System.out.println("Source before transformation:");
- System.out.println("=============================");
- System.out.println(sourceXml);
- System.out.println();
+ printSnippet("Stylesheet:", xsl);
- // transform to DOM result
- TransformerFactory tf = TransformerFactory.newInstance();
- Transformer t = tf.newTransformer(new StreamSource(new ByteArrayInputStream(xsl.getBytes())));
- DOMResult result = new DOMResult();
- t.transform(new StreamSource(new ByteArrayInputStream(sourceXml.getBytes())), result);
- Document document = (Document)result.getNode();
+ // transform to DOM result
+ TransformerFactory tf = TransformerFactory.newInstance();
+ ByteArrayInputStream bais = new ByteArrayInputStream(xsl.getBytes());
+ Transformer t = tf.newTransformer(new StreamSource(bais));
+ DOMResult result = new DOMResult();
+ bais = new ByteArrayInputStream(sourceXml.getBytes());
+ t.transform(new StreamSource(bais), result);
+ Document document = (Document)result.getNode();
- System.out.println("Result after transformation:");
- System.out.println("============================");
- OutputFormat format = new OutputFormat();
- format.setIndenting(true);
- new XMLSerializer(System.out, format).serialize(document);
- System.out.println();
- checkNodeNS8162598(document.getElementsByTagName("test1").item(0), "ns2", "ns2", null);
- checkNodeNS8162598(document.getElementsByTagName("test2").item(0), "ns1", "ns2", null);
- checkNodeNS8162598(document.getElementsByTagName("test3").item(0), null, null, null);
- checkNodeNS8162598(document.getElementsByTagName("test4").item(0), null, null, null);
- checkNodeNS8162598(document.getElementsByTagName("test5").item(0), "ns1", "ns1", null);
- Assert.assertNull(document.getElementsByTagName("test6").item(0).getNamespaceURI(), "unexpected namespace for test6");
+ System.out.println("Result after transformation:");
+ System.out.println("============================");
+ OutputFormat format = new OutputFormat();
+ format.setIndenting(true);
+ new XMLSerializer(System.out, format).serialize(document);
+ System.out.println();
+
+ checkNodeNS(document.getElementsByTagName("test1").item(0), "ns2", "ns2", null);
+ checkNodeNS(document.getElementsByTagName("test2").item(0), "ns1", "ns2", null);
+ checkNodeNS(document.getElementsByTagName("test3").item(0), null, null, null);
+ checkNodeNS(document.getElementsByTagName("test4").item(0), null, null, null);
+ checkNodeNS(document.getElementsByTagName("test5").item(0), "ns1", "ns1", null);
+ Assert.assertNull(document.getElementsByTagName("test6").item(0).getNamespaceURI(),
+ "unexpected namespace for test6");
+ }
+ }
+
+ /*
+ * @bug 8162598
+ * @summary Test XSLTC handling of namespaces, especially empty namespace
+ * definitions to reset the default namespace
+ */
+ @Test
+ public final void testBug8162598() throws IOException,
+ TransformerException
+ {
+ new Test8162598().run();
}
/**
diff --git a/jaxws/.hgtags b/jaxws/.hgtags
index 26ce3b439e7..2b9c99ea42a 100644
--- a/jaxws/.hgtags
+++ b/jaxws/.hgtags
@@ -397,3 +397,5 @@ c8c9c334743caf8155c9809b6b4ac315d3a66476 jdk-9+148
72554d319b474b3636c7d02fe3c110254d111b1a jdk-9+149
77e4e30d9d111272cd4a45a2203e8f570d40b12e jdk-9+150
c48b4d4768b1c2b8fe5d1a844ca13732e5dfbe2a jdk-9+151
+6f8fb1cf7e5f61c40dcc3654f9a623c505f6de1f jdk-9+152
+7a532a9a227137155b905341d4b99939db51220e jdk-9+153
diff --git a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/DetailImpl.java b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/DetailImpl.java
index 047d3be90b3..36291b975b5 100644
--- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/DetailImpl.java
+++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/DetailImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -47,13 +47,13 @@ public abstract class DetailImpl extends FaultElementImpl implements Detail {
public DetailEntry addDetailEntry(Name name) throws SOAPException {
DetailEntry entry = createDetailEntry(name);
addNode(entry);
- return (DetailEntry) circumventBug5034339(entry);
+ return entry;
}
public DetailEntry addDetailEntry(QName qname) throws SOAPException {
DetailEntry entry = createDetailEntry(qname);
addNode(entry);
- return (DetailEntry) circumventBug5034339(entry);
+ return entry;
}
protected SOAPElement addElement(Name name) throws SOAPException {
@@ -119,28 +119,4 @@ public abstract class DetailImpl extends FaultElementImpl implements Detail {
return true;
}
- //overriding this method since the only two uses of this method
- // are in ElementImpl and DetailImpl
- //whereas the original base impl does the correct job for calls to it inside ElementImpl
- // But it would not work for DetailImpl.
- protected SOAPElement circumventBug5034339(SOAPElement element) {
-
- Name elementName = element.getElementName();
- if (!isNamespaceQualified(elementName)) {
- String prefix = elementName.getPrefix();
- String defaultNamespace = getNamespaceURI(prefix);
- if (defaultNamespace != null) {
- Name newElementName =
- NameImpl.create(
- elementName.getLocalName(),
- elementName.getPrefix(),
- defaultNamespace);
- SOAPElement newElement = createDetailEntry(newElementName);
- replaceChild(newElement, element);
- return newElement;
- }
- }
- return element;
- }
-
}
diff --git a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/ElementImpl.java b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/ElementImpl.java
index 5189dd802bd..10070cc7aa6 100644
--- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/ElementImpl.java
+++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/ElementImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -127,8 +127,11 @@ public class ElementImpl
}
public SOAPElement addChildElement(String localName) throws SOAPException {
- return (SOAPElement) addChildElement(
- NameImpl.createFromUnqualifiedName(localName));
+ String nsUri = getNamespaceURI("");
+ Name name = (nsUri == null || nsUri.isEmpty())
+ ? NameImpl.createFromUnqualifiedName(localName)
+ : NameImpl.createFromQualifiedName(localName, nsUri);
+ return addChildElement(name);
}
public SOAPElement addChildElement(String localName, String prefix)
@@ -372,13 +375,13 @@ public class ElementImpl
protected SOAPElement addElement(Name name) throws SOAPException {
SOAPElement newElement = createElement(name);
addNode(newElement);
- return circumventBug5034339(newElement);
+ return newElement;
}
protected SOAPElement addElement(QName name) throws SOAPException {
SOAPElement newElement = createElement(name);
addNode(newElement);
- return circumventBug5034339(newElement);
+ return newElement;
}
protected SOAPElement createElement(Name name) {
@@ -1226,26 +1229,6 @@ public class ElementImpl
return !"".equals(name.getNamespaceURI());
}
- protected SOAPElement circumventBug5034339(SOAPElement element) {
-
- Name elementName = element.getElementName();
- if (!isNamespaceQualified(elementName)) {
- String prefix = elementName.getPrefix();
- String defaultNamespace = getNamespaceURI(prefix);
- if (defaultNamespace != null) {
- Name newElementName =
- NameImpl.create(
- elementName.getLocalName(),
- elementName.getPrefix(),
- defaultNamespace);
- SOAPElement newElement = createElement(newElementName);
- replaceChild(newElement, element);
- return newElement;
- }
- }
- return element;
- }
-
//TODO: This is a temporary SAAJ workaround for optimizing XWS
// should be removed once the corresponding JAXP bug is fixed
// It appears the bug will be fixed in JAXP 1.4 (not by Appserver 9 timeframe)
diff --git a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/stax/SaajStaxWriter.java b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/stax/SaajStaxWriter.java
index 7166afd1e1c..a53cb79a7a1 100644
--- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/stax/SaajStaxWriter.java
+++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/messaging/saaj/util/stax/SaajStaxWriter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, 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,8 +25,10 @@
package com.sun.xml.internal.messaging.saaj.util.stax;
-import java.util.Arrays;
import java.util.Iterator;
+import java.util.Arrays;
+import java.util.List;
+import java.util.LinkedList;
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
@@ -42,6 +44,17 @@ import org.w3c.dom.Node;
/**
* SaajStaxWriter builds a SAAJ SOAPMessage by using XMLStreamWriter interface.
*
+ *
+ * Defers creation of SOAPElement until all the aspects of the name of the element are known.
+ * In some cases, the namespace uri is indicated only by the {@link #writeNamespace(String, String)} call.
+ * After opening an element ({@code writeStartElement}, {@code writeEmptyElement} methods), all attributes
+ * and namespace assignments are retained within {@link DeferredElement} object ({@code deferredElement} field).
+ * As soon as any other method than {@code writeAttribute}, {@code writeNamespace}, {@code writeDefaultNamespace}
+ * or {@code setNamespace} is called, the contents of {@code deferredElement} is transformed into new SOAPElement
+ * (which is appropriately inserted into the SOAPMessage under construction).
+ * This mechanism is necessary to fix JDK-8159058 issue.
+ *
+ *
* @author shih-chang.chen@oracle.com
*/
public class SaajStaxWriter implements XMLStreamWriter {
@@ -49,6 +62,7 @@ public class SaajStaxWriter implements XMLStreamWriter {
protected SOAPMessage soap;
protected String envURI;
protected SOAPElement currentElement;
+ protected DeferredElement deferredElement;
static final protected String Envelope = "Envelope";
static final protected String Header = "Header";
@@ -58,6 +72,7 @@ public class SaajStaxWriter implements XMLStreamWriter {
public SaajStaxWriter(final SOAPMessage msg, String uri) throws SOAPException {
soap = msg;
this.envURI = uri;
+ this.deferredElement = new DeferredElement();
}
public SOAPMessage getSOAPMessage() {
@@ -70,11 +85,8 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeStartElement(final String localName) throws XMLStreamException {
- try {
- currentElement = currentElement.addChildElement(localName);
- } catch (SOAPException e) {
- throw new XMLStreamException(e);
- }
+ currentElement = deferredElement.flushTo(currentElement);
+ deferredElement.setLocalName(localName);
}
@Override
@@ -84,8 +96,10 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeStartElement(final String prefix, final String ln, final String ns) throws XMLStreamException {
- try {
- if (envURI.equals(ns)) {
+ currentElement = deferredElement.flushTo(currentElement);
+
+ if (envURI.equals(ns)) {
+ try {
if (Envelope.equals(ln)) {
currentElement = getEnvelope();
fixPrefix(prefix);
@@ -99,13 +113,16 @@ public class SaajStaxWriter implements XMLStreamWriter {
fixPrefix(prefix);
return;
}
+ } catch (SOAPException e) {
+ throw new XMLStreamException(e);
}
- currentElement = (prefix == null) ?
- currentElement.addChildElement(new QName(ns, ln)) :
- currentElement.addChildElement(ln, prefix, ns);
- } catch (SOAPException e) {
- throw new XMLStreamException(e);
+
}
+
+ deferredElement.setLocalName(ln);
+ deferredElement.setNamespaceUri(ns);
+ deferredElement.setPrefix(prefix);
+
}
private void fixPrefix(final String prfx) throws XMLStreamException {
@@ -136,11 +153,13 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeEndElement() throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
if (currentElement != null) currentElement = currentElement.getParentElement();
}
@Override
public void writeEndDocument() throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
}
@Override
@@ -158,19 +177,14 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeAttribute(final String prefix, final String ns, final String ln, final String value) throws XMLStreamException {
- try {
- if (ns == null) {
- if (prefix == null && xmlns.equals(ln)) {
- currentElement.addNamespaceDeclaration("", value);
- } else {
- currentElement.setAttributeNS("", ln, value);
- }
+ if (ns == null && prefix == null && xmlns.equals(ln)) {
+ writeNamespace("", value);
+ } else {
+ if (deferredElement.isInitialized()) {
+ deferredElement.addAttribute(prefix, ns, ln, value);
} else {
- QName name = (prefix == null) ? new QName(ns, ln) : new QName(ns, ln, prefix);
- currentElement.addAttribute(name, value);
+ addAttibuteToElement(currentElement, prefix, ns, ln, value);
}
- } catch (SOAPException e) {
- throw new XMLStreamException(e);
}
}
@@ -181,16 +195,16 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeNamespace(String prefix, final String uri) throws XMLStreamException {
-
// make prefix default if null or "xmlns" (according to javadoc)
- if (prefix == null || "xmlns".equals(prefix)) {
- prefix = "";
- }
-
- try {
- currentElement.addNamespaceDeclaration(prefix, uri);
- } catch (SOAPException e) {
- throw new XMLStreamException(e);
+ String thePrefix = prefix == null || "xmlns".equals(prefix) ? "" : prefix;
+ if (deferredElement.isInitialized()) {
+ deferredElement.addNamespaceDeclaration(thePrefix, uri);
+ } else {
+ try {
+ currentElement.addNamespaceDeclaration(thePrefix, uri);
+ } catch (SOAPException e) {
+ throw new XMLStreamException(e);
+ }
}
}
@@ -201,35 +215,40 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeComment(final String data) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
Comment c = soap.getSOAPPart().createComment(data);
currentElement.appendChild(c);
}
@Override
public void writeProcessingInstruction(final String target) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
Node n = soap.getSOAPPart().createProcessingInstruction(target, "");
currentElement.appendChild(n);
}
@Override
public void writeProcessingInstruction(final String target, final String data) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
Node n = soap.getSOAPPart().createProcessingInstruction(target, data);
currentElement.appendChild(n);
}
@Override
public void writeCData(final String data) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
Node n = soap.getSOAPPart().createCDATASection(data);
currentElement.appendChild(n);
}
@Override
public void writeDTD(final String dtd) throws XMLStreamException {
- //TODO ... Don't do anything here
+ currentElement = deferredElement.flushTo(currentElement);
}
@Override
public void writeEntityRef(final String name) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
Node n = soap.getSOAPPart().createEntityReference(name);
currentElement.appendChild(n);
}
@@ -257,6 +276,7 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeCharacters(final String text) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
try {
currentElement.addTextNode(text);
} catch (SOAPException e) {
@@ -266,6 +286,7 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeCharacters(final char[] text, final int start, final int len) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
char[] chr = (start == 0 && len == text.length) ? text : Arrays.copyOfRange(text, start, start + len);
try {
currentElement.addTextNode(new String(chr));
@@ -281,10 +302,16 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void setPrefix(final String prefix, final String uri) throws XMLStreamException {
- try {
- this.currentElement.addNamespaceDeclaration(prefix, uri);
- } catch (SOAPException e) {
- throw new XMLStreamException(e);
+ // TODO: this in fact is not what would be expected from XMLStreamWriter
+ // (e.g. XMLStreamWriter for writing to output stream does not write anything as result of
+ // this method, it just rememebers that given prefix is associated with the given uri
+ // for the scope; to actually declare the prefix assignment in the resulting XML, one
+ // needs to call writeNamespace(...) method
+ // Kept for backwards compatibility reasons - this might be worth of further investigation.
+ if (deferredElement.isInitialized()) {
+ deferredElement.addNamespaceDeclaration(prefix, uri);
+ } else {
+ throw new XMLStreamException("Namespace not associated with any element");
}
}
@@ -331,4 +358,209 @@ public class SaajStaxWriter implements XMLStreamWriter {
}
};
}
+
+ static void addAttibuteToElement(SOAPElement element, String prefix, String ns, String ln, String value)
+ throws XMLStreamException {
+ try {
+ if (ns == null) {
+ element.setAttributeNS("", ln, value);
+ } else {
+ QName name = prefix == null ? new QName(ns, ln) : new QName(ns, ln, prefix);
+ element.addAttribute(name, value);
+ }
+ } catch (SOAPException e) {
+ throw new XMLStreamException(e);
+ }
+ }
+
+ /**
+ * Holds details of element that needs to be deferred in order to manage namespace assignments correctly.
+ *
+ *
+ * An instance of can be set with all the aspects of the element name (local name, prefix, namespace uri).
+ * Attributes and namespace declarations (special case of attribute) can be added.
+ * Namespace declarations are handled so that the element namespace is updated if it is implied by the namespace
+ * declaration and the namespace was not set to non-{@code null} value previously.
+ *
+ *
+ *
+ * The state of this object can be {@link #flushTo(SOAPElement) flushed} to SOAPElement - new SOAPElement will
+ * be added a child element; the new element will have exactly the shape as represented by the state of this
+ * object. Note that the {@link #flushTo(SOAPElement)} method does nothing
+ * (and returns the argument immediately) if the state of this object is not initialized
+ * (i.e. local name is null).
+ *
+ *
+ * @author ondrej.cerny@oracle.com
+ */
+ static class DeferredElement {
+ private String prefix;
+ private String localName;
+ private String namespaceUri;
+ private final List namespaceDeclarations;
+ private final List attributeDeclarations;
+
+ DeferredElement() {
+ this.namespaceDeclarations = new LinkedList();
+ this.attributeDeclarations = new LinkedList();
+ reset();
+ }
+
+
+ /**
+ * Set prefix of the element.
+ * @param prefix namespace prefix
+ */
+ public void setPrefix(final String prefix) {
+ this.prefix = prefix;
+ }
+
+ /**
+ * Set local name of the element.
+ *
+ *
+ * This method initializes the element.
+ *
+ *
+ * @param localName local name {@code not null}
+ */
+ public void setLocalName(final String localName) {
+ if (localName == null) {
+ throw new IllegalArgumentException("localName can not be null");
+ }
+ this.localName = localName;
+ }
+
+ /**
+ * Set namespace uri.
+ *
+ * @param namespaceUri namespace uri
+ */
+ public void setNamespaceUri(final String namespaceUri) {
+ this.namespaceUri = namespaceUri;
+ }
+
+ /**
+ * Adds namespace prefix assignment to the element.
+ *
+ * @param prefix prefix (not {@code null})
+ * @param namespaceUri namespace uri
+ */
+ public void addNamespaceDeclaration(final String prefix, final String namespaceUri) {
+ if (null == this.namespaceUri && null != namespaceUri && prefix.equals(emptyIfNull(this.prefix))) {
+ this.namespaceUri = namespaceUri;
+ }
+ this.namespaceDeclarations.add(new NamespaceDeclaration(prefix, namespaceUri));
+ }
+
+ /**
+ * Adds attribute to the element.
+ * @param prefix prefix
+ * @param ns namespace
+ * @param ln local name
+ * @param value value
+ */
+ public void addAttribute(final String prefix, final String ns, final String ln, final String value) {
+ if (ns == null && prefix == null && xmlns.equals(ln)) {
+ this.addNamespaceDeclaration(prefix, value);
+ } else {
+ this.attributeDeclarations.add(new AttributeDeclaration(prefix, ns, ln, value));
+ }
+ }
+
+ /**
+ * Flushes state of this element to the {@code target} element.
+ *
+ *
+ * If this element is initialized then it is added with all the namespace declarations and attributes
+ * to the {@code target} element as a child. The state of this element is reset to uninitialized.
+ * The newly added element object is returned.
+ *
+ *
+ * If this element is not initialized then the {@code target} is returned immediately, nothing else is done.
+ *
+ *
+ * @param target target element
+ * @return {@code target} or new element
+ * @throws XMLStreamException on error
+ */
+ public SOAPElement flushTo(final SOAPElement target) throws XMLStreamException {
+ try {
+ if (this.localName != null) {
+ // add the element appropriately (based on namespace declaration)
+ final SOAPElement newElement;
+ if (this.namespaceUri == null) {
+ // add element with inherited scope
+ newElement = target.addChildElement(this.localName);
+ } else if (prefix == null) {
+ newElement = target.addChildElement(new QName(this.namespaceUri, this.localName));
+ } else {
+ newElement = target.addChildElement(this.localName, this.prefix, this.namespaceUri);
+ }
+ // add namespace declarations
+ for (NamespaceDeclaration namespace : this.namespaceDeclarations) {
+ target.addNamespaceDeclaration(namespace.prefix, namespace.namespaceUri);
+ }
+ // add attribute declarations
+ for (AttributeDeclaration attribute : this.attributeDeclarations) {
+ addAttibuteToElement(newElement,
+ attribute.prefix, attribute.namespaceUri, attribute.localName, attribute.value);
+ }
+ // reset state
+ this.reset();
+
+ return newElement;
+ } else {
+ return target;
+ }
+ // else after reset state -> not initialized
+ } catch (SOAPException e) {
+ throw new XMLStreamException(e);
+ }
+ }
+
+ /**
+ * Is the element initialized?
+ * @return boolean indicating whether it was initialized after last flush
+ */
+ public boolean isInitialized() {
+ return this.localName != null;
+ }
+
+ private void reset() {
+ this.localName = null;
+ this.prefix = null;
+ this.namespaceUri = null;
+ this.namespaceDeclarations.clear();
+ this.attributeDeclarations.clear();
+ }
+
+ private static String emptyIfNull(String s) {
+ return s == null ? "" : s;
+ }
+ }
+
+ static class NamespaceDeclaration {
+ final String prefix;
+ final String namespaceUri;
+
+ NamespaceDeclaration(String prefix, String namespaceUri) {
+ this.prefix = prefix;
+ this.namespaceUri = namespaceUri;
+ }
+ }
+
+ static class AttributeDeclaration {
+ final String prefix;
+ final String namespaceUri;
+ final String localName;
+ final String value;
+
+ AttributeDeclaration(String prefix, String namespaceUri, String localName, String value) {
+ this.prefix = prefix;
+ this.namespaceUri = namespaceUri;
+ this.localName = localName;
+ this.value = value;
+ }
+ }
}
diff --git a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/message/saaj/SaajStaxWriter.java b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/message/saaj/SaajStaxWriter.java
index 9b743e20c59..37a42e75c53 100644
--- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/message/saaj/SaajStaxWriter.java
+++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/api/message/saaj/SaajStaxWriter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017, 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,8 +25,10 @@
package com.sun.xml.internal.ws.api.message.saaj;
-import java.util.Arrays;
import java.util.Iterator;
+import java.util.Arrays;
+import java.util.List;
+import java.util.LinkedList;
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
@@ -42,6 +44,17 @@ import org.w3c.dom.Node;
/**
* SaajStaxWriter builds a SAAJ SOAPMessage by using XMLStreamWriter interface.
*
+ *
+ * Defers creation of SOAPElement until all the aspects of the name of the element are known.
+ * In some cases, the namespace uri is indicated only by the {@link #writeNamespace(String, String)} call.
+ * After opening an element ({@code writeStartElement}, {@code writeEmptyElement} methods), all attributes
+ * and namespace assignments are retained within {@link DeferredElement} object ({@code deferredElement} field).
+ * As soon as any other method than {@code writeAttribute}, {@code writeNamespace}, {@code writeDefaultNamespace}
+ * or {@code setNamespace} is called, the contents of {@code deferredElement} is transformed into new SOAPElement
+ * (which is appropriately inserted into the SOAPMessage under construction).
+ * This mechanism is necessary to fix JDK-8159058 issue.
+ *
+ *
* @author shih-chang.chen@oracle.com
*/
public class SaajStaxWriter implements XMLStreamWriter {
@@ -49,6 +62,7 @@ public class SaajStaxWriter implements XMLStreamWriter {
protected SOAPMessage soap;
protected String envURI;
protected SOAPElement currentElement;
+ protected DeferredElement deferredElement;
static final protected String Envelope = "Envelope";
static final protected String Header = "Header";
@@ -58,6 +72,7 @@ public class SaajStaxWriter implements XMLStreamWriter {
public SaajStaxWriter(final SOAPMessage msg, String uri) throws SOAPException {
soap = msg;
this.envURI = uri;
+ this.deferredElement = new DeferredElement();
}
public SOAPMessage getSOAPMessage() {
@@ -70,11 +85,8 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeStartElement(final String localName) throws XMLStreamException {
- try {
- currentElement = currentElement.addChildElement(localName);
- } catch (SOAPException e) {
- throw new XMLStreamException(e);
- }
+ currentElement = deferredElement.flushTo(currentElement);
+ deferredElement.setLocalName(localName);
}
@Override
@@ -84,8 +96,10 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeStartElement(final String prefix, final String ln, final String ns) throws XMLStreamException {
- try {
- if (envURI.equals(ns)) {
+ currentElement = deferredElement.flushTo(currentElement);
+
+ if (envURI.equals(ns)) {
+ try {
if (Envelope.equals(ln)) {
currentElement = getEnvelope();
fixPrefix(prefix);
@@ -99,13 +113,16 @@ public class SaajStaxWriter implements XMLStreamWriter {
fixPrefix(prefix);
return;
}
+ } catch (SOAPException e) {
+ throw new XMLStreamException(e);
}
- currentElement = (prefix == null) ?
- currentElement.addChildElement(new QName(ns, ln)) :
- currentElement.addChildElement(ln, prefix, ns);
- } catch (SOAPException e) {
- throw new XMLStreamException(e);
+
}
+
+ deferredElement.setLocalName(ln);
+ deferredElement.setNamespaceUri(ns);
+ deferredElement.setPrefix(prefix);
+
}
private void fixPrefix(final String prfx) throws XMLStreamException {
@@ -136,11 +153,13 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeEndElement() throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
if (currentElement != null) currentElement = currentElement.getParentElement();
}
@Override
public void writeEndDocument() throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
}
@Override
@@ -158,19 +177,14 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeAttribute(final String prefix, final String ns, final String ln, final String value) throws XMLStreamException {
- try {
- if (ns == null) {
- if (prefix == null && xmlns.equals(ln)) {
- currentElement.addNamespaceDeclaration("", value);
- } else {
- currentElement.setAttributeNS("", ln, value);
- }
+ if (ns == null && prefix == null && xmlns.equals(ln)) {
+ writeNamespace("", value);
+ } else {
+ if (deferredElement.isInitialized()) {
+ deferredElement.addAttribute(prefix, ns, ln, value);
} else {
- QName name = (prefix == null) ? new QName(ns, ln) : new QName(ns, ln, prefix);
- currentElement.addAttribute(name, value);
+ addAttibuteToElement(currentElement, prefix, ns, ln, value);
}
- } catch (SOAPException e) {
- throw new XMLStreamException(e);
}
}
@@ -181,16 +195,16 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeNamespace(String prefix, final String uri) throws XMLStreamException {
-
// make prefix default if null or "xmlns" (according to javadoc)
- if (prefix == null || "xmlns".equals(prefix)) {
- prefix = "";
- }
-
- try {
- currentElement.addNamespaceDeclaration(prefix, uri);
- } catch (SOAPException e) {
- throw new XMLStreamException(e);
+ String thePrefix = prefix == null || "xmlns".equals(prefix) ? "" : prefix;
+ if (deferredElement.isInitialized()) {
+ deferredElement.addNamespaceDeclaration(thePrefix, uri);
+ } else {
+ try {
+ currentElement.addNamespaceDeclaration(thePrefix, uri);
+ } catch (SOAPException e) {
+ throw new XMLStreamException(e);
+ }
}
}
@@ -201,35 +215,40 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeComment(final String data) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
Comment c = soap.getSOAPPart().createComment(data);
currentElement.appendChild(c);
}
@Override
public void writeProcessingInstruction(final String target) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
Node n = soap.getSOAPPart().createProcessingInstruction(target, "");
currentElement.appendChild(n);
}
@Override
public void writeProcessingInstruction(final String target, final String data) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
Node n = soap.getSOAPPart().createProcessingInstruction(target, data);
currentElement.appendChild(n);
}
@Override
public void writeCData(final String data) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
Node n = soap.getSOAPPart().createCDATASection(data);
currentElement.appendChild(n);
}
@Override
public void writeDTD(final String dtd) throws XMLStreamException {
- //TODO ... Don't do anything here
+ currentElement = deferredElement.flushTo(currentElement);
}
@Override
public void writeEntityRef(final String name) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
Node n = soap.getSOAPPart().createEntityReference(name);
currentElement.appendChild(n);
}
@@ -257,6 +276,7 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeCharacters(final String text) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
try {
currentElement.addTextNode(text);
} catch (SOAPException e) {
@@ -266,6 +286,7 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void writeCharacters(final char[] text, final int start, final int len) throws XMLStreamException {
+ currentElement = deferredElement.flushTo(currentElement);
char[] chr = (start == 0 && len == text.length) ? text : Arrays.copyOfRange(text, start, start + len);
try {
currentElement.addTextNode(new String(chr));
@@ -281,10 +302,16 @@ public class SaajStaxWriter implements XMLStreamWriter {
@Override
public void setPrefix(final String prefix, final String uri) throws XMLStreamException {
- try {
- this.currentElement.addNamespaceDeclaration(prefix, uri);
- } catch (SOAPException e) {
- throw new XMLStreamException(e);
+ // TODO: this in fact is not what would be expected from XMLStreamWriter
+ // (e.g. XMLStreamWriter for writing to output stream does not write anything as result of
+ // this method, it just rememebers that given prefix is associated with the given uri
+ // for the scope; to actually declare the prefix assignment in the resulting XML, one
+ // needs to call writeNamespace(...) method
+ // Kept for backwards compatibility reasons - this might be worth of further investigation.
+ if (deferredElement.isInitialized()) {
+ deferredElement.addNamespaceDeclaration(prefix, uri);
+ } else {
+ throw new XMLStreamException("Namespace not associated with any element");
}
}
@@ -315,12 +342,12 @@ public class SaajStaxWriter implements XMLStreamWriter {
return currentElement.lookupPrefix(namespaceURI);
}
public Iterator getPrefixes(final String namespaceURI) {
- return new Iterator() {
+ return new Iterator() {
String prefix = getPrefix(namespaceURI);
public boolean hasNext() {
return (prefix != null);
}
- public Object next() {
+ public String next() {
if (!hasNext()) throw new java.util.NoSuchElementException();
String next = prefix;
prefix = null;
@@ -331,4 +358,209 @@ public class SaajStaxWriter implements XMLStreamWriter {
}
};
}
+
+ static void addAttibuteToElement(SOAPElement element, String prefix, String ns, String ln, String value)
+ throws XMLStreamException {
+ try {
+ if (ns == null) {
+ element.setAttributeNS("", ln, value);
+ } else {
+ QName name = prefix == null ? new QName(ns, ln) : new QName(ns, ln, prefix);
+ element.addAttribute(name, value);
+ }
+ } catch (SOAPException e) {
+ throw new XMLStreamException(e);
+ }
+ }
+
+ /**
+ * Holds details of element that needs to be deferred in order to manage namespace assignments correctly.
+ *
+ *
+ * An instance of can be set with all the aspects of the element name (local name, prefix, namespace uri).
+ * Attributes and namespace declarations (special case of attribute) can be added.
+ * Namespace declarations are handled so that the element namespace is updated if it is implied by the namespace
+ * declaration and the namespace was not set to non-{@code null} value previously.
+ *
+ *
+ *
+ * The state of this object can be {@link #flushTo(SOAPElement) flushed} to SOAPElement - new SOAPElement will
+ * be added a child element; the new element will have exactly the shape as represented by the state of this
+ * object. Note that the {@link #flushTo(SOAPElement)} method does nothing
+ * (and returns the argument immediately) if the state of this object is not initialized
+ * (i.e. local name is null).
+ *
+ *
+ * @author ondrej.cerny@oracle.com
+ */
+ static class DeferredElement {
+ private String prefix;
+ private String localName;
+ private String namespaceUri;
+ private final List namespaceDeclarations;
+ private final List attributeDeclarations;
+
+ DeferredElement() {
+ this.namespaceDeclarations = new LinkedList();
+ this.attributeDeclarations = new LinkedList();
+ reset();
+ }
+
+
+ /**
+ * Set prefix of the element.
+ * @param prefix namespace prefix
+ */
+ public void setPrefix(final String prefix) {
+ this.prefix = prefix;
+ }
+
+ /**
+ * Set local name of the element.
+ *
+ *
+ * This method initializes the element.
+ *
+ *
+ * @param localName local name {@code not null}
+ */
+ public void setLocalName(final String localName) {
+ if (localName == null) {
+ throw new IllegalArgumentException("localName can not be null");
+ }
+ this.localName = localName;
+ }
+
+ /**
+ * Set namespace uri.
+ *
+ * @param namespaceUri namespace uri
+ */
+ public void setNamespaceUri(final String namespaceUri) {
+ this.namespaceUri = namespaceUri;
+ }
+
+ /**
+ * Adds namespace prefix assignment to the element.
+ *
+ * @param prefix prefix (not {@code null})
+ * @param namespaceUri namespace uri
+ */
+ public void addNamespaceDeclaration(final String prefix, final String namespaceUri) {
+ if (null == this.namespaceUri && null != namespaceUri && prefix.equals(emptyIfNull(this.prefix))) {
+ this.namespaceUri = namespaceUri;
+ }
+ this.namespaceDeclarations.add(new NamespaceDeclaration(prefix, namespaceUri));
+ }
+
+ /**
+ * Adds attribute to the element.
+ * @param prefix prefix
+ * @param ns namespace
+ * @param ln local name
+ * @param value value
+ */
+ public void addAttribute(final String prefix, final String ns, final String ln, final String value) {
+ if (ns == null && prefix == null && xmlns.equals(ln)) {
+ this.addNamespaceDeclaration(prefix, value);
+ } else {
+ this.attributeDeclarations.add(new AttributeDeclaration(prefix, ns, ln, value));
+ }
+ }
+
+ /**
+ * Flushes state of this element to the {@code target} element.
+ *
+ *
+ * If this element is initialized then it is added with all the namespace declarations and attributes
+ * to the {@code target} element as a child. The state of this element is reset to uninitialized.
+ * The newly added element object is returned.
+ *
+ *
+ * If this element is not initialized then the {@code target} is returned immediately, nothing else is done.
+ *
+ *
+ * @param target target element
+ * @return {@code target} or new element
+ * @throws XMLStreamException on error
+ */
+ public SOAPElement flushTo(final SOAPElement target) throws XMLStreamException {
+ try {
+ if (this.localName != null) {
+ // add the element appropriately (based on namespace declaration)
+ final SOAPElement newElement;
+ if (this.namespaceUri == null) {
+ // add element with inherited scope
+ newElement = target.addChildElement(this.localName);
+ } else if (prefix == null) {
+ newElement = target.addChildElement(new QName(this.namespaceUri, this.localName));
+ } else {
+ newElement = target.addChildElement(this.localName, this.prefix, this.namespaceUri);
+ }
+ // add namespace declarations
+ for (NamespaceDeclaration namespace : this.namespaceDeclarations) {
+ target.addNamespaceDeclaration(namespace.prefix, namespace.namespaceUri);
+ }
+ // add attribute declarations
+ for (AttributeDeclaration attribute : this.attributeDeclarations) {
+ addAttibuteToElement(newElement,
+ attribute.prefix, attribute.namespaceUri, attribute.localName, attribute.value);
+ }
+ // reset state
+ this.reset();
+
+ return newElement;
+ } else {
+ return target;
+ }
+ // else after reset state -> not initialized
+ } catch (SOAPException e) {
+ throw new XMLStreamException(e);
+ }
+ }
+
+ /**
+ * Is the element initialized?
+ * @return boolean indicating whether it was initialized after last flush
+ */
+ public boolean isInitialized() {
+ return this.localName != null;
+ }
+
+ private void reset() {
+ this.localName = null;
+ this.prefix = null;
+ this.namespaceUri = null;
+ this.namespaceDeclarations.clear();
+ this.attributeDeclarations.clear();
+ }
+
+ private static String emptyIfNull(String s) {
+ return s == null ? "" : s;
+ }
+ }
+
+ static class NamespaceDeclaration {
+ final String prefix;
+ final String namespaceUri;
+
+ NamespaceDeclaration(String prefix, String namespaceUri) {
+ this.prefix = prefix;
+ this.namespaceUri = namespaceUri;
+ }
+ }
+
+ static class AttributeDeclaration {
+ final String prefix;
+ final String namespaceUri;
+ final String localName;
+ final String value;
+
+ AttributeDeclaration(String prefix, String namespaceUri, String localName, String value) {
+ this.prefix = prefix;
+ this.namespaceUri = namespaceUri;
+ this.localName = localName;
+ this.value = value;
+ }
+ }
}
diff --git a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java
index 09eaa938b46..d84fa5e7d11 100644
--- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java
+++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,6 +33,7 @@ import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.lang.reflect.Method;
+import java.net.URI;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -332,13 +333,13 @@ public class XmlUtil {
* (com.sun.org.apache.xml.internal) for modular runtime.
*/
private static EntityResolver createCatalogResolver(ArrayList urls) throws Exception {
- // Prepare array of catalog paths
- String[] paths = urls.stream()
- .map(u -> u.toExternalForm())
- .toArray(c -> new String[c]);
+ // Prepare array of catalog URIs
+ URI[] uris = urls.stream()
+ .map(u -> URI.create(u.toExternalForm()))
+ .toArray(URI[]::new);
//Create CatalogResolver with new JDK9+ API
- return (EntityResolver) CatalogManager.catalogResolver(catalogFeatures, paths);
+ return (EntityResolver) CatalogManager.catalogResolver(catalogFeatures, uris);
}
// Cache CatalogFeatures instance for future usages.
diff --git a/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/xjc/Options.java b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/xjc/Options.java
index bce8f27cbc2..10c1bda5157 100644
--- a/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/xjc/Options.java
+++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/xjc/Options.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -777,13 +777,13 @@ public class Options
* Adds a new catalog file.
*/
public void addCatalog(File catalogFile) throws IOException {
- String newUrl = catalogFile.getPath();
+ URI newUrl = catalogFile.toURI();
if (!catalogUrls.contains(newUrl)) {
catalogUrls.add(newUrl);
}
try {
entityResolver = CatalogManager.catalogResolver(catalogFeatures,
- catalogUrls.toArray(new String[0]));
+ catalogUrls.stream().toArray(URI[]::new));
} catch (Exception ex) {
entityResolver = null;
}
@@ -791,7 +791,7 @@ public class Options
// Since javax.xml.catalog is unmodifiable we need to track catalog
// URLs added and create new catalog each time addCatalog is called
- private final ArrayList catalogUrls = new ArrayList();
+ private final ArrayList catalogUrls = new ArrayList<>();
// Cache CatalogFeatures instance for future usages.
// Resolve feature is set to "continue" value for backward compatibility.
diff --git a/jdk/.hgtags b/jdk/.hgtags
index f1e4cc0eb8c..a73fb2ebf2a 100644
--- a/jdk/.hgtags
+++ b/jdk/.hgtags
@@ -395,3 +395,4 @@ c41140100bf1e5c10c7b8f3bde91c16eff7485f5 jdk-9+147
71e198ef3839045e829a879af1d709be16ab0f88 jdk-9+150
d27bab22ff62823902d93d1d35ca397cfd50d059 jdk-9+151
a20f2cf90762673e1bc4980fd6597e70a2578045 jdk-9+152
+1c4411322327aea3f91011ec3977a12a05b09629 jdk-9+153
diff --git a/jdk/src/java.base/share/classes/module-info.java b/jdk/src/java.base/share/classes/module-info.java
index 1114d513687..b831d9a3549 100644
--- a/jdk/src/java.base/share/classes/module-info.java
+++ b/jdk/src/java.base/share/classes/module-info.java
@@ -310,7 +310,6 @@ module java.base {
// JDK-internal service types
uses jdk.internal.logger.DefaultLoggerFinder;
uses sun.security.ssl.ClientKeyExchangeService;
- uses sun.security.util.AuthResourcesProvider;
uses sun.text.spi.JavaTimeDateTimePatternProvider;
uses sun.util.spi.CalendarProvider;
uses sun.util.locale.provider.LocaleDataMetaInfo;
@@ -322,6 +321,4 @@ module java.base {
provides java.nio.file.spi.FileSystemProvider with
jdk.internal.jrtfs.JrtFileSystemProvider;
- provides sun.security.util.AuthResourcesProvider with
- sun.security.util.AuthResourcesProviderImpl;
}
diff --git a/jdk/src/java.base/share/classes/sun/security/provider/ConfigFile.java b/jdk/src/java.base/share/classes/sun/security/provider/ConfigFile.java
index 25a975504d6..450a4292cff 100644
--- a/jdk/src/java.base/share/classes/sun/security/provider/ConfigFile.java
+++ b/jdk/src/java.base/share/classes/sun/security/provider/ConfigFile.java
@@ -331,9 +331,8 @@ public final class ConfigFile extends Configuration {
if (debugConfig != null) {
debugConfig.println(fnfe.toString());
}
- throw new IOException(ResourcesMgr.getString
- ("Configuration.Error.No.such.file.or.directory",
- "sun.security.util.AuthResources"));
+ throw new IOException(ResourcesMgr.getAuthResourceString
+ ("Configuration.Error.No.such.file.or.directory"));
}
}
@@ -661,8 +660,8 @@ public final class ConfigFile extends Configuration {
}
private IOException ioException(String resourceKey, Object... args) {
- MessageFormat form = new MessageFormat(ResourcesMgr.getString
- (resourceKey, "sun.security.util.AuthResources"));
+ MessageFormat form = new MessageFormat(
+ ResourcesMgr.getAuthResourceString(resourceKey));
return new IOException(form.format(args));
}
}
diff --git a/jdk/src/java.base/share/classes/sun/security/provider/SubjectCodeSource.java b/jdk/src/java.base/share/classes/sun/security/provider/SubjectCodeSource.java
index a92ff27906a..26a3d4e3f89 100644
--- a/jdk/src/java.base/share/classes/sun/security/provider/SubjectCodeSource.java
+++ b/jdk/src/java.base/share/classes/sun/security/provider/SubjectCodeSource.java
@@ -34,6 +34,7 @@ import java.lang.reflect.Constructor;
import javax.security.auth.Subject;
import sun.security.provider.PolicyParser.PrincipalEntry;
+import sun.security.util.ResourcesMgr;
/**
*
This SubjectCodeSource class contains
@@ -47,15 +48,6 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
private static final long serialVersionUID = 6039418085604715275L;
- private static final java.util.ResourceBundle rb =
- java.security.AccessController.doPrivileged
- (new java.security.PrivilegedAction() {
- public java.util.ResourceBundle run() {
- return (java.util.ResourceBundle.getBundle
- ("sun.security.util.AuthResources"));
- }
- });
-
private Subject subject;
private LinkedList principals;
private static final Class>[] PARAMS = { String.class };
@@ -391,7 +383,7 @@ class SubjectCodeSource extends CodeSource implements java.io.Serializable {
ListIterator li = principals.listIterator();
while (li.hasNext()) {
PrincipalEntry pppe = li.next();
- returnMe = returnMe + rb.getString("NEWLINE") +
+ returnMe = returnMe + ResourcesMgr.getAuthResourceString("NEWLINE") +
pppe.getPrincipalClass() + " " +
pppe.getPrincipalName();
}
diff --git a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java
index 9730938c927..b73773f5711 100644
--- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java
+++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, 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
@@ -3522,7 +3522,8 @@ public final class Main {
System.err.flush();
reply = (new BufferedReader(new InputStreamReader
(System.in))).readLine();
- if (collator.compare(reply, "") == 0 ||
+ if (reply == null ||
+ collator.compare(reply, "") == 0 ||
collator.compare(reply, rb.getString("n")) == 0 ||
collator.compare(reply, rb.getString("no")) == 0) {
reply = "NO";
diff --git a/jdk/src/java.base/share/classes/sun/security/util/AuthResourcesProvider.java b/jdk/src/java.base/share/classes/sun/security/util/AuthResourcesProvider.java
deleted file mode 100644
index 126286a6ff1..00000000000
--- a/jdk/src/java.base/share/classes/sun/security/util/AuthResourcesProvider.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.security.util;
-
-public interface AuthResourcesProvider extends java.util.spi.ResourceBundleProvider {
-}
diff --git a/jdk/src/java.base/share/classes/sun/security/util/AuthResourcesProviderImpl.java b/jdk/src/java.base/share/classes/sun/security/util/AuthResourcesProviderImpl.java
deleted file mode 100644
index 6572ad0113d..00000000000
--- a/jdk/src/java.base/share/classes/sun/security/util/AuthResourcesProviderImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.security.util;
-
-import java.util.spi.AbstractResourceBundleProvider;
-
-public final class AuthResourcesProviderImpl extends AbstractResourceBundleProvider
- implements AuthResourcesProvider {
- public AuthResourcesProviderImpl() {
- super("java.class");
- }
-}
\ No newline at end of file
diff --git a/jdk/src/java.base/share/classes/sun/security/util/ResourcesMgr.java b/jdk/src/java.base/share/classes/sun/security/util/ResourcesMgr.java
index 091f2ea8e13..725d21b6eb7 100644
--- a/jdk/src/java.base/share/classes/sun/security/util/ResourcesMgr.java
+++ b/jdk/src/java.base/share/classes/sun/security/util/ResourcesMgr.java
@@ -25,18 +25,22 @@
package sun.security.util;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.concurrent.ConcurrentHashMap;
+import jdk.internal.misc.VM;
+
/**
*/
public class ResourcesMgr {
-
// intended for java.security, javax.security and sun.security resources
- private static java.util.ResourceBundle bundle;
+ private final static String RESOURCES = "sun.security.util.Resources";
+ private final static String AUTH_RESOURCES = "sun.security.util.AuthResources";
- // intended for com.sun.security resources
- private static java.util.ResourceBundle altBundle;
+ private final static Map bundles = new ConcurrentHashMap<>();
public static String getString(String s) {
-
+ ResourceBundle bundle = bundles.get(RESOURCES);
if (bundle == null) {
// only load if/when needed
@@ -52,19 +56,15 @@ public class ResourcesMgr {
return bundle.getString(s);
}
- public static String getString(String s, final String altBundleName) {
-
- if (altBundle == null) {
-
- // only load if/when needed
- altBundle = java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction() {
- public java.util.ResourceBundle run() {
- return (java.util.ResourceBundle.getBundle(altBundleName));
- }
- });
+ public static String getAuthResourceString(String s) {
+ if (VM.initLevel() == 3) {
+ // cannot trigger loading of any resource bundle as
+ // it depends on the system class loader fully initialized.
+ throw new InternalError("system class loader is being initialized");
}
- return altBundle.getString(s);
+ return bundles.computeIfAbsent(AUTH_RESOURCES, ResourceBundle::getBundle)
+ .getString(s);
}
+
}
diff --git a/jdk/src/java.base/share/lib/security/default.policy b/jdk/src/java.base/share/lib/security/default.policy
index 4d890704195..ae4a1e2db54 100644
--- a/jdk/src/java.base/share/lib/security/default.policy
+++ b/jdk/src/java.base/share/lib/security/default.policy
@@ -205,3 +205,11 @@ grant codeBase "jrt:/jdk.accessibility" {
grant codeBase "jrt:/jdk.desktop" {
permission java.lang.RuntimePermission "accessClassInPackage.com.sun.awt";
};
+
+// permissions needed by applications using java.desktop module
+grant {
+ permission java.lang.RuntimePermission "accessClassInPackage.com.sun.beans";
+ permission java.lang.RuntimePermission "accessClassInPackage.com.sun.beans.*";
+ permission java.lang.RuntimePermission "accessClassInPackage.com.sun.java.swing.plaf.*";
+ permission java.lang.RuntimePermission "accessClassInPackage.com.apple.*";
+};
diff --git a/jdk/src/java.base/windows/native/libnio/ch/WindowsSelectorImpl.c b/jdk/src/java.base/windows/native/libnio/ch/WindowsSelectorImpl.c
index 4d9432845ea..c6b5fa9b368 100644
--- a/jdk/src/java.base/windows/native/libnio/ch/WindowsSelectorImpl.c
+++ b/jdk/src/java.base/windows/native/libnio/ch/WindowsSelectorImpl.c
@@ -75,8 +75,8 @@ Java_sun_nio_ch_WindowsSelectorImpl_00024SubSelector_poll0(JNIEnv *env, jobject
} else if (timeout < 0) {
tv = NULL;
} else {
- tv = &timevalue;
jlong sec = timeout / 1000;
+ tv = &timevalue;
//
// struct timeval members are signed 32-bit integers so the
// signed 64-bit jlong needs to be clamped
diff --git a/jdk/src/java.management/share/classes/com/sun/jmx/defaults/JmxProperties.java b/jdk/src/java.management/share/classes/com/sun/jmx/defaults/JmxProperties.java
index 5c7f7dc3f2d..566d0f9d5cd 100644
--- a/jdk/src/java.management/share/classes/com/sun/jmx/defaults/JmxProperties.java
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/defaults/JmxProperties.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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,7 +25,7 @@
package com.sun.jmx.defaults;
-import java.util.logging.Logger;
+import java.lang.System.Logger;
/**
* This contains the property list defined for this
@@ -120,7 +120,7 @@ public class JmxProperties {
* Logger for MBean Server information.
*/
public static final Logger MBEANSERVER_LOGGER =
- Logger.getLogger(MBEANSERVER_LOGGER_NAME);
+ System.getLogger(MBEANSERVER_LOGGER_NAME);
/**
* Logger name for MLet service information.
@@ -132,7 +132,7 @@ public class JmxProperties {
* Logger for MLet service information.
*/
public static final Logger MLET_LOGGER =
- Logger.getLogger(MLET_LOGGER_NAME);
+ System.getLogger(MLET_LOGGER_NAME);
/**
* Logger name for Monitor information.
@@ -144,7 +144,7 @@ public class JmxProperties {
* Logger for Monitor information.
*/
public static final Logger MONITOR_LOGGER =
- Logger.getLogger(MONITOR_LOGGER_NAME);
+ System.getLogger(MONITOR_LOGGER_NAME);
/**
* Logger name for Timer information.
@@ -156,7 +156,7 @@ public class JmxProperties {
* Logger for Timer information.
*/
public static final Logger TIMER_LOGGER =
- Logger.getLogger(TIMER_LOGGER_NAME);
+ System.getLogger(TIMER_LOGGER_NAME);
/**
* Logger name for Event Management information.
@@ -168,7 +168,7 @@ public class JmxProperties {
* Logger for Event Management information.
*/
public static final Logger NOTIFICATION_LOGGER =
- Logger.getLogger(NOTIFICATION_LOGGER_NAME);
+ System.getLogger(NOTIFICATION_LOGGER_NAME);
/**
* Logger name for Relation Service.
@@ -180,7 +180,7 @@ public class JmxProperties {
* Logger for Relation Service.
*/
public static final Logger RELATION_LOGGER =
- Logger.getLogger(RELATION_LOGGER_NAME);
+ System.getLogger(RELATION_LOGGER_NAME);
/**
* Logger name for Model MBean.
@@ -192,7 +192,7 @@ public class JmxProperties {
* Logger for Model MBean.
*/
public static final Logger MODELMBEAN_LOGGER =
- Logger.getLogger(MODELMBEAN_LOGGER_NAME);
+ System.getLogger(MODELMBEAN_LOGGER_NAME);
/**
* Logger name for all other JMX classes.
@@ -204,5 +204,5 @@ public class JmxProperties {
* Logger for all other JMX classes.
*/
public static final Logger MISC_LOGGER =
- Logger.getLogger(MISC_LOGGER_NAME);
+ System.getLogger(MISC_LOGGER_NAME);
}
diff --git a/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java b/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java
index 350eb0218a0..b6a5b53b703 100644
--- a/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, 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
@@ -50,7 +50,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.WeakHashMap;
-import java.util.logging.Level;
+import java.lang.System.Logger.Level;
// JMX import
import javax.management.Attribute;
@@ -258,19 +258,16 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
/* Load the appropriate class. */
if (withDefaultLoaderRepository) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "createMBean",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
"ClassName = " + className + ", ObjectName = " + name);
}
theClass =
instantiator.findClassWithDefaultLoaderRepository(className);
} else if (loaderName == null) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "createMBean", "ClassName = " + className +
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
+ "ClassName = " + className +
", ObjectName = " + name + ", Loader name = null");
}
@@ -279,10 +276,9 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
} else {
loaderName = nonDefaultDomain(loaderName);
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "createMBean", "ClassName = " + className +
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
+ "ClassName = " + className +
", ObjectName = " + name +
", Loader name = " + loaderName);
}
@@ -633,10 +629,8 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
name = nonDefaultDomain(name);
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "getAttribute",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
"Attribute = " + attribute + ", ObjectName = " + name);
}
@@ -670,10 +664,8 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
name = nonDefaultDomain(name);
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "getAttributes", "ObjectName = " + name);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE, "ObjectName = " + name);
}
final DynamicMBean instance = getMBean(name);
@@ -732,10 +724,8 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
name = nonDefaultDomain(name);
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "setAttribute", "ObjectName = " + name +
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE, "ObjectName = " + name +
", Attribute = " + attribute.getName());
}
@@ -910,10 +900,9 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
name = nonDefaultDomain(name);
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "registerMBean", "ObjectName = " + name);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
+ "ObjectName = " + name);
}
ObjectName logicalName = preRegister(mbean, server, name);
@@ -1023,14 +1012,14 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
if (mbean instanceof MBeanRegistration)
((MBeanRegistration) mbean).postRegister(registrationDone);
} catch (RuntimeException e) {
- MBEANSERVER_LOGGER.fine("While registering MBean ["+logicalName+
+ MBEANSERVER_LOGGER.log(Level.DEBUG, "While registering MBean ["+logicalName+
"]: " + "Exception thrown by postRegister: " +
"rethrowing <"+e+">, but keeping the MBean registered");
throw new RuntimeMBeanException(e,
"RuntimeException thrown in postRegister method: "+
"rethrowing <"+e+">, but keeping the MBean registered");
} catch (Error er) {
- MBEANSERVER_LOGGER.fine("While registering MBean ["+logicalName+
+ MBEANSERVER_LOGGER.log(Level.DEBUG, "While registering MBean ["+logicalName+
"]: " + "Error thrown by postRegister: " +
"rethrowing <"+er+">, but keeping the MBean registered");
throw new RuntimeErrorException(er,
@@ -1053,7 +1042,7 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
try {
moi.postDeregister();
} catch (RuntimeException e) {
- MBEANSERVER_LOGGER.fine("While unregistering MBean ["+mbean+
+ MBEANSERVER_LOGGER.log(Level.DEBUG, "While unregistering MBean ["+mbean+
"]: " + "Exception thrown by postDeregister: " +
"rethrowing <"+e+">, although the MBean is succesfully " +
"unregistered");
@@ -1062,7 +1051,7 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
"rethrowing <"+e+
">, although the MBean is sucessfully unregistered");
} catch (Error er) {
- MBEANSERVER_LOGGER.fine("While unregistering MBean ["+mbean+
+ MBEANSERVER_LOGGER.log(Level.DEBUG, "While unregistering MBean ["+mbean+
"]: " + "Error thrown by postDeregister: " +
"rethrowing <"+er+">, although the MBean is succesfully " +
"unregistered");
@@ -1087,10 +1076,9 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
}
DynamicMBean obj = repository.retrieve(name);
if (obj == null) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "getMBean", name + " : Found no object");
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
+ name + " : Found no object");
}
throw new InstanceNotFoundException(name.toString());
}
@@ -1176,10 +1164,8 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
// ------------------------------
// ------------------------------
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "addNotificationListener", "ObjectName = " + name);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE, "ObjectName = " + name);
}
DynamicMBean instance = getMBean(name);
@@ -1226,10 +1212,8 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
// ----------------
// Add a listener on an MBean
// ----------------
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "addNotificationListener",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
"ObjectName = " + name + ", Listener = " + listener);
}
server.addNotificationListener(name,(NotificationListener) resource,
@@ -1255,10 +1239,8 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
throws InstanceNotFoundException, ListenerNotFoundException {
NotificationListener instance = getListener(listener);
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "removeNotificationListener",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
"ObjectName = " + name + ", Listener = " + listener);
}
server.removeNotificationListener(name, instance);
@@ -1272,10 +1254,8 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
NotificationListener instance = getListener(listener);
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "removeNotificationListener",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
"ObjectName = " + name + ", Listener = " + listener);
}
server.removeNotificationListener(name, instance, filter, handback);
@@ -1313,10 +1293,8 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
boolean removeAll)
throws InstanceNotFoundException, ListenerNotFoundException {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "removeNotificationListener", "ObjectName = " + name);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE, "ObjectName = " + name);
}
DynamicMBean instance = getMBean(name);
@@ -1421,10 +1399,9 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
return classNameClass.isAssignableFrom(resourceClass);
} catch (Exception x) {
/* Could be SecurityException or ClassNotFoundException */
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- DefaultMBeanServerInterceptor.class.getName(),
- "isInstanceOf", "Exception calling isInstanceOf", x);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.DEBUG)) {
+ MBEANSERVER_LOGGER.log(Level.DEBUG,
+ "Exception calling isInstanceOf", x);
}
return false;
}
@@ -1489,10 +1466,8 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
MBeanServerNotification notif = new MBeanServerNotification(
NotifType,MBeanServerDelegate.DELEGATE_NAME,0,name);
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "sendNotification", NotifType + " " + name);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE, NotifType + " " + name);
}
delegate.sendNotification(notif);
@@ -1594,10 +1569,8 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
try {
return getClassName(mbean);
} catch (Exception e) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- DefaultMBeanServerInterceptor.class.getName(),
- "safeGetClassName",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.DEBUG)) {
+ MBEANSERVER_LOGGER.log(Level.DEBUG,
"Exception getting MBean class name", e);
}
return null;
@@ -1885,10 +1858,9 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
// ---------------------
// Send create event
// ---------------------
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "addObject", "Send create notification of object " +
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
+ "Send create notification of object " +
logicalName.getCanonicalName());
}
@@ -1926,10 +1898,9 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor {
// ---------------------
// Send deletion event
// ---------------------
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- DefaultMBeanServerInterceptor.class.getName(),
- "unregisterMBean", "Send delete notification of object " +
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
+ "Send delete notification of object " +
logicalName.getCanonicalName());
}
diff --git a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/ClassLoaderRepositorySupport.java b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/ClassLoaderRepositorySupport.java
index 1d76705e581..9cc7721659d 100644
--- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/ClassLoaderRepositorySupport.java
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/ClassLoaderRepositorySupport.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,7 +33,7 @@ import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
-import java.util.logging.Level;
+import java.lang.System.Logger.Level;
import javax.management.MBeanPermission;
import javax.management.ObjectName;
@@ -148,10 +148,9 @@ final class ClassLoaderRepositorySupport
// from javax.management.loading.DefaultLoaderRepository
public final Class> loadClassWithout(ClassLoader without, String className)
throws ClassNotFoundException {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- ClassLoaderRepositorySupport.class.getName(),
- "loadClassWithout", className + " without " + without);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
+ className + " without " + without);
}
// without is null => just behave as loadClass
@@ -172,10 +171,9 @@ final class ClassLoaderRepositorySupport
public final Class> loadClassBefore(ClassLoader stop, String className)
throws ClassNotFoundException {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- ClassLoaderRepositorySupport.class.getName(),
- "loadClassBefore", className + " before " + stop);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
+ className + " before " + stop);
}
if (stop == null)
@@ -206,10 +204,8 @@ final class ClassLoaderRepositorySupport
continue;
if (cl == stop)
break;
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- ClassLoaderRepositorySupport.class.getName(),
- "loadClass", "Trying loader = " + cl);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE, "Trying loader = " + cl);
}
/* We used to have a special case for "instanceof
MLet" here, where we invoked the method
@@ -239,10 +235,9 @@ final class ClassLoaderRepositorySupport
//
List excluded = search.get(className);
if ((excluded!= null) && (excluded.contains(aloader))) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- ClassLoaderRepositorySupport.class.getName(),
- "startValidSearch", "Already requested loader = " +
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
+ "Already requested loader = " +
aloader + " class = " + className);
}
throw new ClassNotFoundException(className);
@@ -255,10 +250,8 @@ final class ClassLoaderRepositorySupport
search.put(className, excluded);
}
excluded.add(aloader);
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- ClassLoaderRepositorySupport.class.getName(),
- "startValidSearch",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
"loader = " + aloader + " class = " + className);
}
}
@@ -271,10 +264,8 @@ final class ClassLoaderRepositorySupport
List excluded = search.get(className);
if (excluded != null) {
excluded.remove(aloader);
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- ClassLoaderRepositorySupport.class.getName(),
- "stopValidSearch",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
"loader = " + aloader + " class = " + className);
}
}
diff --git a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/JmxMBeanServer.java b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/JmxMBeanServer.java
index b7f1444acaf..4e63cb36d0e 100644
--- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/JmxMBeanServer.java
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/JmxMBeanServer.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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,7 +36,7 @@ import java.security.PrivilegedAction;
import java.security.PrivilegedExceptionAction;
import java.util.List;
import java.util.Set;
-import java.util.logging.Level;
+import java.lang.System.Logger.Level;
import javax.management.Attribute;
import javax.management.AttributeList;
@@ -1229,16 +1229,14 @@ public final class JmxMBeanServer
}
});
} catch (SecurityException e) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- JmxMBeanServer.class.getName(), "initialize",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.DEBUG)) {
+ MBEANSERVER_LOGGER.log(Level.DEBUG,
"Unexpected security exception occurred", e);
}
throw e;
} catch (Exception e) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- JmxMBeanServer.class.getName(), "initialize",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.DEBUG)) {
+ MBEANSERVER_LOGGER.log(Level.DEBUG,
"Unexpected exception occurred", e);
}
throw new
diff --git a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java
index 38740044f76..2a99a3b9b0a 100644
--- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/MBeanInstantiator.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, 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
@@ -40,7 +40,7 @@ import java.security.Permissions;
import java.security.PrivilegedAction;
import java.security.ProtectionDomain;
import java.util.Map;
-import java.util.logging.Level;
+import java.lang.System.Logger.Level;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
@@ -186,19 +186,15 @@ public class MBeanInstantiator {
}
}
} catch (ClassNotFoundException e) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- MBeanInstantiator.class.getName(),
- "findSignatureClasses",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.DEBUG)) {
+ MBEANSERVER_LOGGER.log(Level.DEBUG,
"The parameter class could not be found", e);
}
throw new ReflectionException(e,
"The parameter class could not be found");
} catch (RuntimeException e) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- MBeanInstantiator.class.getName(),
- "findSignatureClasses",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.DEBUG)) {
+ MBEANSERVER_LOGGER.log(Level.DEBUG,
"Unexpected exception", e);
}
throw e;
@@ -696,19 +692,15 @@ public class MBeanInstantiator {
tab[i] = Class.forName(signature[i], false, aLoader);
}
} catch (ClassNotFoundException e) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- MBeanInstantiator.class.getName(),
- "findSignatureClasses",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.DEBUG)) {
+ MBEANSERVER_LOGGER.log(Level.DEBUG,
"The parameter class could not be found", e);
}
throw new ReflectionException(e,
"The parameter class could not be found");
} catch (RuntimeException e) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- MBeanInstantiator.class.getName(),
- "findSignatureClasses",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.DEBUG)) {
+ MBEANSERVER_LOGGER.log(Level.DEBUG,
"Unexpected exception", e);
}
throw e;
diff --git a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/MBeanServerDelegateImpl.java b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/MBeanServerDelegateImpl.java
index f4fdc827be5..fc9a4ad10f4 100644
--- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/MBeanServerDelegateImpl.java
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/MBeanServerDelegateImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, 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
@@ -24,7 +24,7 @@
*/
package com.sun.jmx.mbeanserver;
-import java.util.logging.Level;
+import java.lang.System.Logger.Level;
import javax.management.Attribute;
import javax.management.AttributeList;
@@ -244,10 +244,8 @@ final class MBeanServerDelegateImpl
} catch (Exception x) {
// Skip the attribute that couldn't be obtained.
//
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- MBeanServerDelegateImpl.class.getName(),
- "getAttributes",
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE,
"Attribute " + attn[i] + " not found");
}
}
diff --git a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/Repository.java b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/Repository.java
index 4693a44ae11..bbab04fc880 100644
--- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/Repository.java
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/Repository.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -34,7 +34,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.locks.ReentrantReadWriteLock;
-import java.util.logging.Level;
+import java.lang.System.Logger.Level;
import java.util.Map;
import java.util.Set;
import javax.management.DynamicMBean;
@@ -264,7 +264,7 @@ public class Repository {
context.unregistered();
} catch (Exception x) {
// shouldn't come here...
- MBEANSERVER_LOGGER.log(Level.FINE,
+ MBEANSERVER_LOGGER.log(Level.DEBUG,
"Unexpected exception while unregistering "+name,
x);
}
@@ -385,9 +385,8 @@ public class Repository {
final RegistrationContext context)
throws InstanceAlreadyExistsException {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER, Repository.class.getName(),
- "addMBean", "name = " + name);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE, "name = " + name);
}
// Extract the domain name.
@@ -456,9 +455,8 @@ public class Repository {
* false otherwise.
*/
public boolean contains(ObjectName name) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER, Repository.class.getName(),
- "contains", " name = " + name);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE, "name = " + name);
}
lock.readLock().lock();
try {
@@ -478,9 +476,8 @@ public class Repository {
* null otherwise.
*/
public DynamicMBean retrieve(ObjectName name) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER, Repository.class.getName(),
- "retrieve", "name = " + name);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE, "name = " + name);
}
// Calls internal retrieve method to get the named object
@@ -609,9 +606,8 @@ public class Repository {
throws InstanceNotFoundException {
// Debugging stuff
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINER)) {
- MBEANSERVER_LOGGER.logp(Level.FINER, Repository.class.getName(),
- "remove", "name = " + name);
+ if (MBEANSERVER_LOGGER.isLoggable(Level.TRACE)) {
+ MBEANSERVER_LOGGER.log(Level.TRACE, "name = " + name);
}
// Extract domain name.
diff --git a/jdk/src/java.management/share/classes/com/sun/jmx/remote/util/ClassLogger.java b/jdk/src/java.management/share/classes/com/sun/jmx/remote/util/ClassLogger.java
index a0f7a4c1c8e..91d8cbc9de3 100644
--- a/jdk/src/java.management/share/classes/com/sun/jmx/remote/util/ClassLogger.java
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/remote/util/ClassLogger.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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,222 +25,188 @@
package com.sun.jmx.remote.util;
-import java.util.logging.Logger;
+import java.lang.System.Logger;
+import java.lang.System.Logger.Level;
+import java.util.ResourceBundle;
-public class ClassLogger {
+public class ClassLogger implements System.Logger {
- private static final boolean ok;
private final String className;
private final Logger logger;
- static {
- /* We attempt to work even if we are running in J2SE 1.3, where
- there is no java.util.logging. The technique we use here is
- not strictly portable, but it does work with Sun's J2SE 1.3
- at least. This is just a best effort: the Right Thing is for
- people to use at least J2SE 1.4. */
- boolean loaded = false;
- try {
- Class> c = java.util.logging.Logger.class;
- loaded = true;
- } catch (Error e) {
- // OK.
- // java.util.logger package is not available in this jvm.
- }
- ok = loaded;
- }
-
public ClassLogger(String subsystem, String className) {
- if (ok)
- logger = Logger.getLogger(subsystem);
- else
- logger = null;
+ logger = System.getLogger(subsystem);
this.className = className;
}
public final boolean traceOn() {
- return finerOn();
+ return logger.isLoggable(Level.TRACE);
}
public final boolean debugOn() {
- return finestOn();
+ return logger.isLoggable(Level.DEBUG);
}
public final boolean warningOn() {
- return ok && logger.isLoggable(java.util.logging.Level.WARNING);
+ return logger.isLoggable(Level.WARNING);
}
public final boolean infoOn() {
- return ok && logger.isLoggable(java.util.logging.Level.INFO);
+ return logger.isLoggable(Level.INFO);
}
public final boolean configOn() {
- return ok && logger.isLoggable(java.util.logging.Level.CONFIG);
+ return logger.isLoggable(Level.DEBUG);
}
public final boolean fineOn() {
- return ok && logger.isLoggable(java.util.logging.Level.FINE);
+ return logger.isLoggable(Level.DEBUG);
}
public final boolean finerOn() {
- return ok && logger.isLoggable(java.util.logging.Level.FINER);
+ return logger.isLoggable(Level.TRACE);
}
public final boolean finestOn() {
- return ok && logger.isLoggable(java.util.logging.Level.FINEST);
+ return logger.isLoggable(Level.TRACE);
}
public final void debug(String func, String msg) {
- finest(func,msg);
+ logger.log(Level.DEBUG, msg);
}
public final void debug(String func, Throwable t) {
- finest(func,t);
+ logger.log(Level.DEBUG, className + "::" + func, t);
}
public final void debug(String func, String msg, Throwable t) {
- finest(func,msg,t);
+ logger.log(Level.DEBUG, msg, t);
}
public final void trace(String func, String msg) {
- finer(func,msg);
+ logger.log(Level.TRACE, msg);
}
public final void trace(String func, Throwable t) {
- finer(func,t);
+ logger.log(Level.TRACE, className + "::" + func, t);
}
public final void trace(String func, String msg, Throwable t) {
- finer(func,msg,t);
+ logger.log(Level.TRACE, msg, t);
}
public final void error(String func, String msg) {
- severe(func,msg);
+ logger.log(Level.ERROR, msg);
}
public final void error(String func, Throwable t) {
- severe(func,t);
+ logger.log(Level.ERROR, className + "::" + func, t);
}
public final void error(String func, String msg, Throwable t) {
- severe(func,msg,t);
+ logger.log(Level.ERROR, msg, t);
}
public final void finest(String func, String msg) {
- if (ok)
- logger.logp(java.util.logging.Level.FINEST, className, func, msg);
+ logger.log(Level.TRACE, msg);
}
public final void finest(String func, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.FINEST, className, func,
- t.toString(), t);
+ logger.log(Level.TRACE, className + "::" + func, t);
}
public final void finest(String func, String msg, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.FINEST, className, func, msg,
- t);
+ logger.log(Level.TRACE, msg, t);
}
public final void finer(String func, String msg) {
- if (ok)
- logger.logp(java.util.logging.Level.FINER, className, func, msg);
+ logger.log(Level.TRACE, msg);
}
public final void finer(String func, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.FINER, className, func,
- t.toString(), t);
+ logger.log(Level.TRACE, className + "::" + func, t);
}
public final void finer(String func, String msg, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.FINER, className, func, msg,t);
+ logger.log(Level.DEBUG, msg, t);
}
public final void fine(String func, String msg) {
- if (ok)
- logger.logp(java.util.logging.Level.FINE, className, func, msg);
+ logger.log(Level.DEBUG, msg);
}
public final void fine(String func, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.FINE, className, func,
- t.toString(), t);
+ logger.log(Level.DEBUG, className + "::" + func, t);
}
public final void fine(String func, String msg, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.FINE, className, func, msg,
- t);
+ logger.log(Level.DEBUG, msg, t);
}
public final void config(String func, String msg) {
- if (ok)
- logger.logp(java.util.logging.Level.CONFIG, className, func, msg);
+ logger.log(Level.DEBUG, msg);
}
public final void config(String func, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.CONFIG, className, func,
- t.toString(), t);
+ logger.log(Level.DEBUG, className + "::" + func, t);
}
public final void config(String func, String msg, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.CONFIG, className, func, msg,
- t);
+ logger.log(Level.DEBUG, msg, t);
}
public final void info(String func, String msg) {
- if (ok)
- logger.logp(java.util.logging.Level.INFO, className, func, msg);
+ logger.log(Level.INFO, msg);
}
public final void info(String func, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.INFO, className, func,
- t.toString(), t);
+ logger.log(Level.INFO, className + "::" + func, t);
}
public final void info(String func, String msg, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.INFO, className, func, msg,
- t);
+ logger.log(Level.INFO, msg, t);
}
public final void warning(String func, String msg) {
- if (ok)
- logger.logp(java.util.logging.Level.WARNING, className, func, msg);
+ logger.log(Level.WARNING, msg);
}
public final void warning(String func, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.WARNING, className, func,
- t.toString(), t);
+ logger.log(Level.WARNING, className + "::" + func, t);
}
public final void warning(String func, String msg, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.WARNING, className, func, msg,
- t);
+ logger.log(Level.WARNING, msg, t);
}
public final void severe(String func, String msg) {
- if (ok)
- logger.logp(java.util.logging.Level.SEVERE, className, func, msg);
+ logger.log(Level.ERROR, msg);
}
public final void severe(String func, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.SEVERE, className, func,
- t.toString(), t);
+ logger.log(Level.ERROR, className + "::" + func, t);
}
public final void severe(String func, String msg, Throwable t) {
- if (ok)
- logger.logp(java.util.logging.Level.SEVERE, className, func, msg,
- t);
+ logger.log(Level.ERROR, msg, t);
}
+
+ public final String getName() {
+ return logger.getName();
+ }
+
+ public final boolean isLoggable(Level level) {
+ return logger.isLoggable(level);
+ }
+
+ public final void log(Level level, ResourceBundle bundle, String msg,
+ Throwable thrown) {
+ logger.log(level, bundle, msg, thrown);
+ }
+
+ public final void log(Level level, ResourceBundle bundle, String format,
+ Object... params) {
+ logger.log(level, bundle, format, params);
+ }
+
}
diff --git a/jdk/src/java.management/share/classes/javax/management/MBeanServerDelegate.java b/jdk/src/java.management/share/classes/javax/management/MBeanServerDelegate.java
index b9db8a1b7f0..443e9a7a06c 100644
--- a/jdk/src/java.management/share/classes/javax/management/MBeanServerDelegate.java
+++ b/jdk/src/java.management/share/classes/javax/management/MBeanServerDelegate.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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,6 +25,7 @@
package javax.management;
+import java.lang.System.Logger.Level;
import com.sun.jmx.defaults.JmxProperties;
import com.sun.jmx.defaults.ServiceName;
import com.sun.jmx.mbeanserver.Util;
@@ -84,7 +85,8 @@ public class MBeanServerDelegate implements MBeanServerDelegateMBean,
try {
localHost = java.net.InetAddress.getLocalHost().getHostName();
} catch (java.net.UnknownHostException e) {
- JmxProperties.MISC_LOGGER.finest("Can't get local host name, " +
+ JmxProperties.MISC_LOGGER.log(Level.TRACE,
+ "Can't get local host name, " +
"using \"localhost\" instead. Cause is: "+e);
localHost = "localhost";
}
diff --git a/jdk/src/java.management/share/classes/javax/management/MBeanServerFactory.java b/jdk/src/java.management/share/classes/javax/management/MBeanServerFactory.java
index 756811a072f..1d4fc131169 100644
--- a/jdk/src/java.management/share/classes/javax/management/MBeanServerFactory.java
+++ b/jdk/src/java.management/share/classes/javax/management/MBeanServerFactory.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -32,7 +32,7 @@ import com.sun.jmx.mbeanserver.GetPropertyAction;
import java.security.AccessController;
import java.security.Permission;
import java.util.ArrayList;
-import java.util.logging.Level;
+import java.lang.System.Logger.Level;
import javax.management.loading.ClassLoaderRepository;
import sun.reflect.misc.ReflectUtil;
@@ -399,7 +399,7 @@ public class MBeanServerFactory {
return (String) mbs.getAttribute(MBeanServerDelegate.DELEGATE_NAME,
"MBeanServerId");
} catch (JMException e) {
- JmxProperties.MISC_LOGGER.finest(
+ JmxProperties.MISC_LOGGER.log(Level.TRACE,
"Ignoring exception while getting MBeanServerId: "+e);
return null;
}
@@ -421,9 +421,7 @@ public class MBeanServerFactory {
private static synchronized void removeMBeanServer(MBeanServer mbs) {
boolean removed = mBeanServerList.remove(mbs);
if (!removed) {
- MBEANSERVER_LOGGER.logp(Level.FINER,
- MBeanServerFactory.class.getName(),
- "removeMBeanServer(MBeanServer)",
+ MBEANSERVER_LOGGER.log(Level.TRACE,
"MBeanServer was not in list!");
throw new IllegalArgumentException("MBeanServer was not in list!");
}
@@ -504,15 +502,12 @@ public class MBeanServerFactory {
throw new JMRuntimeException(msg, x);
}
} catch (RuntimeException x) {
- if (MBEANSERVER_LOGGER.isLoggable(Level.FINEST)) {
+ if (MBEANSERVER_LOGGER.isLoggable(Level.DEBUG)) {
StringBuilder strb = new StringBuilder()
.append("Failed to instantiate MBeanServerBuilder: ").append(x)
.append("\n\t\tCheck the value of the ")
.append(JMX_INITIAL_BUILDER).append(" property.");
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- MBeanServerFactory.class.getName(),
- "checkMBeanServerBuilder",
- strb.toString());
+ MBEANSERVER_LOGGER.log(Level.DEBUG, strb::toString);
}
throw x;
}
diff --git a/jdk/src/java.management/share/classes/javax/management/StandardMBean.java b/jdk/src/java.management/share/classes/javax/management/StandardMBean.java
index 42affd8b96e..e908836b0b8 100644
--- a/jdk/src/java.management/share/classes/javax/management/StandardMBean.java
+++ b/jdk/src/java.management/share/classes/javax/management/StandardMBean.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, 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
@@ -38,7 +38,7 @@ import java.security.PrivilegedAction;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
-import java.util.logging.Level;
+import java.lang.System.Logger.Level;
import javax.management.openmbean.OpenMBeanAttributeInfo;
import javax.management.openmbean.OpenMBeanAttributeInfoSupport;
import javax.management.openmbean.OpenMBeanConstructorInfo;
@@ -432,16 +432,14 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration {
final MBeanInfo cached = getCachedMBeanInfo();
if (cached != null) return cached;
} catch (RuntimeException x) {
- if (MISC_LOGGER.isLoggable(Level.FINEST)) {
- MISC_LOGGER.logp(Level.FINEST,
- MBeanServerFactory.class.getName(), "getMBeanInfo",
+ if (MISC_LOGGER.isLoggable(Level.DEBUG)) {
+ MISC_LOGGER.log(Level.DEBUG,
"Failed to get cached MBeanInfo", x);
}
}
- if (MISC_LOGGER.isLoggable(Level.FINER)) {
- MISC_LOGGER.logp(Level.FINER,
- MBeanServerFactory.class.getName(), "getMBeanInfo",
+ if (MISC_LOGGER.isLoggable(Level.TRACE)) {
+ MISC_LOGGER.log(Level.TRACE,
"Building MBeanInfo for " +
getImplementationClass().getName());
}
@@ -465,9 +463,8 @@ public class StandardMBean implements DynamicMBean, MBeanRegistration {
try {
cacheMBeanInfo(nmbi);
} catch (RuntimeException x) {
- if (MISC_LOGGER.isLoggable(Level.FINEST)) {
- MISC_LOGGER.logp(Level.FINEST,
- MBeanServerFactory.class.getName(), "getMBeanInfo",
+ if (MISC_LOGGER.isLoggable(Level.DEBUG)) {
+ MISC_LOGGER.log(Level.DEBUG,
"Failed to cache MBeanInfo", x);
}
}
diff --git a/jdk/src/java.management/share/classes/javax/management/loading/DefaultLoaderRepository.java b/jdk/src/java.management/share/classes/javax/management/loading/DefaultLoaderRepository.java
index 5cf3ad143b2..b7cee08cbe7 100644
--- a/jdk/src/java.management/share/classes/javax/management/loading/DefaultLoaderRepository.java
+++ b/jdk/src/java.management/share/classes/javax/management/loading/DefaultLoaderRepository.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,7 @@ package javax.management.loading;
import static com.sun.jmx.defaults.JmxProperties.MBEANSERVER_LOGGER;
import java.util.Iterator;
import java.util.List;
-import java.util.logging.Level;
+import java.lang.System.Logger.Level;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
@@ -71,9 +71,7 @@ public class DefaultLoaderRepository {
*/
public static Class> loadClass(String className)
throws ClassNotFoundException {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- DefaultLoaderRepository.class.getName(),
- "loadClass", className);
+ MBEANSERVER_LOGGER.log(Level.TRACE, className);
return load(null, className);
}
@@ -96,9 +94,7 @@ public class DefaultLoaderRepository {
public static Class> loadClassWithout(ClassLoader loader,
String className)
throws ClassNotFoundException {
- MBEANSERVER_LOGGER.logp(Level.FINEST,
- DefaultLoaderRepository.class.getName(),
- "loadClassWithout", className);
+ MBEANSERVER_LOGGER.log(Level.TRACE, className);
return load(loader, className);
}
diff --git a/jdk/src/java.management/share/classes/javax/management/loading/MLet.java b/jdk/src/java.management/share/classes/javax/management/loading/MLet.java
index 1a3fb18527b..500b773abf7 100644
--- a/jdk/src/java.management/share/classes/javax/management/loading/MLet.java
+++ b/jdk/src/java.management/share/classes/javax/management/loading/MLet.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -52,7 +52,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.logging.Level;
+import java.lang.System.Logger.Level;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
@@ -412,9 +412,8 @@ public class MLet extends java.net.URLClassLoader
if (!Arrays.asList(getURLs()).contains(ur))
super.addURL(ur);
} catch (MalformedURLException e) {
- if (MLET_LOGGER.isLoggable(Level.FINEST)) {
- MLET_LOGGER.logp(Level.FINEST, MLet.class.getName(),
- "addUrl", "Malformed URL: " + url, e);
+ if (MLET_LOGGER.isLoggable(Level.DEBUG)) {
+ MLET_LOGGER.log(Level.DEBUG, "Malformed URL: " + url, e);
}
throw new
ServiceNotFoundException("The specified URL is malformed");
@@ -481,23 +480,19 @@ public class MLet extends java.net.URLClassLoader
public Set
*
*
A wildcard may have its upper bound explicitly set by an
* {@code extends} clause, its lower bound explicitly set by a
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java
index 795ce97b61c..8367c1aa587 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -54,15 +54,6 @@ import javax.annotation.processing.SupportedSourceVersion;
* behavior for the visit method in question. When the new visitor is
* introduced, all or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods
* @param
the type of the additional parameter to this visitor's methods.
*
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java
index b03e5a7e8e7..20a77e985d1 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -51,15 +51,6 @@ import javax.annotation.processing.SupportedSourceVersion;
* behavior for the visit method in question. When the new visitor is
* introduced, all or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods
* @param
the type of the additional parameter to this visitor's methods.
*
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java
index eddd27d0998..689e301f803 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -51,15 +51,6 @@ import javax.annotation.processing.SupportedSourceVersion;
* behavior for the visit method in question. When the new visitor is
* introduced, all or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods
* @param
the type of the additional parameter to this visitor's methods.
*
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor6.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor6.java
index 9f2b6e85186..daa0e097efd 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor6.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor6.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -53,15 +53,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor7.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor7.java
index 94dcfc8cff5..69263575588 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor7.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor7.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, 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
@@ -52,15 +52,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor8.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor8.java
index 8237407f1a7..53878285b15 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor8.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractElementVisitor8.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -52,15 +52,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor6.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor6.java
index eb7bbce728a..8ad1fe1f5db 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor6.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor6.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -52,15 +52,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor7.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor7.java
index 1973446d4af..55ac050fb3e 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor7.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor7.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, 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
@@ -52,15 +52,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor8.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor8.java
index 87163338a96..2665d1a90d6 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor8.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/AbstractTypeVisitor8.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -52,15 +52,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java
index ec188e794de..562e6e5cfd2 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor6.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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,10 +36,10 @@ import javax.lang.model.SourceVersion;
* A visitor of program elements based on their {@linkplain
* ElementKind kind} with default behavior appropriate for the {@link
* SourceVersion#RELEASE_6 RELEASE_6} source version. For {@linkplain
- * Element elements} XYZ that may have more than one
- * kind, the visitXYZ methods in this class delegate
- * to the visitXYZKind method corresponding to the
- * first argument's kind. The visitXYZKind methods
+ * Element elements} Xyz that may have more than one
+ * kind, the visitXyz methods in this class delegate
+ * to the visitXyzAsKind method corresponding to the
+ * first argument's kind. The visitXyzAsKind methods
* call {@link #defaultAction defaultAction}, passing their arguments
* to {@code defaultAction}'s corresponding parameters.
*
@@ -67,15 +67,6 @@ import javax.lang.model.SourceVersion;
* for the visit method in question. When the new visitor is
* introduced, all or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor7.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor7.java
index 66874151fbd..3bf25d10f70 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor7.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor7.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, 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
@@ -34,10 +34,10 @@ import static javax.lang.model.SourceVersion.*;
* A visitor of program elements based on their {@linkplain
* ElementKind kind} with default behavior appropriate for the {@link
* SourceVersion#RELEASE_7 RELEASE_7} source version. For {@linkplain
- * Element elements} XYZ that may have more than one
- * kind, the visitXYZ methods in this class delegate
- * to the visitXYZKind method corresponding to the
- * first argument's kind. The visitXYZKind methods
+ * Element elements} Xyz that may have more than one
+ * kind, the visitXyz methods in this class delegate
+ * to the visitXyzAsKind method corresponding to the
+ * first argument's kind. The visitXyzAsKind methods
* call {@link #defaultAction defaultAction}, passing their arguments
* to {@code defaultAction}'s corresponding parameters.
*
@@ -65,15 +65,6 @@ import static javax.lang.model.SourceVersion.*;
* for the visit method in question. When the new visitor is
* introduced, all or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor8.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor8.java
index 3af0257eefa..d23265df3e8 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor8.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor8.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -34,10 +34,10 @@ import javax.lang.model.SourceVersion;
* A visitor of program elements based on their {@linkplain
* ElementKind kind} with default behavior appropriate for the {@link
* SourceVersion#RELEASE_8 RELEASE_8} source version. For {@linkplain
- * Element elements} XYZ that may have more than one
- * kind, the visitXYZ methods in this class delegate
- * to the visitXYZKind method corresponding to the
- * first argument's kind. The visitXYZKind methods
+ * Element elements} Xyz that may have more than one
+ * kind, the visitXyz methods in this class delegate
+ * to the visitXyzAsKind method corresponding to the
+ * first argument's kind. The visitXyzAsKind methods
* call {@link #defaultAction defaultAction}, passing their arguments
* to {@code defaultAction}'s corresponding parameters.
*
@@ -65,15 +65,6 @@ import javax.lang.model.SourceVersion;
* for the visit method in question. When the new visitor is
* introduced, all or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor9.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor9.java
index eb1a303e3ee..fc5a9851104 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor9.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementKindVisitor9.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -34,10 +34,10 @@ import javax.lang.model.SourceVersion;
* A visitor of program elements based on their {@linkplain
* ElementKind kind} with default behavior appropriate for the {@link
* SourceVersion#RELEASE_9 RELEASE_9} source version. For {@linkplain
- * Element elements} XYZ that may have more than one
- * kind, the visitXYZ methods in this class delegate
- * to the visitXYZKind method corresponding to the
- * first argument's kind. The visitXYZKind methods
+ * Element elements} Xyz that may have more than one
+ * kind, the visitXyz methods in this class delegate
+ * to the visitXyzAsKind method corresponding to the
+ * first argument's kind. The visitXyzAsKind methods
* call {@link #defaultAction defaultAction}, passing their arguments
* to {@code defaultAction}'s corresponding parameters.
*
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner6.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner6.java
index 3d7b7dd40a9..749cc600d86 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner6.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner6.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -34,26 +34,26 @@ import static javax.lang.model.SourceVersion.*;
/**
* A scanning visitor of program elements with default behavior
* appropriate for the {@link SourceVersion#RELEASE_6 RELEASE_6}
- * source version. The visitXYZ methods in this
+ * source version. The visitXyz methods in this
* class scan their component elements by calling {@code scan} on
* their {@linkplain Element#getEnclosedElements enclosed elements},
* {@linkplain ExecutableElement#getParameters parameters}, etc., as
* indicated in the individual method specifications. A subclass can
* control the order elements are visited by overriding the
- * visitXYZ methods. Note that clients of a scanner
+ * visitXyz methods. Note that clients of a scanner
* may get the desired behavior be invoking {@code v.scan(e, p)} rather
* than {@code v.visit(e, p)} on the root objects of interest.
*
- *
When a subclass overrides a visitXYZ method, the
+ *
When a subclass overrides a visitXyz method, the
* new method can cause the enclosed elements to be scanned in the
- * default way by calling super.visitXYZ. In this
+ * default way by calling super.visitXyz. In this
* fashion, the concrete visitor can control the ordering of traversal
* over the component elements with respect to the additional
* processing; for example, consistently calling
- * super.visitXYZ at the start of the overridden
+ * super.visitXyz at the start of the overridden
* methods will yield a preorder traversal, etc. If the component
* elements should be traversed in some other order, instead of
- * calling super.visitXYZ, an overriding visit method
+ * calling super.visitXyz, an overriding visit method
* should call {@code scan} with the elements in the desired order.
*
*
Methods in this class may be overridden subject to their
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner7.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner7.java
index d99583f1b7a..35b90dcfca6 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner7.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner7.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, 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
@@ -34,26 +34,26 @@ import static javax.lang.model.SourceVersion.*;
/**
* A scanning visitor of program elements with default behavior
* appropriate for the {@link SourceVersion#RELEASE_7 RELEASE_7}
- * source version. The visitXYZ methods in this
+ * source version. The visitXyz methods in this
* class scan their component elements by calling {@code scan} on
* their {@linkplain Element#getEnclosedElements enclosed elements},
* {@linkplain ExecutableElement#getParameters parameters}, etc., as
* indicated in the individual method specifications. A subclass can
* control the order elements are visited by overriding the
- * visitXYZ methods. Note that clients of a scanner
+ * visitXyz methods. Note that clients of a scanner
* may get the desired behavior be invoking {@code v.scan(e, p)} rather
* than {@code v.visit(e, p)} on the root objects of interest.
*
- *
When a subclass overrides a visitXYZ method, the
+ *
When a subclass overrides a visitXyz method, the
* new method can cause the enclosed elements to be scanned in the
- * default way by calling super.visitXYZ. In this
+ * default way by calling super.visitXyz. In this
* fashion, the concrete visitor can control the ordering of traversal
* over the component elements with respect to the additional
* processing; for example, consistently calling
- * super.visitXYZ at the start of the overridden
+ * super.visitXyz at the start of the overridden
* methods will yield a preorder traversal, etc. If the component
* elements should be traversed in some other order, instead of
- * calling super.visitXYZ, an overriding visit method
+ * calling super.visitXyz, an overriding visit method
* should call {@code scan} with the elements in the desired order.
*
*
Methods in this class may be overridden subject to their
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner8.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner8.java
index 517a4f30b4f..0fd2f21046d 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner8.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner8.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -34,26 +34,26 @@ import static javax.lang.model.SourceVersion.*;
/**
* A scanning visitor of program elements with default behavior
* appropriate for the {@link SourceVersion#RELEASE_8 RELEASE_8}
- * source version. The visitXYZ methods in this
+ * source version. The visitXyz methods in this
* class scan their component elements by calling {@code scan} on
* their {@linkplain Element#getEnclosedElements enclosed elements},
* {@linkplain ExecutableElement#getParameters parameters}, etc., as
* indicated in the individual method specifications. A subclass can
* control the order elements are visited by overriding the
- * visitXYZ methods. Note that clients of a scanner
+ * visitXyz methods. Note that clients of a scanner
* may get the desired behavior be invoking {@code v.scan(e, p)} rather
* than {@code v.visit(e, p)} on the root objects of interest.
*
- *
When a subclass overrides a visitXYZ method, the
+ *
When a subclass overrides a visitXyz method, the
* new method can cause the enclosed elements to be scanned in the
- * default way by calling super.visitXYZ. In this
+ * default way by calling super.visitXyz. In this
* fashion, the concrete visitor can control the ordering of traversal
* over the component elements with respect to the additional
* processing; for example, consistently calling
- * super.visitXYZ at the start of the overridden
+ * super.visitXyz at the start of the overridden
* methods will yield a preorder traversal, etc. If the component
* elements should be traversed in some other order, instead of
- * calling super.visitXYZ, an overriding visit method
+ * calling super.visitXyz, an overriding visit method
* should call {@code scan} with the elements in the desired order.
*
*
Methods in this class may be overridden subject to their
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner9.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner9.java
index c7419c8921d..b7dd53bd9c8 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner9.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/ElementScanner9.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -34,26 +34,26 @@ import static javax.lang.model.SourceVersion.*;
/**
* A scanning visitor of program elements with default behavior
* appropriate for the {@link SourceVersion#RELEASE_9 RELEASE_9}
- * source version. The visitXYZ methods in this
+ * source version. The visitXyz methods in this
* class scan their component elements by calling {@code scan} on
* their {@linkplain Element#getEnclosedElements enclosed elements},
* {@linkplain ExecutableElement#getParameters parameters}, etc., as
* indicated in the individual method specifications. A subclass can
* control the order elements are visited by overriding the
- * visitXYZ methods. Note that clients of a scanner
+ * visitXyz methods. Note that clients of a scanner
* may get the desired behavior be invoking {@code v.scan(e, p)} rather
* than {@code v.visit(e, p)} on the root objects of interest.
*
- *
When a subclass overrides a visitXYZ method, the
+ *
When a subclass overrides a visitXyz method, the
* new method can cause the enclosed elements to be scanned in the
- * default way by calling super.visitXYZ. In this
+ * default way by calling super.visitXyz. In this
* fashion, the concrete visitor can control the ordering of traversal
* over the component elements with respect to the additional
* processing; for example, consistently calling
- * super.visitXYZ at the start of the overridden
+ * super.visitXyz at the start of the overridden
* methods will yield a preorder traversal, etc. If the component
* elements should be traversed in some other order, instead of
- * calling super.visitXYZ, an overriding visit method
+ * calling super.visitXyz, an overriding visit method
* should call {@code scan} with the elements in the desired order.
*
*
Methods in this class may be overridden subject to their
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor6.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor6.java
index 0006dd4c9df..a979ff5abba 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor6.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor6.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -63,15 +63,6 @@ import javax.annotation.processing.SupportedSourceVersion;
* behavior for the visit method in question. When the new visitor is
* introduced, all or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods
* @param
the type of the additional parameter to this visitor's methods.
*
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java
index c6d263fc63f..bb895bc7ac4 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, 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
@@ -58,15 +58,6 @@ import static javax.lang.model.SourceVersion.*;
* behavior for the visit method in question. When the new visitor is
* introduced, all or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods
* @param
the type of the additional parameter to this visitor's methods.
*
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java
index 1dd055350d0..957c556d014 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -58,15 +58,6 @@ import static javax.lang.model.SourceVersion.*;
* behavior for the visit method in question. When the new visitor is
* introduced, all or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods
* @param
the type of the additional parameter to this visitor's methods.
*
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor6.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor6.java
index 1f9ca8cab66..81fc96e0aae 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor6.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor6.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -65,15 +65,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@code Void}
* for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's methods. Use {@code Void}
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor7.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor7.java
index 2abe913110a..bbbd77bdb28 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor7.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor7.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, 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
@@ -62,15 +62,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@code Void}
* for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's methods. Use {@code Void}
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor8.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor8.java
index 22d50e7fd74..776bc6439a6 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor8.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleElementVisitor8.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -61,15 +61,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@code Void}
* for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's methods. Use {@code Void}
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor6.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor6.java
index 35ea1f71819..eba95187075 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor6.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor6.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -64,15 +64,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor7.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor7.java
index 99ec8f720b5..8a2e05f479c 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor7.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor7.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, 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
@@ -61,15 +61,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java
index 7636f2e03f5..098f5f0f353 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -61,15 +61,6 @@ import static javax.lang.model.SourceVersion.*;
* visit method in question. When the new visitor is introduced, all
* or portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor6.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor6.java
index 5ff4097e288..0917063e54e 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor6.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor6.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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
@@ -34,10 +34,10 @@ import static javax.lang.model.SourceVersion.*;
* A visitor of types based on their {@linkplain TypeKind kind} with
* default behavior appropriate for the {@link SourceVersion#RELEASE_6
* RELEASE_6} source version. For {@linkplain
- * TypeMirror types} XYZ that may have more than one
- * kind, the visitXYZ methods in this class delegate
- * to the visitXYZKind method corresponding to the
- * first argument's kind. The visitXYZKind methods
+ * TypeMirror types} Xyz that may have more than one
+ * kind, the visitXyz methods in this class delegate
+ * to the visitXyzAsKind method corresponding to the
+ * first argument's kind. The visitXyzAsKind methods
* call {@link #defaultAction defaultAction}, passing their arguments
* to {@code defaultAction}'s corresponding parameters.
*
@@ -63,15 +63,6 @@ import static javax.lang.model.SourceVersion.*;
* method in question. When the new visitor is introduced, all or
* portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor7.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor7.java
index c560914734a..22529917d49 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor7.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor7.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, 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
@@ -34,10 +34,10 @@ import javax.lang.model.SourceVersion;
* A visitor of types based on their {@linkplain TypeKind kind} with
* default behavior appropriate for the {@link SourceVersion#RELEASE_7
* RELEASE_7} source version. For {@linkplain
- * TypeMirror types} XYZ that may have more than one
- * kind, the visitXYZ methods in this class delegate
- * to the visitXYZKind method corresponding to the
- * first argument's kind. The visitXYZKind methods
+ * TypeMirror types} Xyz that may have more than one
+ * kind, the visitXyz methods in this class delegate
+ * to the visitXyzAsKind method corresponding to the
+ * first argument's kind. The visitXyzAsKind methods
* call {@link #defaultAction defaultAction}, passing their arguments
* to {@code defaultAction}'s corresponding parameters.
*
@@ -63,15 +63,6 @@ import javax.lang.model.SourceVersion;
* method in question. When the new visitor is introduced, all or
* portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor8.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor8.java
index c6e8387f0a7..63aea9a30eb 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor8.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor8.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -34,10 +34,10 @@ import static javax.lang.model.SourceVersion.*;
* A visitor of types based on their {@linkplain TypeKind kind} with
* default behavior appropriate for the {@link SourceVersion#RELEASE_8
* RELEASE_8} source version. For {@linkplain
- * TypeMirror types} XYZ that may have more than one
- * kind, the visitXYZ methods in this class delegate
- * to the visitXYZKind method corresponding to the
- * first argument's kind. The visitXYZKind methods
+ * TypeMirror types} Xyz that may have more than one
+ * kind, the visitXyz methods in this class delegate
+ * to the visitXyzAsKind method corresponding to the
+ * first argument's kind. The visitXyzAsKind methods
* call {@link #defaultAction defaultAction}, passing their arguments
* to {@code defaultAction}'s corresponding parameters.
*
@@ -63,15 +63,6 @@ import static javax.lang.model.SourceVersion.*;
* method in question. When the new visitor is introduced, all or
* portions of this visitor may be deprecated.
*
- *
Note that adding a default implementation of a new visit method
- * in a visitor class will occur instead of adding a default
- * method directly in the visitor interface since a Java SE 8
- * language feature cannot be used to this version of the API since
- * this version is required to be runnable on Java SE 7
- * implementations. Future versions of the API that are only required
- * to run on Java SE 8 and later may take advantage of default methods
- * in this situation.
- *
* @param the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param
the type of the additional parameter to this visitor's
diff --git a/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor9.java b/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor9.java
index 299969b39b3..7e958e65ebe 100644
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor9.java
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/TypeKindVisitor9.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -34,10 +34,10 @@ import static javax.lang.model.SourceVersion.*;
* A visitor of types based on their {@linkplain TypeKind kind} with
* default behavior appropriate for the {@link SourceVersion#RELEASE_9
* RELEASE_9} source version. For {@linkplain
- * TypeMirror types} XYZ that may have more than one
- * kind, the visitXYZ methods in this class delegate
- * to the visitXYZKind method corresponding to the
- * first argument's kind. The visitXYZKind methods
+ * TypeMirror types} Xyz that may have more than one
+ * kind, the visitXyz methods in this class delegate
+ * to the visitXyzAsKind method corresponding to the
+ * first argument's kind. The visitXyzAsKind methods
* call {@link #defaultAction defaultAction}, passing their arguments
* to {@code defaultAction}'s corresponding parameters.
*
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java
index a1a9c8f8f6e..046d333ad80 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java
@@ -921,6 +921,7 @@ public abstract class Symbol extends AnnoConstruct implements Element {
public PackageSymbol unnamedPackage;
public Map visiblePackages;
+ public Set readModules;
public List enclosedPackages = List.nil();
public Completer usesProvidesCompleter = Completer.NULL_COMPLETER;
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java
index f76205b8c95..f3fdb5d3486 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java
@@ -61,7 +61,6 @@ import com.sun.tools.javac.util.JavacMessages;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.util.Name;
import com.sun.tools.javac.util.Names;
-import com.sun.tools.javac.util.Options;
import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.code.Kinds.Kind.*;
@@ -469,9 +468,7 @@ public class Symtab {
scope.enter(errSymbol);
Source source = Source.instance(context);
- Options options = Options.instance(context);
- boolean noModules = options.isSet("noModules");
- if (source.allowModules() && !noModules) {
+ if (source.allowModules()) {
java_base = enterModule(names.java_base);
//avoid completing java.base during the Symtab initialization
java_base.completer = Completer.NULL_COMPLETER;
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java
index 93c5884633f..72c832f9a36 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Annotate.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -47,6 +47,7 @@ import java.util.*;
import static com.sun.tools.javac.code.Flags.SYNTHETIC;
import static com.sun.tools.javac.code.Kinds.Kind.MDL;
import static com.sun.tools.javac.code.Kinds.Kind.MTH;
+import static com.sun.tools.javac.code.Kinds.Kind.PCK;
import static com.sun.tools.javac.code.Kinds.Kind.VAR;
import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE;
import static com.sun.tools.javac.code.TypeTag.ARRAY;
@@ -228,7 +229,14 @@ public class Annotate {
s.resetAnnotations(); // mark Annotations as incomplete for now
normal(() -> {
- Assert.check(s.annotationsPendingCompletion());
+ // Packages are unusual, in that they are the only type of declaration that can legally appear
+ // more than once in a compilation, and in all cases refer to the same underlying symbol.
+ // This means they are the only kind of declaration that syntactically may have multiple sets
+ // of annotations, each on a different package declaration, even though that is ultimately
+ // forbidden by JLS 8 section 7.4.
+ // The corollary here is that all of the annotations on a package symbol may have already
+ // been handled, meaning that the set of annotations pending completion is now empty.
+ Assert.check(s.kind == PCK || s.annotationsPendingCompletion());
JavaFileObject prev = log.useSource(localEnv.toplevel.sourcefile);
DiagnosticPosition prevLintPos =
deferPos != null
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
index 9d3344c5b97..07f7975c1c3 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
@@ -353,7 +353,7 @@ public class Attr extends JCTree.Visitor {
@Override @DefinedBy(Api.COMPILER_TREE)
public Symbol visitMemberSelect(MemberSelectTree node, Env env) {
Symbol site = visit(node.getExpression(), env);
- if (site.kind == ERR || site.kind == ABSENT_TYP)
+ if (site.kind == ERR || site.kind == ABSENT_TYP || site.kind == HIDDEN)
return site;
Name name = (Name)node.getIdentifier();
if (site.kind == PCK) {
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java
index bf195d7b70a..b300770cd05 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -436,8 +436,10 @@ public class Check {
}
void clearLocalClassNameIndexes(ClassSymbol c) {
- localClassNameIndexes.remove(new Pair<>(
- c.owner.enclClass().flatname, c.name));
+ if (c.owner != null && c.owner.kind != NIL) {
+ localClassNameIndexes.remove(new Pair<>(
+ c.owner.enclClass().flatname, c.name));
+ }
}
public void newRound() {
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
index b4ef9d2a770..7868d9e6f9c 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java
@@ -792,6 +792,7 @@ public class LambdaToMethod extends TreeTranslator {
switch (tree.getTag()) {
case APPLY: ((JCMethodInvocation)tree).varargsElement = varargsElement; break;
case NEWCLASS: ((JCNewClass)tree).varargsElement = varargsElement; break;
+ case TYPECAST: setVarargsIfNeeded(((JCTypeCast) tree).expr, varargsElement); break;
default: throw new AssertionError();
}
}
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java
index f5a30ebaa5d..3add15e8909 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java
@@ -1327,6 +1327,7 @@ public class Modules extends JCTree.Visitor {
initAddExports();
msym.visiblePackages = new LinkedHashMap<>();
+ msym.readModules = new HashSet<>(readable);
Map seen = new HashMap<>();
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java
index f68f0fa5986..dfb28eca2cd 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java
@@ -54,14 +54,19 @@ import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType;
import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.Set;
+import java.util.function.BiFunction;
import java.util.function.BiPredicate;
+import java.util.function.Predicate;
import java.util.stream.Stream;
import javax.lang.model.element.ElementVisitor;
+import com.sun.tools.javac.code.Directive.ExportsDirective;
import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.code.Flags.BLOCK;
import static com.sun.tools.javac.code.Flags.STATIC;
@@ -69,6 +74,8 @@ import static com.sun.tools.javac.code.Kinds.*;
import static com.sun.tools.javac.code.Kinds.Kind.*;
import static com.sun.tools.javac.code.TypeTag.*;
import static com.sun.tools.javac.comp.Resolve.MethodResolutionPhase.*;
+import com.sun.tools.javac.resources.CompilerProperties.Errors;
+import com.sun.tools.javac.resources.CompilerProperties.Fragments;
import static com.sun.tools.javac.tree.JCTree.Tag.*;
/** Helper class for name resolution, used mostly by the attribution phase.
@@ -89,6 +96,7 @@ public class Resolve {
Check chk;
Infer infer;
ClassFinder finder;
+ ModuleFinder moduleFinder;
Types types;
JCDiagnostic.Factory diags;
public final boolean allowMethodHandles;
@@ -98,8 +106,6 @@ public class Resolve {
private final boolean compactMethodDiags;
final EnumSet verboseResolutionMode;
- private final boolean checkModuleAccess;
-
WriteableScope polymorphicSignatureScope;
protected Resolve(Context context) {
@@ -118,6 +124,7 @@ public class Resolve {
chk = Check.instance(context);
infer = Infer.instance(context);
finder = ClassFinder.instance(context);
+ moduleFinder = ModuleFinder.instance(context);
types = Types.instance(context);
diags = JCDiagnostic.Factory.instance(context);
Source source = Source.instance(context);
@@ -135,10 +142,6 @@ public class Resolve {
inapplicableMethodException = new InapplicableMethodException(diags);
allowModules = source.allowModules();
-
- // The following is required, for now, to support building
- // Swing beaninfo via javadoc.
- checkModuleAccess = !options.isSet("noModules");
}
/** error symbols, which are returned when resolution fails
@@ -321,8 +324,7 @@ public class Resolve {
isAccessible = true;
break;
case PUBLIC:
- isAccessible = true;
- if (allowModules && checkModuleAccess) {
+ if (allowModules) {
ModuleSymbol currModule = env.toplevel.modle;
currModule.complete();
PackageSymbol p = c.packge();
@@ -497,7 +499,7 @@ public class Resolve {
public Void visitClassType(ClassType t, Env env) {
visit(t.getTypeArguments(), env);
if (!isAccessible(env, t, true)) {
- accessBase(new AccessError(t.tsym), env.tree.pos(), env.enclClass.sym, t, t.tsym.name, true);
+ accessBase(new AccessError(env, null, t.tsym), env.tree.pos(), env.enclClass.sym, t, t.tsym.name, true);
}
return null;
}
@@ -1971,7 +1973,7 @@ public class Resolve {
Symbol loadClass(Env env, Name name) {
try {
ClassSymbol c = finder.loadClass(env.toplevel.modle, name);
- return isAccessible(env, c) ? c : new AccessError(c);
+ return isAccessible(env, c) ? c : new AccessError(env, null, c);
} catch (ClassFinder.BadClassFile err) {
throw err;
} catch (CompletionFailure ex) {
@@ -1989,20 +1991,29 @@ public class Resolve {
Symbol loadClass(Env env, Name name);
}
- private RecoveryLoadClass recoveryLoadClass = (env, name) -> {
- //even if a class cannot be found in the current module and packages in modules it depends on that
- //are exported for any or this module, the class may exist internally in some of these modules,
- //or may exist in a module on which this module does not depend. Provide better diagnostic in
- //such cases by looking for the class in any module:
- for (ModuleSymbol ms : syms.getAllModules()) {
- //do not load currently unloaded classes, to avoid too eager completion of random things in other modules:
- ClassSymbol clazz = syms.getClass(ms, name);
+ private RecoveryLoadClass recoveryLoadClass = new RecoveryLoadClass() {
+ @Override
+ public Symbol loadClass(Env env, Name name) {
+ if (allowModules) {
+ Scope importScope = env.toplevel.namedImportScope;
+ Symbol existing = importScope.findFirst(Convert.shortName(name),
+ sym -> sym.kind == TYP && sym.flatName() == name);
- if (clazz != null) {
- return new AccessError(clazz);
+ if (existing != null) {
+ return new InvisibleSymbolError(env, true, existing);
+ }
+
+ return lookupInvisibleSymbol(env, name, syms::getClass, (ms, n) -> {
+ try {
+ return finder.loadClass(ms, n);
+ } catch (CompletionFailure cf) {
+ //ignore
+ return null;
+ }
+ }, sym -> sym.kind == Kind.TYP, false, typeNotFound);
}
+ return null;
}
- return null;
};
public RecoveryLoadClass setRecoveryLoadClass(RecoveryLoadClass recovery) {
@@ -2011,6 +2022,84 @@ public class Resolve {
return prev;
}
+ Symbol lookupPackage(Env env, Name name) {
+ PackageSymbol pack = syms.lookupPackage(env.toplevel.modle, name);
+
+ if (allowModules && isImportOnDemand(env, name)) {
+ pack.complete();
+ if (!pack.exists()) {
+ Name nameAndDot = name.append('.', names.empty);
+ boolean prefixOfKnown =
+ env.toplevel.modle.visiblePackages.values()
+ .stream()
+ .anyMatch(p -> p.fullname.startsWith(nameAndDot));
+
+ return lookupInvisibleSymbol(env, name, syms::getPackage, syms::enterPackage, sym -> {
+ sym.complete();
+ return sym.exists();
+ }, prefixOfKnown, pack);
+ }
+ }
+
+ return pack;
+ }
+
+ private boolean isImportOnDemand(Env env, Name name) {
+ if (!env.tree.hasTag(IMPORT))
+ return false;
+
+ JCTree qualid = ((JCImport) env.tree).qualid;
+
+ if (!qualid.hasTag(SELECT))
+ return false;
+
+ if (TreeInfo.name(qualid) != names.asterisk)
+ return false;
+
+ return TreeInfo.fullName(((JCFieldAccess) qualid).selected) == name;
+ }
+
+ private Symbol lookupInvisibleSymbol(Env env,
+ Name name,
+ BiFunction get,
+ BiFunction load,
+ Predicate validate,
+ boolean suppressError,
+ Symbol defaultResult) {
+ //even if a class/package cannot be found in the current module and among packages in modules
+ //it depends on that are exported for any or this module, the class/package may exist internally
+ //in some of these modules, or may exist in a module on which this module does not depend.
+ //Provide better diagnostic in such cases by looking for the class in any module:
+ Set recoverableModules = new HashSet<>(syms.getAllModules());
+
+ recoverableModules.remove(env.toplevel.modle);
+
+ for (ModuleSymbol ms : recoverableModules) {
+ Symbol sym = get.apply(ms, name);
+
+ //avoid overly eager completing classes from source-based modules, as those
+ //may not be completable with the current compiler settings:
+ if (sym == null && (ms.sourceLocation == null)) {
+ if (ms.classLocation == null) {
+ ms = moduleFinder.findModule(ms);
+ }
+
+ if (ms.kind != ERR) {
+ sym = load.apply(ms, name);
+ }
+ }
+
+ if (sym == null)
+ continue;
+
+ if (validate.test(sym)) {
+ return new InvisibleSymbolError(env, suppressError, sym);
+ }
+ }
+
+ return defaultResult;
+ }
+
/**
* Find a type declared in a scope (not inherited). Return null
* if none is found.
@@ -2211,7 +2300,7 @@ public class Resolve {
}
if (kind.contains(KindSelector.PCK))
- return syms.lookupPackage(env.toplevel.modle, name);
+ return lookupPackage(env, name);
else return bestSoFar;
}
@@ -2225,11 +2314,6 @@ public class Resolve {
Name name, KindSelector kind) {
Name fullname = TypeSymbol.formFullName(name, pck);
Symbol bestSoFar = typeNotFound;
- PackageSymbol pack = null;
- if (kind.contains(KindSelector.PCK)) {
- pack = syms.lookupPackage(env.toplevel.modle, fullname);
- if (pack.exists()) return pack;
- }
if (kind.contains(KindSelector.TYP)) {
Symbol sym = loadClass(env, fullname);
if (sym.exists()) {
@@ -2238,7 +2322,10 @@ public class Resolve {
}
else bestSoFar = bestOf(bestSoFar, sym);
}
- return (pack != null) ? pack : bestSoFar;
+ if (kind.contains(KindSelector.PCK)) {
+ return lookupPackage(env, fullname);
+ }
+ return bestSoFar;
}
/** Find an identifier among the members of a given type `site'.
@@ -3947,10 +4034,6 @@ public class Resolve {
private Env env;
private Type site;
- AccessError(Symbol sym) {
- this(null, null, sym);
- }
-
AccessError(Env env, Type site, Symbol sym) {
super(HIDDEN, sym, "access error");
this.env = env;
@@ -3983,7 +4066,14 @@ public class Resolve {
if (sym.owner.kind == PCK) {
return diags.create(dkind, log.currentSource(),
pos, "not.def.access.package.cant.access",
- sym, sym.location());
+ sym, sym.location(), inaccessiblePackageReason(env, sym.packge()));
+ } else if ( sym.packge() != syms.rootPackage
+ && sym.packge().modle != env.toplevel.modle
+ && !isAccessible(env, sym.outermostClass())) {
+ return diags.create(dkind, log.currentSource(),
+ pos, "not.def.access.class.intf.cant.access.reason",
+ sym, sym.location(), sym.location().packge(),
+ inaccessiblePackageReason(env, sym.packge()));
} else {
return diags.create(dkind, log.currentSource(),
pos, "not.def.access.class.intf.cant.access",
@@ -4015,6 +4105,90 @@ public class Resolve {
}
}
+ class InvisibleSymbolError extends InvalidSymbolError {
+
+ private final Env env;
+ private final boolean suppressError;
+
+ InvisibleSymbolError(Env env, boolean suppressError, Symbol sym) {
+ super(HIDDEN, sym, "invisible class error");
+ this.env = env;
+ this.suppressError = suppressError;
+ this.name = sym.name;
+ }
+
+ @Override
+ JCDiagnostic getDiagnostic(JCDiagnostic.DiagnosticType dkind,
+ DiagnosticPosition pos,
+ Symbol location,
+ Type site,
+ Name name,
+ List argtypes,
+ List typeargtypes) {
+ if (suppressError)
+ return null;
+
+ if (sym.kind == PCK) {
+ JCDiagnostic details = inaccessiblePackageReason(env, sym.packge());
+ return diags.create(dkind, log.currentSource(),
+ pos, "package.not.visible", sym, details);
+ }
+
+ JCDiagnostic details = inaccessiblePackageReason(env, sym.packge());
+
+ if (pos.getTree() != null && pos.getTree().hasTag(SELECT) && sym.owner.kind == PCK) {
+ pos = ((JCFieldAccess) pos.getTree()).selected.pos();
+
+ return diags.create(dkind, log.currentSource(),
+ pos, "package.not.visible", sym.packge(), details);
+ }
+
+ return diags.create(dkind, log.currentSource(),
+ pos, "not.def.access.package.cant.access", sym, sym.packge(), details);
+ }
+ }
+
+ JCDiagnostic inaccessiblePackageReason(Env env, PackageSymbol sym) {
+ //no dependency:
+ if (!env.toplevel.modle.readModules.contains(sym.modle)) {
+ //does not read:
+ if (sym.modle != syms.unnamedModule) {
+ if (env.toplevel.modle != syms.unnamedModule) {
+ return diags.fragment(Fragments.NotDefAccessDoesNotRead(env.toplevel.modle,
+ sym,
+ sym.modle));
+ } else {
+ return diags.fragment(Fragments.NotDefAccessDoesNotReadFromUnnamed(sym,
+ sym.modle));
+ }
+ } else {
+ return diags.fragment(Fragments.NotDefAccessDoesNotReadUnnamed(sym,
+ env.toplevel.modle));
+ }
+ } else {
+ if (sym.packge().modle.exports.stream().anyMatch(e -> e.packge == sym)) {
+ //not exported to this module:
+ if (env.toplevel.modle != syms.unnamedModule) {
+ return diags.fragment(Fragments.NotDefAccessNotExportedToModule(sym,
+ sym.modle,
+ env.toplevel.modle));
+ } else {
+ return diags.fragment(Fragments.NotDefAccessNotExportedToModuleFromUnnamed(sym,
+ sym.modle));
+ }
+ } else {
+ //not exported:
+ if (env.toplevel.modle != syms.unnamedModule) {
+ return diags.fragment(Fragments.NotDefAccessNotExported(sym,
+ sym.modle));
+ } else {
+ return diags.fragment(Fragments.NotDefAccessNotExportedFromUnnamed(sym,
+ sym.modle));
+ }
+ }
+ }
+ }
+
/**
* InvalidSymbolError error class indicating that an instance member
* has erroneously been accessed from a static context.
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java
index 53ba2984b7e..6f619c35441 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, 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
@@ -410,7 +410,9 @@ public class TypeEnter implements Completer {
importNamedStatic(tree, p, name, localEnv);
chk.checkCanonical(imp.selected);
} else {
- TypeSymbol c = attribImportType(imp, localEnv).tsym;
+ Type importedType = attribImportType(imp, localEnv);
+ Type originalType = importedType.getOriginalType();
+ TypeSymbol c = originalType.hasTag(CLASS) ? originalType.tsym : importedType.tsym;
chk.checkCanonical(imp);
importNamed(tree.pos(), c, env, tree);
}
@@ -938,6 +940,7 @@ public class TypeEnter implements Completer {
*/
void finishClass(JCClassDecl tree, Env env) {
if ((tree.mods.flags & Flags.ENUM) != 0 &&
+ !tree.sym.type.hasTag(ERROR) &&
(types.supertype(tree.sym.type).tsym.flags() & Flags.ENUM) == 0) {
addEnumMembers(tree, env);
}
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Arguments.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Arguments.java
index cd47fde15aa..ba96d875153 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Arguments.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Arguments.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, 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
@@ -818,13 +818,17 @@ public class Arguments {
return List.nil();
String checkPackages = options.get(Option.XDOCLINT_PACKAGE);
-
if (checkPackages != null) {
for (String s : checkPackages.split("\\s+")) {
doclintOpts.add(DocLint.XCHECK_PACKAGE + s);
}
}
+ String format = options.get(Option.DOCLINT_FORMAT);
+ if (format != null) {
+ doclintOpts.add(DocLint.XHTML_VERSION_PREFIX + format);
+ }
+
// standard doclet normally generates H1, H2,
// so for now, allow user comments to assume that
doclintOpts.add(DocLint.XIMPLICIT_HEADERS + "2");
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java
index ec68764c882..9bfbbfdd571 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java
@@ -681,7 +681,7 @@ public class JavaCompiler {
if (sep == -1) {
msym = modules.getDefaultModule();
typeName = name;
- } else if (source.allowModules() && !options.isSet("noModules")) {
+ } else if (source.allowModules()) {
Name modName = names.fromString(name.substring(0, sep));
msym = moduleFinder.findModule(modName);
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java
index 052bf48de9e..1c27b8087f2 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2017, 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
@@ -154,6 +154,8 @@ public enum Option {
}
},
+ DOCLINT_FORMAT("--doclint-format", "opt.doclint.format", EXTENDED, BASIC, ONEOF, "html4", "html5"),
+
// -nowarn is retained for command-line backward compatibility
NOWARN("-nowarn", "opt.nowarn", STANDARD, BASIC) {
@Override
@@ -1216,10 +1218,12 @@ public enum Option {
sb.append(name);
if (argsNameKey == null) {
if (choices != null) {
+ if (!name.endsWith(":"))
+ sb.append(" ");
String sep = "{";
for (String choice : choices) {
sb.append(sep);
- sb.append(choices);
+ sb.append(choice);
sep = ",";
}
sb.append("}");
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacElements.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacElements.java
index c30ab765f5e..34cba3183d6 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacElements.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacElements.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, 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,11 @@
package com.sun.tools.javac.model;
+import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
+import java.util.stream.Collectors;
import javax.lang.model.AnnotatedConstruct;
import javax.lang.model.SourceVersion;
@@ -67,6 +69,7 @@ import static com.sun.tools.javac.code.TypeTag.CLASS;
import com.sun.tools.javac.comp.Modules;
import com.sun.tools.javac.comp.Resolve;
import com.sun.tools.javac.comp.Resolve.RecoveryLoadClass;
+import com.sun.tools.javac.resources.CompilerProperties.Notes;
import static com.sun.tools.javac.tree.JCTree.Tag.*;
/**
@@ -87,6 +90,8 @@ public class JavacElements implements Elements {
private final Enter enter;
private final Resolve resolve;
private final JavacTaskImpl javacTaskImpl;
+ private final Log log;
+ private final boolean allowModules;
public static JavacElements instance(Context context) {
JavacElements instance = context.get(JavacElements.class);
@@ -106,6 +111,9 @@ public class JavacElements implements Elements {
resolve = Resolve.instance(context);
JavacTask t = context.get(JavacTask.class);
javacTaskImpl = t instanceof JavacTaskImpl ? (JavacTaskImpl) t : null;
+ log = Log.instance(context);
+ Source source = Source.instance(context);
+ allowModules = source.allowModules();
}
@Override @DefinedBy(Api.LANGUAGE_MODEL)
@@ -134,7 +142,7 @@ public class JavacElements implements Elements {
ensureEntered("getPackageElement");
if (name.length() == 0)
return syms.unnamedModule.unnamedPackage;
- return doGetElement(module, name, PackageSymbol.class);
+ return doGetElement(module, "getPackageElement", name, PackageSymbol.class);
}
@Override @DefinedBy(Api.LANGUAGE_MODEL)
@@ -151,22 +159,27 @@ public class JavacElements implements Elements {
private ClassSymbol doGetTypeElement(ModuleElement module, CharSequence name) {
ensureEntered("getTypeElement");
- return doGetElement(module, name, ClassSymbol.class);
+ return doGetElement(module, "getTypeElement", name, ClassSymbol.class);
}
- private S doGetElement(ModuleElement module, CharSequence name, Class clazz) {
+ private S doGetElement(ModuleElement module, String methodName,
+ CharSequence name, Class clazz) {
String strName = name.toString();
if (!SourceVersion.isName(strName)) {
return null;
}
if (module == null) {
- return unboundNameToSymbol(strName, clazz);
+ return unboundNameToSymbol(methodName, strName, clazz);
} else {
return nameToSymbol((ModuleSymbol) module, strName, clazz);
}
}
- private S unboundNameToSymbol(String nameStr, Class clazz) {
+ private final Set alreadyWarnedDuplicates = new HashSet<>();
+
+ private S unboundNameToSymbol(String methodName,
+ String nameStr,
+ Class clazz) {
if (modules.getDefaultModule() == syms.noModule) { //not a modular mode:
return nameToSymbol(syms.noModule, nameStr, clazz);
}
@@ -179,12 +192,25 @@ public class JavacElements implements Elements {
S sym = nameToSymbol(msym, nameStr, clazz);
if (sym != null) {
- found.add(sym);
+ if (!allowModules || clazz == ClassSymbol.class || !sym.members().isEmpty()) {
+ //do not add packages without members:
+ found.add(sym);
+ }
}
}
if (found.size() == 1) {
return found.iterator().next();
+ } else if (found.size() > 1) {
+ //more than one element found, produce a note:
+ if (alreadyWarnedDuplicates.add(methodName + ":" + nameStr)) {
+ String moduleNames = found.stream()
+ .map(s -> s.packge().modle)
+ .map(m -> m.toString())
+ .collect(Collectors.joining(", "));
+ log.note(Notes.MultipleElements(methodName, nameStr, moduleNames));
+ }
+ return null;
} else {
//not found, or more than one element found:
return null;
@@ -222,41 +248,6 @@ public class JavacElements implements Elements {
}
}
- public JavacSourcePosition getSourcePosition(Element e) {
- Pair treeTop = getTreeAndTopLevel(e);
- if (treeTop == null)
- return null;
- JCTree tree = treeTop.fst;
- JCCompilationUnit toplevel = treeTop.snd;
- JavaFileObject sourcefile = toplevel.sourcefile;
- if (sourcefile == null)
- return null;
- return new JavacSourcePosition(sourcefile, tree.pos, toplevel.lineMap);
- }
-
- public JavacSourcePosition getSourcePosition(Element e, AnnotationMirror a) {
- Pair treeTop = getTreeAndTopLevel(e);
- if (treeTop == null)
- return null;
- JCTree tree = treeTop.fst;
- JCCompilationUnit toplevel = treeTop.snd;
- JavaFileObject sourcefile = toplevel.sourcefile;
- if (sourcefile == null)
- return null;
-
- JCTree annoTree = matchAnnoToTree(a, e, tree);
- if (annoTree == null)
- return null;
- return new JavacSourcePosition(sourcefile, annoTree.pos,
- toplevel.lineMap);
- }
-
- public JavacSourcePosition getSourcePosition(Element e, AnnotationMirror a,
- AnnotationValue v) {
- // TODO: better accuracy in getSourcePosition(... AnnotationValue)
- return getSourcePosition(e, a);
- }
-
/**
* Returns the tree for an annotation given the annotated element
* and the element's own tree. Returns null if the tree cannot be found.
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacSourcePosition.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacSourcePosition.java
deleted file mode 100644
index 3cc14752686..00000000000
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacSourcePosition.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.tools.javac.model;
-
-import javax.tools.JavaFileObject;
-import com.sun.tools.javac.util.Position;
-
-/**
- * Implementation of model API SourcePosition based on javac internal state.
- *
- *
This is NOT part of any supported API.
- * If you write code that depends on this, you do so at your own
- * risk. This code and its internal interfaces are subject to change
- * or deletion without notice.
- */
-class JavacSourcePosition {
-
- final JavaFileObject sourcefile;
- final int pos;
- final Position.LineMap lineMap;
-
- JavacSourcePosition(JavaFileObject sourcefile,
- int pos,
- Position.LineMap lineMap) {
- this.sourcefile = sourcefile;
- this.pos = pos;
- this.lineMap = (pos != Position.NOPOS) ? lineMap : null;
- }
-
- public JavaFileObject getFile() {
- return sourcefile;
- }
-
- public int getOffset() {
- return pos; // makes use of fact that Position.NOPOS == -1
- }
-
- public int getLine() {
- return (lineMap != null) ? lineMap.getLineNumber(pos) : -1;
- }
-
- public int getColumn() {
- return (lineMap != null) ? lineMap.getColumnNumber(pos) : -1;
- }
-
- public String toString() {
- int line = getLine();
- return (line > 0)
- ? sourcefile + ":" + line
- : sourcefile.toString();
- }
-}
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java
index f6760de482a..e3321892fbe 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java
@@ -230,7 +230,7 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea
chk = Check.instance(context);
initProcessorLoader();
- allowModules = source.allowModules() && options.isUnset("noModules");
+ allowModules = source.allowModules();
}
public void setProcessors(Iterable extends Processor> processors) {
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties
index 3357e2b871c..5da57e1e35c 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2017, 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
@@ -823,17 +823,87 @@ compiler.err.no.match.entry=\
compiler.err.not.annotation.type=\
{0} is not an annotation type
-# 0: symbol, 1: symbol
+# 0: symbol, 1: symbol, 2: message segment
compiler.err.not.def.access.package.cant.access=\
- {0} is not visible because package {1} is not visible
+ {0} is not visible\n\
+ ({2})
+
+# 0: symbol, 1: symbol, 2: message segment
+compiler.misc.not.def.access.package.cant.access=\
+ {0} is not visible\n\
+ ({2})
+
+# 0: symbol, 1: message segment
+compiler.err.package.not.visible=\
+ package {0} is not visible\n\
+ ({1})
+
+# 0: symbol, 1: message segment
+compiler.misc.package.not.visible=\
+ package {0} is not visible\n\
+ ({1})
+
+# {0} - current module
+# {1} - package in which the invisible class is declared
+# {2} - module in which {1} is declared
+# 0: symbol, 1: symbol, 2: symbol
+compiler.misc.not.def.access.does.not.read=\
+ package {1} is declared in module {2}, but module {0} does not read it
+
+# {0} - package in which the invisible class is declared
+# {1} - module in which {0} is declared
+# 0: symbol, 1: symbol
+compiler.misc.not.def.access.does.not.read.from.unnamed=\
+ package {0} is declared in module {1}, which is not in the module graph
+
+# {0} - package in which the invisible class is declared
+# {1} - current module
+# 0: symbol, 1: symbol
+compiler.misc.not.def.access.does.not.read.unnamed=\
+ package {0} is declared in the unnamed module, but module {0} does not read it
+
+# {0} - package in which the invisible class is declared
+# {1} - module in which {0} is declared
+# 0: symbol, 1: symbol
+compiler.misc.not.def.access.not.exported=\
+ package {0} is declared in module {1}, which does not export it
+
+# {0} - package in which the invisible class is declared
+# {1} - module in which {0} is declared
+# 0: symbol, 1: symbol
+compiler.misc.not.def.access.not.exported.from.unnamed=\
+ package {0} is declared in module {1}, which does not export it
+
+# {0} - package in which the invisible class is declared
+# {1} - module in which {0} is declared
+# {2} - current module
+# 0: symbol, 1: symbol, 2: symbol
+compiler.misc.not.def.access.not.exported.to.module=\
+ package {0} is declared in module {1}, which does not export it to module {2}
+
+# {0} - package in which the invisible class is declared
+# {1} - module in which {0} is declared
+# 0: symbol, 1: symbol
+compiler.misc.not.def.access.not.exported.to.module.from.unnamed=\
+ package {0} is declared in module {1}, which does not export it to the unnamed module
# 0: symbol, 1: symbol
compiler.err.not.def.access.class.intf.cant.access=\
- {0} in {1} is defined in an inaccessible class or interface
+ {1}.{0} is defined in an inaccessible class or interface
# 0: symbol, 1: symbol
compiler.misc.not.def.access.class.intf.cant.access=\
- {0} in {1} is defined in an inaccessible class or interface
+ {1}.{0} is defined in an inaccessible class or interface
+
+# 0: symbol, 1: symbol, 2: symbol, 3: message segment
+compiler.err.not.def.access.class.intf.cant.access.reason=\
+ {1}.{0} in package {2} is not accessible\n\
+ ({3})
+
+# 0: symbol, 1: symbol, 2: symbol, 3: message segment
+compiler.misc.not.def.access.class.intf.cant.access.reason=\
+ {1}.{0} in package {2} is not accessible\n\
+ ({3})
# 0: symbol, 1: list of type, 2: type
compiler.misc.cant.access.inner.cls.constr=\
@@ -1366,6 +1436,10 @@ compiler.note.unchecked.plural.additional=\
compiler.note.proc.messager=\
{0}
+# 0: string, 1: string, 2: string
+compiler.note.multiple.elements=\
+ Multiple elements named '{1}' in modules '{2}' were found by javax.lang.model.util.Elements.{0}.
+
#####
# 0: number
diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties
index 2a461a3e600..7a637a48d20 100644
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2017, 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
@@ -263,6 +263,9 @@ javac.opt.Xdoclint.package.desc=\
expands to all sub-packages of the given package. Each can be prefixed\n\
with '-' to disable checks for the specified package or packages.
+javac.opt.doclint.format=\
+ Specify the format for documentation comments
+
javac.opt.Xstdout=\
Redirect standard output
javac.opt.X=\
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/debug/InternalDebugControl.java b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/debug/InternalDebugControl.java
index 4f759c7632c..8aa204240d0 100644
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/debug/InternalDebugControl.java
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/debug/InternalDebugControl.java
@@ -68,6 +68,11 @@ public class InternalDebugControl {
*/
public static final int DBG_EVNT = 0b0010000;
+ /**
+ * Event debugging.
+ */
+ public static final int DBG_WRAP = 0b0100000;
+
private static Map debugMap = null;
/**
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java
index 1d55473db48..4d80149d421 100644
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java
@@ -119,6 +119,7 @@ import static jdk.internal.jshell.debug.InternalDebugControl.DBG_DEP;
import static jdk.internal.jshell.debug.InternalDebugControl.DBG_EVNT;
import static jdk.internal.jshell.debug.InternalDebugControl.DBG_FMGR;
import static jdk.internal.jshell.debug.InternalDebugControl.DBG_GEN;
+import static jdk.internal.jshell.debug.InternalDebugControl.DBG_WRAP;
import static jdk.internal.jshell.tool.ContinuousCompletionProvider.STARTSWITH_MATCHER;
/**
@@ -217,7 +218,7 @@ public class JShellTool implements MessageHandler {
static final String DEFAULT_STARTUP_NAME = "DEFAULT";
static final Pattern BUILTIN_FILE_PATTERN = Pattern.compile("\\w+");
- static final String BUILTIN_FILE_PATH_FORMAT = "jrt:/jdk.jshell/jdk/jshell/tool/resources/%s.jsh";
+ static final String BUILTIN_FILE_PATH_FORMAT = "/jdk/jshell/tool/resources/%s.jsh";
// match anything followed by whitespace
private static final Pattern OPTION_PRE_PATTERN =
@@ -1919,9 +1920,13 @@ public class JShellTool implements MessageHandler {
flags |= DBG_EVNT;
fluff("Event debugging on");
break;
+ case 'w':
+ flags |= DBG_WRAP;
+ fluff("Wrap debugging on");
+ break;
default:
hard("Unknown debugging option: %c", ch);
- fluff("Use: 0 r g f c d");
+ fluff("Use: 0 r g f c d e w");
return false;
}
}
@@ -2421,9 +2426,11 @@ public class JShellTool implements MessageHandler {
String readResource(String name) throws IOException {
// Attempt to find the file as a resource
String spec = String.format(BUILTIN_FILE_PATH_FORMAT, name);
- URL url = new URL(spec);
- BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
- return reader.lines().collect(Collectors.joining("\n"));
+
+ try (InputStream in = JShellTool.class.getResourceAsStream(spec);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
+ return reader.lines().collect(Collectors.joining("\n"));
+ }
}
// retrieve the default startup string
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/StopDetectingInputStream.java b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/StopDetectingInputStream.java
index 9a103c63d99..578f5cf6893 100644
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/StopDetectingInputStream.java
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/StopDetectingInputStream.java
@@ -66,7 +66,7 @@ public final class StopDetectingInputStream extends InputStream {
if ((read = input.read()) == (-1)) {
break;
}
- if (read == 3 && currentState == State.BUFFER) {
+ if (read == 3 && getState() == State.BUFFER) {
stop.run();
} else {
write(read);
@@ -141,6 +141,10 @@ public final class StopDetectingInputStream extends InputStream {
}
}
+ private synchronized State getState() {
+ return state;
+ }
+
private synchronized State waitInputNeeded() {
while (state == State.WAIT) {
try {
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/Eval.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/Eval.java
index a033b9fd757..de259506ac4 100644
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/Eval.java
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/Eval.java
@@ -49,6 +49,7 @@ import java.io.StringWriter;
import java.io.Writer;
import java.util.LinkedHashSet;
import java.util.Set;
+import jdk.jshell.ExpressionToTypeInfo.ExpressionInfo;
import jdk.jshell.Key.ErroneousKey;
import jdk.jshell.Key.MethodKey;
import jdk.jshell.Key.TypeDeclKey;
@@ -58,7 +59,6 @@ import jdk.jshell.TaskFactory.AnalyzeTask;
import jdk.jshell.TaskFactory.BaseTask;
import jdk.jshell.TaskFactory.CompileTask;
import jdk.jshell.TaskFactory.ParseTask;
-import jdk.jshell.TreeDissector.ExpressionInfo;
import jdk.jshell.Wrap.Range;
import jdk.jshell.Snippet.Status;
import jdk.jshell.spi.ExecutionControl.ClassBytecodes;
@@ -296,7 +296,7 @@ class Eval {
private List processExpression(String userSource, String compileSource) {
String name = null;
- ExpressionInfo ei = typeOfExpression(compileSource);
+ ExpressionInfo ei = ExpressionToTypeInfo.expressionInfo(compileSource, state);
ExpressionTree assignVar;
Wrap guts;
Snippet snip;
@@ -499,16 +499,6 @@ class Eval {
return singletonList(snip);
}
- private ExpressionInfo typeOfExpression(String expression) {
- Wrap guts = Wrap.methodReturnWrap(expression);
- TaskFactory.AnalyzeTask at = trialCompile(guts);
- if (!at.hasErrors() && at.firstCuTree() != null) {
- return TreeDissector.createByFirstClass(at)
- .typeOfReturnStatement(at, state);
- }
- return null;
- }
-
/**
* Should a temp var wrap the expression. TODO make this user configurable.
*
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/ExpressionToTypeInfo.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/ExpressionToTypeInfo.java
new file mode 100644
index 00000000000..f33c37133a6
--- /dev/null
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/ExpressionToTypeInfo.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.jshell;
+
+import com.sun.source.tree.ReturnTree;
+import com.sun.source.tree.ClassTree;
+import com.sun.source.tree.CompilationUnitTree;
+import com.sun.source.tree.ConditionalExpressionTree;
+import com.sun.source.tree.ExpressionTree;
+import com.sun.source.tree.MethodTree;
+import com.sun.source.tree.Tree;
+import com.sun.source.util.TreePath;
+import com.sun.source.util.TreePathScanner;
+import com.sun.tools.javac.code.Symtab;
+import com.sun.tools.javac.code.Type;
+import com.sun.tools.javac.code.Types;
+import jdk.jshell.TaskFactory.AnalyzeTask;
+
+/**
+ * Compute information about an expression string, particularly its type name.
+ */
+class ExpressionToTypeInfo {
+
+ private static final String OBJECT_TYPE_NAME = "Object";
+
+ final AnalyzeTask at;
+ final CompilationUnitTree cu;
+ final JShell state;
+ final Symtab syms;
+ final Types types;
+
+ private ExpressionToTypeInfo(AnalyzeTask at, CompilationUnitTree cu, JShell state) {
+ this.at = at;
+ this.cu = cu;
+ this.state = state;
+ this.syms = Symtab.instance(at.context);
+ this.types = Types.instance(at.context);
+ }
+
+ public static class ExpressionInfo {
+ ExpressionTree tree;
+ String typeName;
+ boolean isNonVoid;
+ }
+
+ // return mechanism and other general structure from TreePath.getPath()
+ private static class Result extends Error {
+
+ static final long serialVersionUID = -5942088234594905629L;
+ final TreePath expressionPath;
+
+ Result(TreePath path) {
+ this.expressionPath = path;
+ }
+ }
+
+ private static class PathFinder extends TreePathScanner {
+
+ // Optimize out imports etc
+ @Override
+ public TreePath visitCompilationUnit(CompilationUnitTree node, Boolean isTargetContext) {
+ return scan(node.getTypeDecls(), isTargetContext);
+ }
+
+ // Only care about members
+ @Override
+ public TreePath visitClass(ClassTree node, Boolean isTargetContext) {
+ return scan(node.getMembers(), isTargetContext);
+ }
+
+ // Only want the doit method where the code is
+ @Override
+ public TreePath visitMethod(MethodTree node, Boolean isTargetContext) {
+ if (Util.isDoIt(node.getName())) {
+ return scan(node.getBody(), true);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public TreePath visitReturn(ReturnTree node, Boolean isTargetContext) {
+ ExpressionTree tree = node.getExpression();
+ TreePath tp = new TreePath(getCurrentPath(), tree);
+ if (isTargetContext) {
+ throw new Result(tp);
+ } else {
+ return null;
+ }
+ }
+ }
+
+ private Type pathToType(TreePath tp) {
+ return (Type) at.trees().getTypeMirror(tp);
+ }
+
+ private Type pathToType(TreePath tp, Tree tree) {
+ if (tree instanceof ConditionalExpressionTree) {
+ // Conditionals always wind up as Object -- this corrects
+ ConditionalExpressionTree cet = (ConditionalExpressionTree) tree;
+ Type tmt = pathToType(new TreePath(tp, cet.getTrueExpression()));
+ Type tmf = pathToType(new TreePath(tp, cet.getFalseExpression()));
+ if (!tmt.isPrimitive() && !tmf.isPrimitive()) {
+ Type lub = types.lub(tmt, tmf);
+ // System.err.printf("cond ? %s : %s -- lub = %s\n",
+ // varTypeName(tmt), varTypeName(tmf), varTypeName(lub));
+ return lub;
+ }
+ }
+ return pathToType(tp);
+ }
+
+ /**
+ * Entry method: get expression info
+ * @param code the expression as a string
+ * @param state a JShell instance
+ * @return type information
+ */
+ public static ExpressionInfo expressionInfo(String code, JShell state) {
+ if (code == null || code.isEmpty()) {
+ return null;
+ }
+ try {
+ OuterWrap codeWrap = state.outerMap.wrapInTrialClass(Wrap.methodReturnWrap(code));
+ AnalyzeTask at = state.taskFactory.new AnalyzeTask(codeWrap);
+ CompilationUnitTree cu = at.firstCuTree();
+ if (at.hasErrors() || cu == null) {
+ return null;
+ }
+ return new ExpressionToTypeInfo(at, cu, state).typeOfExpression();
+ } catch (Exception ex) {
+ return null;
+ }
+ }
+
+ private ExpressionInfo typeOfExpression() {
+ return treeToInfo(findExpressionPath());
+ }
+
+ private TreePath findExpressionPath() {
+ try {
+ new PathFinder().scan(new TreePath(cu), false);
+ } catch (Result result) {
+ return result.expressionPath;
+ }
+ return null;
+ }
+
+ private ExpressionInfo treeToInfo(TreePath tp) {
+ if (tp != null) {
+ Tree tree = tp.getLeaf();
+ if (tree instanceof ExpressionTree) {
+ ExpressionInfo ei = new ExpressionInfo();
+ ei.tree = (ExpressionTree) tree;
+ Type type = pathToType(tp, tree);
+ if (type != null) {
+ switch (type.getKind()) {
+ case VOID:
+ case NONE:
+ case ERROR:
+ case OTHER:
+ break;
+ case NULL:
+ ei.isNonVoid = true;
+ ei.typeName = OBJECT_TYPE_NAME;
+ break;
+ default: {
+ ei.isNonVoid = true;
+ ei.typeName = varTypeName(type);
+ if (ei.typeName == null) {
+ ei.typeName = OBJECT_TYPE_NAME;
+ }
+ break;
+ }
+ }
+ }
+ return ei;
+ }
+ }
+ return null;
+ }
+
+ private String varTypeName(Type type) {
+ try {
+ TypePrinter tp = new VarTypePrinter(at.messages(),
+ state.maps::fullClassNameAndPackageToClass, syms, types);
+ return tp.toString(type);
+ } catch (Exception ex) {
+ return null;
+ }
+ }
+
+}
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java
index 7241b1383dc..2ebc424b151 100644
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/SourceCodeAnalysisImpl.java
@@ -105,7 +105,6 @@ import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.collectingAndThen;
-import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toCollection;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;
@@ -128,6 +127,7 @@ import javax.lang.model.util.Types;
import javax.tools.JavaFileManager.Location;
import javax.tools.StandardLocation;
+import jdk.jshell.ExpressionToTypeInfo.ExpressionInfo;
import static jdk.jshell.Util.REPL_DOESNOTMATTER_CLASS_NAME;
import static jdk.jshell.SourceCodeAnalysis.Completeness.DEFINITELY_INCOMPLETE;
import static jdk.jshell.TreeDissector.printType;
@@ -1430,47 +1430,17 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis {
@Override
public String analyzeType(String code, int cursor) {
- code = code.substring(0, cursor);
- CompletionInfo completionInfo = analyzeCompletion(code);
- if (!completionInfo.completeness().isComplete())
- return null;
- if (completionInfo.completeness() == Completeness.COMPLETE_WITH_SEMI) {
- code += ";";
- }
-
- OuterWrap codeWrap;
switch (guessKind(code)) {
case IMPORT: case METHOD: case CLASS: case ENUM:
case INTERFACE: case ANNOTATION_TYPE: case VARIABLE:
return null;
default:
- codeWrap = proc.outerMap.wrapInTrialClass(Wrap.methodWrap(code));
break;
}
- AnalyzeTask at = proc.taskFactory.new AnalyzeTask(codeWrap);
- SourcePositions sp = at.trees().getSourcePositions();
- CompilationUnitTree topLevel = at.firstCuTree();
- int pos = codeWrap.snippetIndexToWrapIndex(code.length());
- TreePath tp = pathFor(topLevel, sp, pos);
- while (ExpressionTree.class.isAssignableFrom(tp.getParentPath().getLeaf().getKind().asInterface()) &&
- tp.getParentPath().getLeaf().getKind() != Kind.ERRONEOUS &&
- tp.getParentPath().getParentPath() != null)
- tp = tp.getParentPath();
- TypeMirror type = at.trees().getTypeMirror(tp);
-
- if (type == null)
- return null;
-
- switch (type.getKind()) {
- case ERROR: case NONE: case OTHER:
- case PACKAGE: case VOID:
- return null; //not usable
- case NULL:
- type = at.getElements().getTypeElement("java.lang.Object").asType();
- break;
- }
-
- return TreeDissector.printType(at, proc, type);
+ ExpressionInfo ei = ExpressionToTypeInfo.expressionInfo(code, proc);
+ return (ei == null || !ei.isNonVoid)
+ ? null
+ : ei.typeName;
}
@Override
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java
index fc5282122e8..6b2d441eb74 100644
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TaskFactory.java
@@ -321,7 +321,7 @@ class TaskFactory {
final JavacTaskImpl task;
private DiagList diags = null;
private final SourceHandler> sourceHandler;
- private final Context context = new Context();
+ final Context context = new Context();
private Types types;
private JavacMessages messages;
private Trees trees;
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TreeDissector.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TreeDissector.java
index c9fd4cedc59..b177bf2db02 100644
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TreeDissector.java
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TreeDissector.java
@@ -28,14 +28,11 @@ package jdk.jshell;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.CompilationUnitTree;
-import com.sun.source.tree.ExpressionTree;
import com.sun.source.tree.MethodTree;
-import com.sun.source.tree.ReturnTree;
import com.sun.source.tree.StatementTree;
import com.sun.source.tree.Tree;
import com.sun.source.tree.VariableTree;
import com.sun.source.util.SourcePositions;
-import com.sun.source.util.TreePath;
import com.sun.source.util.Trees;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.code.Type.MethodType;
@@ -47,7 +44,6 @@ import jdk.jshell.TaskFactory.AnalyzeTask;
import jdk.jshell.Wrap.Range;
import java.util.List;
-import java.util.Locale;
import java.util.function.Predicate;
import java.util.stream.Stream;
@@ -61,16 +57,6 @@ import jdk.jshell.Util.Pair;
class TreeDissector {
- private static final String OBJECT_TYPE = "Object";
-
- static class ExpressionInfo {
-
- boolean isNonVoid;
- String typeName;
- ExpressionTree tree;
- String signature;
- }
-
private final TaskFactory.BaseTask bt;
private final ClassTree targetClass;
private final CompilationUnitTree targetCompilationUnit;
@@ -219,41 +205,6 @@ class TreeDissector {
return null;
}
-
- ExpressionInfo typeOfReturnStatement(AnalyzeTask at, JShell state) {
- ExpressionInfo ei = new ExpressionInfo();
- Tree unitTree = firstStatement();
- if (unitTree instanceof ReturnTree) {
- ei.tree = ((ReturnTree) unitTree).getExpression();
- if (ei.tree != null) {
- TreePath viPath = trees().getPath(targetCompilationUnit, ei.tree);
- if (viPath != null) {
- TypeMirror tm = trees().getTypeMirror(viPath);
- if (tm != null) {
- ei.typeName = printType(at, state, tm);
- switch (tm.getKind()) {
- case VOID:
- case NONE:
- case ERROR:
- case OTHER:
- break;
- case NULL:
- ei.isNonVoid = true;
- ei.typeName = OBJECT_TYPE;
- break;
- default: {
- ei.isNonVoid = true;
- break;
-
- }
- }
- }
- }
- }
- }
- return ei;
- }
-
String typeOfMethod(MethodSnippet msn) {
Tree unitTree = method(msn);
if (unitTree instanceof JCMethodDecl) {
@@ -274,8 +225,13 @@ class TreeDissector {
public static String printType(AnalyzeTask at, JShell state, TypeMirror type) {
Type typeImpl = (Type) type;
- TypePrinter tp = new TypePrinter(at.messages(), state.maps::fullClassNameAndPackageToClass, typeImpl);
- return tp.visit(typeImpl, Locale.getDefault());
+ try {
+ TypePrinter tp = new TypePrinter(at.messages(),
+ state.maps::fullClassNameAndPackageToClass);
+ return tp.toString(typeImpl);
+ } catch (Exception ex) {
+ return null;
+ }
}
/**
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TypePrinter.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TypePrinter.java
index e35fe5e7d7b..b5ae176fbf5 100644
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/TypePrinter.java
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/TypePrinter.java
@@ -22,7 +22,6 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
-
package jdk.jshell;
import static com.sun.tools.javac.code.Flags.COMPOUND;
@@ -41,17 +40,21 @@ import java.util.function.BinaryOperator;
* Print types in source form.
*/
class TypePrinter extends Printer {
+
private static final String OBJECT = "Object";
private final JavacMessages messages;
private final BinaryOperator fullClassNameAndPackageToClass;
- private boolean useWildCard = false;
- TypePrinter(JavacMessages messages, BinaryOperator fullClassNameAndPackageToClass, Type typeToPrint) {
+ TypePrinter(JavacMessages messages, BinaryOperator fullClassNameAndPackageToClass) {
this.messages = messages;
this.fullClassNameAndPackageToClass = fullClassNameAndPackageToClass;
}
+ String toString(Type t) {
+ return visit(t, Locale.getDefault());
+ }
+
@Override
protected String localize(Locale locale, String key, Object... args) {
return messages.getLocalizedString(locale, key, args);
@@ -67,18 +70,6 @@ class TypePrinter extends Printer {
return visit(t.wildcard, locale);
}
- @Override
- public String visitWildcardType(Type.WildcardType wt, Locale locale) {
- if (useWildCard) { // at TypeArgument(ex: List extends T>)
- return super.visitWildcardType(wt, locale);
- } else { // at TopLevelType(ex: ? extends List, ? extends Number[][])
- Type extendsBound = wt.getExtendsBound();
- return extendsBound == null
- ? OBJECT
- : visit(extendsBound, locale);
- }
- }
-
@Override
public String visitType(Type t, Locale locale) {
String s = (t.tsym == null || t.tsym.name == null)
@@ -87,20 +78,9 @@ class TypePrinter extends Printer {
return s;
}
- @Override
- public String visitClassType(ClassType ct, Locale locale) {
- boolean prevUseWildCard = useWildCard;
- try {
- useWildCard = true;
- return super.visitClassType(ct, locale);
- } finally {
- useWildCard = prevUseWildCard;
- }
- }
-
/**
- * Converts a class name into a (possibly localized) string. Anonymous
- * inner classes get converted into a localized string.
+ * Converts a class name into a (possibly localized) string. Anonymous inner
+ * classes get converted into a localized string.
*
* @param t the type of the class whose name is to be rendered
* @param longform if set, the class' fullname is displayed - if unset the
@@ -112,21 +92,13 @@ class TypePrinter extends Printer {
protected String className(ClassType t, boolean longform, Locale locale) {
Symbol sym = t.tsym;
if (sym.name.length() == 0 && (sym.flags() & COMPOUND) != 0) {
- /***
- StringBuilder s = new StringBuilder(visit(t.supertype_field, locale));
- for (List is = t.interfaces_field; is.nonEmpty(); is = is.tail) {
- s.append('&');
- s.append(visit(is.head, locale));
- }
- return s.toString();
- ***/
return OBJECT;
} else if (sym.name.length() == 0) {
// Anonymous
String s;
ClassType norm = (ClassType) t.tsym.type;
if (norm == null) {
- s = "object";
+ s = OBJECT;
} else if (norm.interfaces_field != null && norm.interfaces_field.nonEmpty()) {
s = visit(norm.interfaces_field.head, locale);
} else {
@@ -160,7 +132,7 @@ class TypePrinter extends Printer {
@Override
public String visitPackageSymbol(PackageSymbol s, Locale locale) {
return s.isUnnamed()
- ? "" // Unnamed package
+ ? "" // Unnamed package
: s.fullname.toString();
}
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/Unit.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/Unit.java
index c56db661ed2..555598ca9b4 100644
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/Unit.java
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/Unit.java
@@ -46,6 +46,7 @@ import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;
import static jdk.internal.jshell.debug.InternalDebugControl.DBG_EVNT;
import static jdk.internal.jshell.debug.InternalDebugControl.DBG_GEN;
+import static jdk.internal.jshell.debug.InternalDebugControl.DBG_WRAP;
import static jdk.jshell.Snippet.Status.OVERWRITTEN;
import static jdk.jshell.Snippet.Status.RECOVERABLE_DEFINED;
import static jdk.jshell.Snippet.Status.RECOVERABLE_NOT_DEFINED;
@@ -180,6 +181,8 @@ final class Unit {
.collect(toList());
// Set the outer wrap for this snippet
si.setOuterWrap(state.outerMap.wrapInClass(except, plus, snippets, wraps));
+ state.debug(DBG_WRAP, "++setWrap() %s\n%s\n",
+ si, si.outerWrap().wrapped());
}
}
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/VarTypePrinter.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/VarTypePrinter.java
new file mode 100644
index 00000000000..239152e19d6
--- /dev/null
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/VarTypePrinter.java
@@ -0,0 +1,265 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.jshell;
+
+import java.util.HashSet;
+import com.sun.tools.javac.code.Type;
+import com.sun.tools.javac.code.Type.ClassType;
+import com.sun.tools.javac.util.JavacMessages;
+import java.util.Locale;
+import java.util.Set;
+import java.util.function.BinaryOperator;
+import com.sun.tools.javac.code.BoundKind;
+import com.sun.tools.javac.code.Flags;
+import com.sun.tools.javac.code.Symtab;
+import com.sun.tools.javac.code.Type.CapturedType;
+import com.sun.tools.javac.code.Type.TypeMapping;
+import com.sun.tools.javac.code.Type.TypeVar;
+import com.sun.tools.javac.code.Type.WildcardType;
+import com.sun.tools.javac.code.Types;
+import com.sun.tools.javac.code.Types.SimpleVisitor;
+import com.sun.tools.javac.util.List;
+import static com.sun.tools.javac.code.BoundKind.EXTENDS;
+import static com.sun.tools.javac.code.BoundKind.SUPER;
+import static com.sun.tools.javac.code.BoundKind.UNBOUND;
+import static com.sun.tools.javac.code.Type.ArrayType;
+import static com.sun.tools.javac.code.TypeTag.BOT;
+import static com.sun.tools.javac.code.TypeTag.WILDCARD;
+
+/**
+ * Print variable types in source form.
+ * TypeProjection and CaptureScanner are copied from Types in the JEP-286
+ * Sandbox by Maurizio. The checks for Non-Denotable in TypePrinter are
+ * cribbed from denotableChecker of the same source.
+ *
+ * @author Maurizio Cimadamore
+ * @author Robert Field
+ */
+class VarTypePrinter extends TypePrinter {
+ private static final String WILD = "?";
+
+ private final Symtab syms;
+ private final Types types;
+
+ VarTypePrinter(JavacMessages messages, BinaryOperator fullClassNameAndPackageToClass,
+ Symtab syms, Types types) {
+ super(messages, fullClassNameAndPackageToClass);
+ this.syms = syms;
+ this.types = types;
+ }
+
+ @Override
+ String toString(Type t) {
+ return super.toString(upward(t));
+ }
+
+ @Override
+ public String visitTypeVar(TypeVar t, Locale locale) {
+ /* Any type variable mentioned in the inferred type must have been declared as a type parameter
+ (i.e cannot have been produced by inference (18.4))
+ */
+ // and beyond that, there are no global type vars, so if there are any
+ // type variables left, they need to be eliminated
+ return WILD; // Non-denotable
+ }
+
+ @Override
+ public String visitCapturedType(CapturedType t, Locale locale) {
+ /* Any type variable mentioned in the inferred type must have been declared as a type parameter
+ (i.e cannot have been produced by capture conversion (5.1.10))
+ */
+ return WILD; // Non-denotable
+ }
+
+ public Type upward(Type t) {
+ List captures = captures(t);
+ return upward(t, captures);
+ }
+
+ /************* Following from JEP-286 Types.java ***********/
+
+ public Type upward(Type t, List vars) {
+ return t.map(new TypeProjection(vars), true);
+ }
+
+ public List captures(Type t) {
+ CaptureScanner cs = new CaptureScanner();
+ Set captures = new HashSet<>();
+ cs.visit(t, captures);
+ return List.from(captures);
+ }
+
+ class CaptureScanner extends SimpleVisitor> {
+
+ @Override
+ public Void visitType(Type t, Set types) {
+ return null;
+ }
+
+ @Override
+ public Void visitClassType(ClassType t, Set seen) {
+ if (t.isCompound()) {
+ types.directSupertypes(t).forEach(s -> visit(s, seen));
+ } else {
+ t.allparams().forEach(ta -> visit(ta, seen));
+ }
+ return null;
+ }
+
+ @Override
+ public Void visitArrayType(ArrayType t, Set seen) {
+ return visit(t.elemtype, seen);
+ }
+
+ @Override
+ public Void visitWildcardType(WildcardType t, Set seen) {
+ visit(t.type, seen);
+ return null;
+ }
+
+ @Override
+ public Void visitTypeVar(TypeVar t, Set seen) {
+ if ((t.tsym.flags() & Flags.SYNTHETIC) != 0 && seen.add(t)) {
+ visit(t.getUpperBound(), seen);
+ }
+ return null;
+ }
+
+ @Override
+ public Void visitCapturedType(CapturedType t, Set seen) {
+ if (seen.add(t)) {
+ visit(t.getUpperBound(), seen);
+ visit(t.getLowerBound(), seen);
+ }
+ return null;
+ }
+ }
+
+ class TypeProjection extends TypeMapping {
+
+ List vars;
+ Set seen = new HashSet<>();
+
+ public TypeProjection(List vars) {
+ this.vars = vars;
+ }
+
+ @Override
+ public Type visitClassType(ClassType t, Boolean upward) {
+ if (upward && !t.isCompound() && t.tsym.name.isEmpty()) {
+ //lift anonymous class type to first supertype (class or interface)
+ return types.directSupertypes(t).last();
+ } else if (t.isCompound()) {
+ List components = types.directSupertypes(t);
+ List components1 = components.map(c -> c.map(this, upward));
+ if (components == components1) return t;
+ else return types.makeIntersectionType(components1);
+ } else {
+ Type outer = t.getEnclosingType();
+ Type outer1 = visit(outer, upward);
+ List typarams = t.getTypeArguments();
+ List typarams1 = typarams.map(ta -> mapTypeArgument(ta, upward));
+ if (typarams1.stream().anyMatch(ta -> ta.hasTag(BOT))) {
+ //not defined
+ return syms.botType;
+ }
+ if (outer1 == outer && typarams1 == typarams) return t;
+ else return new ClassType(outer1, typarams1, t.tsym, t.getMetadata()) {
+ @Override
+ protected boolean needsStripping() {
+ return true;
+ }
+ };
+ }
+ }
+
+ protected Type makeWildcard(Type upper, Type lower) {
+ BoundKind bk;
+ Type bound;
+ if (upper.hasTag(BOT)) {
+ upper = syms.objectType;
+ }
+ boolean isUpperObject = types.isSameType(upper, syms.objectType);
+ if (!lower.hasTag(BOT) && isUpperObject) {
+ bound = lower;
+ bk = SUPER;
+ } else {
+ bound = upper;
+ bk = isUpperObject ? UNBOUND : EXTENDS;
+ }
+ return new WildcardType(bound, bk, syms.boundClass);
+ }
+
+ @Override
+ public Type visitTypeVar(TypeVar t, Boolean upward) {
+ if (vars.contains(t)) {
+ try {
+ if (seen.add(t)) {
+ return (upward ?
+ t.getUpperBound() :
+ (t.getLowerBound() == null) ?
+ syms.botType :
+ t.getLowerBound())
+ .map(this, upward);
+ } else {
+ //cycle
+ return syms.objectType;
+ }
+ } finally {
+ seen.remove(t);
+ }
+ } else {
+ return t;
+ }
+ }
+
+ @Override
+ public Type visitWildcardType(WildcardType wt, Boolean upward) {
+ if (upward) {
+ return wt.isExtendsBound() ?
+ wt.type.map(this, upward) :
+ syms.objectType;
+ } else {
+ return wt.isSuperBound() ?
+ wt.type.map(this, upward) :
+ syms.botType;
+ }
+ }
+
+ private Type mapTypeArgument(Type t, boolean upward) {
+ if (!t.containsAny(vars)) {
+ return t;
+ } else if (!t.hasTag(WILDCARD) && !upward) {
+ //not defined
+ return syms.botType;
+ } else {
+ Type upper = t.map(this, upward);
+ Type lower = t.map(this, !upward);
+ return makeWildcard(upper, lower);
+ }
+ }
+ }
+}
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DefaultLoaderDelegate.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DefaultLoaderDelegate.java
index e784f0dc348..b1713020a12 100644
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DefaultLoaderDelegate.java
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DefaultLoaderDelegate.java
@@ -114,12 +114,6 @@ class DefaultLoaderDelegate implements LoaderDelegate {
}
}
- @Override
- public void setClasspath(String path)
- throws EngineTerminationException, InternalException {
- throw new NotImplementedException("setClasspath: Not supported yet.");
- }
-
@Override
public Class> findClass(String name) throws ClassNotFoundException {
Class> klass = klasses.get(name);
diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java
index 0a708954694..4ac77ee4d35 100644
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/DirectExecutionControl.java
@@ -131,12 +131,6 @@ public class DirectExecutionControl implements ExecutionControl {
loaderDelegate.addToClasspath(cp);
}
- @Override
- public void setClasspath(String path)
- throws EngineTerminationException, InternalException {
- loaderDelegate.setClasspath(path);
- }
-
/**
* {@inheritDoc}
*