--- a/.hgtags Mon May 22 09:34:38 2017 -0700
+++ b/.hgtags Thu May 25 09:15:55 2017 -0700
@@ -1,3 +1,4 @@
+898cbe31fbdae2d25d141384fac746cc244a730c jdk-9+170
c7efde2b60fc1ec04630be769d9ad60efb39c39c jdk-9+169
8fd0a4569191f33c98ee90c2709174a342fefb0d jdk-9+167
fcabc74bd44e56c7419d111d59b95669ecb33c55 jdk-9+168
@@ -420,3 +421,4 @@
f113ce12fe24fbd24acf02711372d9f1e1c12426 jdk-10+5
1407b19a2ddf6baae162f5a1a5b96af473f4d7d1 jdk-10+6
30e75693ae99fd8e47fd2f5116527aff1b59aff9 jdk-10+7
+c42dc7b58b4d4301ea676a76326fd9bbd403d595 jdk-10+8
--- a/.hgtags-top-repo Mon May 22 09:34:38 2017 -0700
+++ b/.hgtags-top-repo Thu May 25 09:15:55 2017 -0700
@@ -419,4 +419,7 @@
111e2e7d00f45c983cdbc9c59ae40552152fcc23 jdk-10+5
03fe61bb7670644cf6e46b5cfafb6b27c0e0157e jdk-10+6
b25838a28195f4b6dab34668411eedd2d366a16c jdk-9+169
+4d163ec59d989a9261ed7f848bc6303f90869af5 jdk-9+170
+aa3c97810d7c484c93a2fd75d3c76ff574deb6d8 jdk-10+7
+df33ef1dc163f994177fd97d4d0e73a1e3cb5d85 jdk-10+8
--- a/common/autoconf/generated-configure.sh Mon May 22 09:34:38 2017 -0700
+++ b/common/autoconf/generated-configure.sh Thu May 25 09:15:55 2017 -0700
@@ -5186,7 +5186,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1494615666
+DATE_WHEN_GENERATED=1494858828
###############################################################################
#
@@ -48811,173 +48811,63 @@
# Check whether --with-jtreg was given.
if test "${with_jtreg+set}" = set; then :
withval=$with_jtreg;
-else
- with_jtreg=no
fi
if test "x$with_jtreg" = xno; then
# jtreg disabled
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jtreg" >&5
-$as_echo_n "checking for jtreg... " >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- else
- if test "x$with_jtreg" != xyes; then
- # with path specified.
- JT_HOME="$with_jtreg"
- fi
-
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jtreg test harness" >&5
+$as_echo_n "checking for jtreg test harness... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, disabled" >&5
+$as_echo "no, disabled" >&6; }
+ elif test "x$with_jtreg" != xyes && test "x$with_jtreg" != x; then
+ # An explicit path is specified, use it.
+ JT_HOME="$with_jtreg"
+ if test ! -d "$JT_HOME"; then
+ as_fn_error $? "jtreg home directory from --with-jtreg=$with_jtreg does not exist" "$LINENO" 5
+ fi
+
+ if test ! -e "$JT_HOME/lib/jtreg.jar"; then
+ as_fn_error $? "jtreg home directory from --with-jtreg=$with_jtreg is not a valid jtreg home" "$LINENO" 5
+ fi
+
+ JTREGEXE="$JT_HOME/bin/jtreg"
+ if test ! -x "$JTREGEXE"; then
+ as_fn_error $? "jtreg home directory from --with-jtreg=$with_jtreg does not contain valid jtreg executable" "$LINENO" 5
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jtreg test harness" >&5
+$as_echo_n "checking for jtreg test harness... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JT_HOME" >&5
+$as_echo "$JT_HOME" >&6; }
+ else
+ # Try to locate jtreg
if test "x$JT_HOME" != x; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jtreg" >&5
-$as_echo_n "checking for jtreg... " >&6; }
-
- # use JT_HOME enviroment var.
-
- # Only process if variable expands to non-empty
-
- if test "x$JT_HOME" != 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="$JT_HOME"
- 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 JT_HOME, which resolves as \"$path\", is invalid." >&5
-$as_echo "$as_me: The path of JT_HOME, which resolves as \"$path\", is invalid." >&6;}
- as_fn_error $? "Cannot locate the the path of JT_HOME" "$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
- JT_HOME="$new_path"
- { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JT_HOME to \"$new_path\"" >&5
-$as_echo "$as_me: Rewriting JT_HOME to \"$new_path\"" >&6;}
- fi
-
- elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
-
- path="$JT_HOME"
- 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
- JT_HOME="$new_path"
- { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JT_HOME to \"$new_path\"" >&5
-$as_echo "$as_me: Rewriting JT_HOME 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="$JT_HOME"
- has_space=`$ECHO "$path" | $GREP " "`
- if test "x$has_space" != x; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JT_HOME, which resolves as \"$path\", is invalid." >&5
-$as_echo "$as_me: The path of JT_HOME, 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 JT_HOME, which resolves as \"$path\", is not found." "$LINENO" 5
- fi
-
- if test -d "$path"; then
- JT_HOME="`cd "$path"; $THEPWDCMD -L`"
- else
- dir="`$DIRNAME "$path"`"
- base="`$BASENAME "$path"`"
- JT_HOME="`cd "$dir"; $THEPWDCMD -L`/$base"
- fi
- fi
- fi
-
-
- # jtreg win32 script works for everybody
- JTREGEXE="$JT_HOME/bin/jtreg"
-
- if test ! -f "$JTREGEXE"; then
- as_fn_error $? "JTReg executable does not exist: $JTREGEXE" "$LINENO" 5
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JTREGEXE" >&5
-$as_echo "$JTREGEXE" >&6; }
- else
- # try to find jtreg on path
-
+ # JT_HOME set in environment, use it
+ if test ! -d "$JT_HOME"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring JT_HOME pointing to invalid directory: $JT_HOME" >&5
+$as_echo "$as_me: WARNING: Ignoring JT_HOME pointing to invalid directory: $JT_HOME" >&2;}
+ JT_HOME=
+ else
+ if test ! -e "$JT_HOME/lib/jtreg.jar"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring JT_HOME which is not a valid jtreg home: $JT_HOME" >&5
+$as_echo "$as_me: WARNING: Ignoring JT_HOME which is not a valid jtreg home: $JT_HOME" >&2;}
+ JT_HOME=
+ elif test ! -x "$JT_HOME/bin/jtreg"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring JT_HOME which does not contain valid jtreg executable: $JT_HOME" >&5
+$as_echo "$as_me: WARNING: Ignoring JT_HOME which does not contain valid jtreg executable: $JT_HOME" >&2;}
+ JT_HOME=
+ else
+ JTREGEXE="$JT_HOME/bin/jtreg"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Located jtreg using JT_HOME from environment" >&5
+$as_echo "$as_me: Located jtreg using JT_HOME from environment" >&6;}
+ fi
+ fi
+ fi
+
+ if test "x$JT_HOME" = x; then
+ # JT_HOME is not set in environment, or was deemed invalid.
+ # Try to find jtreg on path
# Publish this variable in the help.
@@ -49175,13 +49065,451 @@
fi
-
- if test "x$JTREGEXE" = x; then
- as_fn_error $? "Could not find required tool for JTREGEXE" "$LINENO" 5
- fi
-
-
- JT_HOME="`$DIRNAME $JTREGEXE`"
+ if test "x$JTREGEXE" != x; then
+ # That's good, now try to derive JT_HOME
+ JT_HOME=`(cd $($DIRNAME $JTREGEXE)/.. && pwd)`
+ if test ! -e "$JT_HOME/lib/jtreg.jar"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring jtreg from path since a valid jtreg home cannot be found" >&5
+$as_echo "$as_me: WARNING: Ignoring jtreg from path since a valid jtreg home cannot be found" >&2;}
+ JT_HOME=
+ JTREGEXE=
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Located jtreg using jtreg executable in path" >&5
+$as_echo "$as_me: Located jtreg using jtreg executable in path" >&6;}
+ fi
+ fi
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jtreg test harness" >&5
+$as_echo_n "checking for jtreg test harness... " >&6; }
+ if test "x$JT_HOME" != x; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JT_HOME" >&5
+$as_echo "$JT_HOME" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, not found" >&5
+$as_echo "no, not found" >&6; }
+
+ if test "x$with_jtreg" = xyes; then
+ as_fn_error $? "--with-jtreg was specified, but no jtreg found." "$LINENO" 5
+ fi
+ fi
+ fi
+
+
+ # Only process if variable expands to non-empty
+
+ if test "x$JTREGEXE" != x; then
+ if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
+
+ # First separate the path from the arguments. This will split at the first
+ # space.
+ complete="$JTREGEXE"
+ path="${complete%% *}"
+ tmp="$complete EOL"
+ arguments="${tmp#* }"
+
+ # Input might be given as Windows format, start by converting to
+ # unix format.
+ new_path=`$CYGPATH -u "$path"`
+
+ # Now try to locate executable using which
+ new_path=`$WHICH "$new_path" 2> /dev/null`
+ # bat and cmd files are not always considered executable in cygwin causing which
+ # to not find them
+ if test "x$new_path" = x \
+ && test "x`$ECHO \"$path\" | $GREP -i -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \
+ && test "x`$LS \"$path\" 2>/dev/null`" != x; then
+ new_path=`$CYGPATH -u "$path"`
+ fi
+ if test "x$new_path" = x; then
+ # Oops. Which didn't find the executable.
+ # The splitting of arguments from the executable at a space might have been incorrect,
+ # since paths with space are more likely in Windows. Give it another try with the whole
+ # argument.
+ path="$complete"
+ arguments="EOL"
+ new_path=`$CYGPATH -u "$path"`
+ new_path=`$WHICH "$new_path" 2> /dev/null`
+ # bat and cmd files are not always considered executable in cygwin causing which
+ # to not find them
+ if test "x$new_path" = x \
+ && test "x`$ECHO \"$path\" | $GREP -i -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \
+ && test "x`$LS \"$path\" 2>/dev/null`" != x; then
+ new_path=`$CYGPATH -u "$path"`
+ fi
+ if test "x$new_path" = x; then
+ # It's still not found. Now this is an unrecoverable error.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&5
+$as_echo "$as_me: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&6;}
+ has_space=`$ECHO "$complete" | $GREP " "`
+ if test "x$has_space" != x; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5
+$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;}
+ fi
+ as_fn_error $? "Cannot locate the the path of JTREGEXE" "$LINENO" 5
+ fi
+ fi
+
+ # 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 presence.
+ # 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
+ # Short path failed, file does not exist as specified.
+ # Try adding .exe or .cmd
+ if test -f "${new_path}.exe"; then
+ input_to_shortpath="${new_path}.exe"
+ elif test -f "${new_path}.cmd"; then
+ input_to_shortpath="${new_path}.cmd"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JTREGEXE, which resolves as \"$new_path\", is invalid." >&5
+$as_echo "$as_me: The path of JTREGEXE, which resolves as \"$new_path\", is invalid." >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5
+$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;}
+ as_fn_error $? "Cannot locate the the path of JTREGEXE" "$LINENO" 5
+ fi
+ else
+ input_to_shortpath="$new_path"
+ fi
+
+ # Call helper function which possibly converts this using DOS-style short mode.
+ # If so, the updated path is stored in $new_path.
+ new_path="$input_to_shortpath"
+
+ input_path="$input_to_shortpath"
+ # 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 $input_to_shortpath | $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
+
+ # remove trailing .exe if any
+ new_path="${new_path/%.exe/}"
+
+ elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
+
+ # First separate the path from the arguments. This will split at the first
+ # space.
+ complete="$JTREGEXE"
+ path="${complete%% *}"
+ tmp="$complete EOL"
+ arguments="${tmp#* }"
+
+ # Input might be given as Windows format, start by converting to
+ # unix format.
+ new_path="$path"
+
+ 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
+
+
+ # Now try to locate executable using which
+ new_path=`$WHICH "$new_path" 2> /dev/null`
+
+ if test "x$new_path" = x; then
+ # Oops. Which didn't find the executable.
+ # The splitting of arguments from the executable at a space might have been incorrect,
+ # since paths with space are more likely in Windows. Give it another try with the whole
+ # argument.
+ path="$complete"
+ arguments="EOL"
+ new_path="$path"
+
+ 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
+
+
+ new_path=`$WHICH "$new_path" 2> /dev/null`
+ # bat and cmd files are not always considered executable in MSYS causing which
+ # to not find them
+ if test "x$new_path" = x \
+ && test "x`$ECHO \"$path\" | $GREP -i -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \
+ && test "x`$LS \"$path\" 2>/dev/null`" != x; then
+ new_path="$path"
+
+ 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
+
+ fi
+
+ if test "x$new_path" = x; then
+ # It's still not found. Now this is an unrecoverable error.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&5
+$as_echo "$as_me: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&6;}
+ has_space=`$ECHO "$complete" | $GREP " "`
+ if test "x$has_space" != x; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5
+$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;}
+ fi
+ as_fn_error $? "Cannot locate the the path of JTREGEXE" "$LINENO" 5
+ fi
+ fi
+
+ # Now new_path has a complete unix path to the binary
+ if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then
+ # Keep paths in /bin as-is, but remove trailing .exe if any
+ new_path="${new_path/%.exe/}"
+ # Do not save /bin paths to all_fixpath_prefixes!
+ else
+ # Not in mixed or Windows style, start by that.
+ new_path=`cmd //c echo $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 \)
+ new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ fi
+
+ # Output is in $new_path
+
+ 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
+
+ # remove trailing .exe if any
+ new_path="${new_path/%.exe/}"
+
+ # 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}")
+ fi
+
+ else
+ # We're on a unix platform. Hooray! :)
+ # First separate the path from the arguments. This will split at the first
+ # space.
+ complete="$JTREGEXE"
+ path="${complete%% *}"
+ tmp="$complete EOL"
+ arguments="${tmp#* }"
+
+ # Cannot rely on the command "which" here since it doesn't always work.
+ is_absolute_path=`$ECHO "$path" | $GREP ^/`
+ if test -z "$is_absolute_path"; then
+ # Path to executable is not absolute. Find it.
+ IFS_save="$IFS"
+ IFS=:
+ for p in $PATH; do
+ if test -f "$p/$path" && test -x "$p/$path"; then
+ new_path="$p/$path"
+ break
+ fi
+ done
+ IFS="$IFS_save"
+ else
+ # This is an absolute path, we can use it without further modifications.
+ new_path="$path"
+ fi
+
+ if test "x$new_path" = x; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&5
+$as_echo "$as_me: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&6;}
+ has_space=`$ECHO "$complete" | $GREP " "`
+ if test "x$has_space" != x; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5
+$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;}
+ fi
+ as_fn_error $? "Cannot locate the the path of JTREGEXE" "$LINENO" 5
+ fi
+ fi
+
+ # Now join together the path and the arguments once again
+ if test "x$arguments" != xEOL; then
+ new_complete="$new_path ${arguments% *}"
+ else
+ new_complete="$new_path"
+ fi
+
+ if test "x$complete" != "x$new_complete"; then
+ JTREGEXE="$new_complete"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JTREGEXE to \"$new_complete\"" >&5
+$as_echo "$as_me: Rewriting JTREGEXE to \"$new_complete\"" >&6;}
+ fi
+ fi
+
+
+ # Only process if variable expands to non-empty
+
+ if test "x$JT_HOME" != 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="$JT_HOME"
+ 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 JT_HOME, which resolves as \"$path\", is invalid." >&5
+$as_echo "$as_me: The path of JT_HOME, which resolves as \"$path\", is invalid." >&6;}
+ as_fn_error $? "Cannot locate the the path of JT_HOME" "$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
+ JT_HOME="$new_path"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JT_HOME to \"$new_path\"" >&5
+$as_echo "$as_me: Rewriting JT_HOME to \"$new_path\"" >&6;}
+ fi
+
+ elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
+
+ path="$JT_HOME"
+ 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
+ JT_HOME="$new_path"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JT_HOME to \"$new_path\"" >&5
+$as_echo "$as_me: Rewriting JT_HOME 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="$JT_HOME"
+ has_space=`$ECHO "$path" | $GREP " "`
+ if test "x$has_space" != x; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JT_HOME, which resolves as \"$path\", is invalid." >&5
+$as_echo "$as_me: The path of JT_HOME, 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 JT_HOME, which resolves as \"$path\", is not found." "$LINENO" 5
+ fi
+
+ if test -d "$path"; then
+ JT_HOME="`cd "$path"; $THEPWDCMD -L`"
+ else
+ dir="`$DIRNAME "$path"`"
+ base="`$BASENAME "$path"`"
+ JT_HOME="`cd "$dir"; $THEPWDCMD -L`/$base"
+ fi
fi
fi
--- a/common/autoconf/spec.gmk.in Mon May 22 09:34:38 2017 -0700
+++ b/common/autoconf/spec.gmk.in Thu May 25 09:15:55 2017 -0700
@@ -271,9 +271,6 @@
TESTMAKE_OUTPUTDIR=$(BUILD_OUTPUT)/test-make
MAKESUPPORT_OUTPUTDIR=$(BUILD_OUTPUT)/make-support
-# By default, output javadoc directly into image
-JAVADOC_OUTPUTDIR = $(DOCS_IMAGE_DIR)
-
# This does not get overridden in a bootcycle build
CONFIGURESUPPORT_OUTPUTDIR:=@CONFIGURESUPPORT_OUTPUTDIR@
BUILDJDK_OUTPUTDIR=$(BUILD_OUTPUT)/buildjdk
@@ -819,6 +816,8 @@
# Docs image
DOCS_IMAGE_SUBDIR := docs
DOCS_IMAGE_DIR = $(IMAGES_OUTPUTDIR)/$(DOCS_IMAGE_SUBDIR)
+# Output docs directly into image
+DOCS_OUTPUTDIR := $(DOCS_IMAGE_DIR)
# Macosx bundles directory definitions
JDK_MACOSX_BUNDLE_SUBDIR=jdk-bundle
--- a/common/autoconf/toolchain.m4 Mon May 22 09:34:38 2017 -0700
+++ b/common/autoconf/toolchain.m4 Thu May 25 09:15:55 2017 -0700
@@ -926,41 +926,82 @@
AC_DEFUN_ONCE([TOOLCHAIN_SETUP_JTREG],
[
AC_ARG_WITH(jtreg, [AS_HELP_STRING([--with-jtreg],
- [Regression Test Harness @<:@probed@:>@])],
- [],
- [with_jtreg=no])
+ [Regression Test Harness @<:@probed@:>@])])
if test "x$with_jtreg" = xno; then
# jtreg disabled
- AC_MSG_CHECKING([for jtreg])
- AC_MSG_RESULT(no)
- else
- if test "x$with_jtreg" != xyes; then
- # with path specified.
- JT_HOME="$with_jtreg"
+ AC_MSG_CHECKING([for jtreg test harness])
+ AC_MSG_RESULT([no, disabled])
+ elif test "x$with_jtreg" != xyes && test "x$with_jtreg" != x; then
+ # An explicit path is specified, use it.
+ JT_HOME="$with_jtreg"
+ if test ! -d "$JT_HOME"; then
+ AC_MSG_ERROR([jtreg home directory from --with-jtreg=$with_jtreg does not exist])
+ fi
+
+ if test ! -e "$JT_HOME/lib/jtreg.jar"; then
+ AC_MSG_ERROR([jtreg home directory from --with-jtreg=$with_jtreg is not a valid jtreg home])
+ fi
+
+ JTREGEXE="$JT_HOME/bin/jtreg"
+ if test ! -x "$JTREGEXE"; then
+ AC_MSG_ERROR([jtreg home directory from --with-jtreg=$with_jtreg does not contain valid jtreg executable])
fi
+ AC_MSG_CHECKING([for jtreg test harness])
+ AC_MSG_RESULT([$JT_HOME])
+ else
+ # Try to locate jtreg
if test "x$JT_HOME" != x; then
- AC_MSG_CHECKING([for jtreg])
-
- # use JT_HOME enviroment var.
- BASIC_FIXUP_PATH([JT_HOME])
-
- # jtreg win32 script works for everybody
- JTREGEXE="$JT_HOME/bin/jtreg"
+ # JT_HOME set in environment, use it
+ if test ! -d "$JT_HOME"; then
+ AC_MSG_WARN([Ignoring JT_HOME pointing to invalid directory: $JT_HOME])
+ JT_HOME=
+ else
+ if test ! -e "$JT_HOME/lib/jtreg.jar"; then
+ AC_MSG_WARN([Ignoring JT_HOME which is not a valid jtreg home: $JT_HOME])
+ JT_HOME=
+ elif test ! -x "$JT_HOME/bin/jtreg"; then
+ AC_MSG_WARN([Ignoring JT_HOME which does not contain valid jtreg executable: $JT_HOME])
+ JT_HOME=
+ else
+ JTREGEXE="$JT_HOME/bin/jtreg"
+ AC_MSG_NOTICE([Located jtreg using JT_HOME from environment])
+ fi
+ fi
+ fi
- if test ! -f "$JTREGEXE"; then
- AC_MSG_ERROR([JTReg executable does not exist: $JTREGEXE])
+ if test "x$JT_HOME" = x; then
+ # JT_HOME is not set in environment, or was deemed invalid.
+ # Try to find jtreg on path
+ BASIC_PATH_PROGS(JTREGEXE, jtreg)
+ if test "x$JTREGEXE" != x; then
+ # That's good, now try to derive JT_HOME
+ JT_HOME=`(cd $($DIRNAME $JTREGEXE)/.. && pwd)`
+ if test ! -e "$JT_HOME/lib/jtreg.jar"; then
+ AC_MSG_WARN([Ignoring jtreg from path since a valid jtreg home cannot be found])
+ JT_HOME=
+ JTREGEXE=
+ else
+ AC_MSG_NOTICE([Located jtreg using jtreg executable in path])
+ fi
fi
+ fi
- AC_MSG_RESULT($JTREGEXE)
+ AC_MSG_CHECKING([for jtreg test harness])
+ if test "x$JT_HOME" != x; then
+ AC_MSG_RESULT([$JT_HOME])
else
- # try to find jtreg on path
- BASIC_REQUIRE_PROGS(JTREGEXE, jtreg)
- JT_HOME="`$DIRNAME $JTREGEXE`"
+ AC_MSG_RESULT([no, not found])
+
+ if test "x$with_jtreg" = xyes; then
+ AC_MSG_ERROR([--with-jtreg was specified, but no jtreg found.])
+ fi
fi
fi
+ BASIC_FIXUP_EXECUTABLE(JTREGEXE)
+ BASIC_FIXUP_PATH(JT_HOME)
AC_SUBST(JT_HOME)
AC_SUBST(JTREGEXE)
])
--- a/common/bin/hgforest.sh Mon May 22 09:34:38 2017 -0700
+++ b/common/bin/hgforest.sh Thu May 25 09:15:55 2017 -0700
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2009, 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
@@ -183,7 +183,7 @@
subrepos="corba jaxp jaxws langtools jdk hotspot nashorn"
jdk_subrepos_extra="closed jdk/src/closed jdk/make/closed jdk/test/closed hotspot/make/closed hotspot/src/closed hotspot/test/closed"
-subrepos_extra="$jdk_subrepos_extra deploy install sponsors pubs"
+subrepos_extra="$jdk_subrepos_extra deploy install sponsors"
# Only look in specific locations for possible forests (avoids long searches)
pull_default=""
--- a/common/conf/jib-profiles.js Mon May 22 09:34:38 2017 -0700
+++ b/common/conf/jib-profiles.js Thu May 25 09:15:55 2017 -0700
@@ -997,7 +997,8 @@
ext: "tar.gz",
revision: "2.38.0-1+1.1",
module: "graphviz-" + input.target_platform,
- configure_args: "DOT=" + input.get("graphviz", "install_path") + "/dot"
+ configure_args: "DOT=" + input.get("graphviz", "install_path") + "/dot",
+ environment_path: input.get("graphviz", "install_path")
},
pandoc: {
@@ -1005,7 +1006,8 @@
ext: "tar.gz",
revision: "1.17.2+1.0",
module: "pandoc-" + input.target_platform,
- configure_args: "PANDOC=" + input.get("pandoc", "install_path") + "/pandoc/pandoc"
+ configure_args: "PANDOC=" + input.get("pandoc", "install_path") + "/pandoc/pandoc",
+ environment_path: input.get("pandoc", "install_path") + "/pandoc"
},
};
--- a/common/doc/building.html Mon May 22 09:34:38 2017 -0700
+++ b/common/doc/building.html Thu May 25 09:15:55 2017 -0700
@@ -6,6 +6,7 @@
<meta name="generator" content="pandoc" />
<title>OpenJDK Build README</title>
<style type="text/css">code{white-space: pre;}</style>
+ <link rel="stylesheet" href=" ../../jdk/make/data/docs-resources/specs/resources/jdk-default.css" type="text/css" />
</head>
<body>
<div id="header">
--- a/common/doc/testing.html Mon May 22 09:34:38 2017 -0700
+++ b/common/doc/testing.html Thu May 25 09:15:55 2017 -0700
@@ -6,9 +6,8 @@
<meta name="generator" content="pandoc" />
<title>Testing OpenJDK</title>
<style type="text/css">code{white-space: pre;}</style>
- <link rel="stylesheet" href="http://openjdk.java.net/page.css" type="text/css" />
+ <link rel="stylesheet" href=" ../../jdk/make/data/docs-resources/specs/resources/jdk-default.css" type="text/css" />
<style type="text/css">pre, code, tt { color: #1d6ae5; }</style>
- <style type="text/css">pre { font-size: 10pt; }</style>
</head>
<body>
<div id="header">
--- a/corba/.hgtags Mon May 22 09:34:38 2017 -0700
+++ b/corba/.hgtags Thu May 25 09:15:55 2017 -0700
@@ -419,3 +419,6 @@
43de67f51801b9e16507865fcb7e8344f4ca4aa9 jdk-9+167
03a2cc9c8a1e8f87924c9863e917bc8b91770d5f jdk-9+168
b2218d41edef02ee8f94bb438f885b2ba79bfa08 jdk-9+169
+8a4ab3b0ab9a86df73d9a1e337134f2dbe006725 jdk-9+170
+aed5a4edc8275c1c50195503756ff92bfe0197f5 jdk-10+7
+648b0a00824eb29e71936bc3258d309a25e3b8c0 jdk-10+8
--- a/corba/src/java.corba/share/classes/com/sun/corba/se/spi/monitoring/package.html Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/com/sun/corba/se/spi/monitoring/package.html Thu May 25 09:15:55 2017 -0700
@@ -1,4 +1,4 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
@@ -6,7 +6,7 @@
<title>package</title>
<!--
-Copyright (c) 2003, 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
--- a/corba/src/java.corba/share/classes/org/omg/CORBA/Any.java Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/Any.java Thu May 25 09:15:55 2017 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2015, 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
@@ -52,7 +52,7 @@
* </OL>
*
* <P>
- * <a name="anyOps"></a>
+ * <a id="anyOps"></a>
* A large part of the <code>Any</code> class consists of pairs of methods
* for inserting values into and extracting values from an
* <code>Any</code> object.
--- a/corba/src/java.corba/share/classes/org/omg/CORBA/ORB.java Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/ORB.java Thu May 25 09:15:55 2017 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 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
@@ -85,13 +85,17 @@
* three {@code init} methods. Two of the three methods use the properties
* (associations of a name with a value) shown in the
* table below.<BR>
- * <TABLE BORDER=1 SUMMARY="Standard Java CORBA Properties">
+ * <TABLE class="plain">
+ * <CAPTION>Standard Java CORBA Properties:</CAPTION>
+ * <thead>
* <TR><TH>Property Name</TH> <TH>Property Value</TH></TR>
- * <CAPTION>Standard Java CORBA Properties:</CAPTION>
+ * </thead>
+ * <tbody>
* <TR><TD>org.omg.CORBA.ORBClass</TD>
* <TD>class name of an ORB implementation</TD></TR>
* <TR><TD>org.omg.CORBA.ORBSingletonClass</TD>
* <TD>class name of the ORB returned by {@code init()}</TD></TR>
+ * </tbody>
* </TABLE>
* <P>
* These properties allow a different vendor's {@code ORB}
--- a/corba/src/java.corba/share/classes/org/omg/CORBA/doc-files/compliance.html Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/doc-files/compliance.html Thu May 25 09:15:55 2017 -0700
@@ -1,4 +1,4 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html">
--- a/corba/src/java.corba/share/classes/org/omg/CORBA/doc-files/generatedfiles.html Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/doc-files/generatedfiles.html Thu May 25 09:15:55 2017 -0700
@@ -1,4 +1,4 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html">
--- a/corba/src/java.corba/share/classes/org/omg/CORBA/package.html Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/package.html Thu May 25 09:15:55 2017 -0700
@@ -1,3 +1,4 @@
+<!doctype html>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
@@ -6,7 +7,7 @@
<TITLE>package</TITLE>
<!--
/*
-* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 1998, 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
@@ -31,9 +32,8 @@
*/
-->
</HEAD>
-<BODY BGCOLOR="#FFFFFF">
-Provides the mapping of the OMG CORBA APIs to the Java<SUP><FONT
-SIZE=-2>TM</FONT></SUP>
+<BODY>
+Provides the mapping of the OMG CORBA APIs to the Java™
programming language, including the class <code>ORB</code>, which is implemented
so that a programmer can use it as a fully-functional Object Request Broker
(ORB).
@@ -427,7 +427,7 @@
in this case, <code>Account</code> objects.
-<a name="narrow"></a>
+<a id="narrow"></a>
<h3>The <code>narrow</code> Method</h3>
When an object is the return value for a method, it is returned in the
form of a generic object, either an <code>org.omg.CORBA.Object</code> object
@@ -465,7 +465,7 @@
helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));
</PRE>
-<a name="basic"></a>
+<a id="basic"></a>
<h3>Example of a Basic Helper Class</h3>
A basic helper class, for purposes of this explanation, is one with
the methods that are provided by every helper class, plus a <code>narrow</code>
@@ -671,7 +671,7 @@
WStringSeqHelper
WStringValueHelper
</code></PRE>
-<a name="adv"></a>
+<a id="adv"></a>
<H1>
Other Classes</H1>
The other classes and interfaces in the <code>CORBA</code> package, which are
@@ -868,17 +868,17 @@
-<P><A NAME="unimpl"></A>
+<P><A id="unimpl"></A>
<H1>
CORBA Features Not Implemented in Java IDL</H1>
<P>Some of the API included in <code>org.omg</code> subpackages is provided for
conformance with the current OMG CORBA specification but is not implemented
-in Sun's release of the JDK<SUP><FONT SIZE=-2>TM</FONT></SUP>. This enables
+in Sun's release of the JDK™. This enables
other JDK licensees to provide implementations of this API in standard
extensions and products.
-<P><A NAME="NO_IMPLEMENT"></A>
+<P><A id="NO_IMPLEMENT"></A>
<h2>Features That Throw NO_IMPLEMENT</h2>
<P>Some of the API included in <code>org.omg</code> subpackages throw
--- a/corba/src/java.corba/share/classes/org/omg/CORBA/portable/package.html Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/portable/package.html Thu May 25 09:15:55 2017 -0700
@@ -1,8 +1,8 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!doctype html>
<html>
<head>
<!--
-Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+Copyright (c) 1998, 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
@@ -26,7 +26,7 @@
questions.
-->
</head>
-<body bgcolor="white">
+<body>
Provides a portability layer, that is, a set of ORB APIs
that makes it possible for code generated
@@ -38,7 +38,7 @@
<p>
-<a name="unimpl"></a>
+<a id="unimpl"></a>
<hr>
<h1>CORBA Features Throwing NO_IMPLEMENT() Exceptions</h1>
<hr>
--- a/corba/src/java.corba/share/classes/org/omg/CORBA_2_3/package.html Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA_2_3/package.html Thu May 25 09:15:55 2017 -0700
@@ -1,4 +1,4 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
@@ -6,7 +6,7 @@
<title>package</title>
<!--
/*
-* Copyright (c) 1999, 2015, 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
@@ -31,7 +31,7 @@
*/
-->
</head>
-<body bgcolor="#FFFFFF">
+<body>
The CORBA_2_3 package defines additions to existing CORBA interfaces
in the Java[tm] Standard Edition 6. These changes occurred in recent
revisions to the CORBA API defined by the OMG. The new methods were
@@ -46,7 +46,7 @@
HREF="../CORBA/doc-files/compliance.html">Official Specifications for CORBA
support in Java[tm] SE 6</A>.
<P>
-<a name="unimpl"></a>
+<a id="unimpl"></a>
The following methods in the abstract class
<code>org.omg.CORBA_2_3.ORB</code> are unimplemented:
<UL>
--- a/corba/src/java.corba/share/classes/org/omg/PortableInterceptor/IOP.idl Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/org/omg/PortableInterceptor/IOP.idl Thu May 25 09:15:55 2017 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2015, 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
@@ -425,7 +425,7 @@
* encoded using GIOP 1.2 with a TCS-W of UTF-16. This service context
* may be sent on Reply messages with a reply_status of SYSTEM_EXCEPTION
* or USER_EXCEPTION. The usage of this service context is defined
- * by language mappings. <br/> <br/>
+ * by language mappings. <br> <br>
*
* IDL/Java: ptc/02-01-22: 1.15.2:
* When a System Exception is marshaled, its GIOP Reply message shall
--- a/corba/src/java.corba/share/classes/org/omg/PortableInterceptor/Interceptors.idl Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/org/omg/PortableInterceptor/Interceptors.idl Thu May 25 09:15:55 2017 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2015, 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
@@ -580,7 +580,8 @@
* to access it will result in a <code>BAD_INV_ORDER</code> being thrown
* with a standard minor code of 14.
*
- * <table border=1 summary="Shows the validity of each attribute or operation">
+ * <table class="plain">
+ * <caption style="display:none">Shows the validity of each attribute or operation</caption>
* <thead>
* <tr>
* <th> </th>
@@ -597,42 +598,42 @@
* <td id="ri" colspan=6><i>Inherited from RequestInfo:</i></td>
* </tr>
*
- * <tr><th id="req_id"><p align="left">request_id</p></th>
+ * <tr><th id="req_id"><p style="text-align:left">request_id</p></th>
* <td headers="ri req_id send_req">yes</td>
* <td headers="ri req_id send_poll">yes</td>
* <td headers="ri req_id rec_reply">yes</td>
* <td headers="ri req_id rec_ex">yes</td>
* <td headers="ri req_id rec_oth">yes</td></tr>
*
- * <tr><th id="op"><p align="left">operation</p></th>
+ * <tr><th id="op"><p style="text-align:left">operation</p></th>
* <td headers="ri op send_req">yes</td>
* <td headers="ri op send_poll">yes</td>
* <td headers="ri op rec_reply">yes</td>
* <td headers="ri op rec_ex">yes</td>
* <td headers="ri op rec_oth">yes</td></tr>
*
- * <tr><th id="arg"><p align="left">arguments</p></th>
+ * <tr><th id="arg"><p style="text-align:left">arguments</p></th>
* <td headers="ri arg send_req">yes<sub>1</sub></td>
* <td headers="ri arg send_poll">no </td>
* <td headers="ri arg rec_reply">yes</td>
* <td headers="ri arg rec_ex">no </td>
* <td headers="ri arg rec_oth">no </td></tr>
*
- * <tr><th id="exc"><p align="left">exceptions</p></th>
+ * <tr><th id="exc"><p style="text-align:left">exceptions</p></th>
* <td headers="ri exc send_req">yes</td>
* <td headers="ri exc send_poll">no </td>
* <td headers="ri exc rec_reply">yes</td>
* <td headers="ri exc rec_ex">yes</td>
* <td headers="ri exc rec_oth">yes</td></tr>
*
- * <tr><th id="con"><p align="left">contexts</p></th>
+ * <tr><th id="con"><p style="text-align:left">contexts</p></th>
* <td headers="ri con send_req">yes</td>
* <td headers="ri con send_poll">no </td>
* <td headers="ri con rec_reply">yes</td>
* <td headers="ri con rec_ex">yes</td>
* <td headers="ri con rec_oth">yes</td></tr>
*
- * <tr><th id="op_con"><p align="left">operation_context</p></th>
+ * <tr><th id="op_con"><p style="text-align:left">operation_context</p></th>
* <td headers="ri op_con send_req">yes</td>
* <td headers="ri op_con send_poll">no </td>
* <td headers="ri op_con rec_reply">yes</td>
@@ -640,7 +641,7 @@
* <td headers="ri op_con rec_oth">yes</td>
* </tr>
*
- * <tr><th id="result"><p align="left">result</p></th>
+ * <tr><th id="result"><p style="text-align:left">result</p></th>
* <td headers="ri result send_req">no </td>
* <td headers="ri result send_poll">no </td>
* <td headers="ri result rec_reply">yes</td>
@@ -648,14 +649,14 @@
* <td headers="ri result rec_oth">no </td>
* </tr>
*
- * <tr><th id="res_exp"><p align="left">response_expected</p></th>
+ * <tr><th id="res_exp"><p style="text-align:left">response_expected</p></th>
* <td headers="ri res_exp send_req">yes</td>
* <td headers="ri res_exp send_poll">yes</td>
* <td headers="ri res_exp rec_reply">yes</td>
* <td headers="ri res_exp rec_ex">yes</td>
* <td headers="ri res_exp rec_oth">yes</td></tr>
*
- * <tr><th id="sync_sco"><p align="left">sync_scope</p></th>
+ * <tr><th id="sync_sco"><p style="text-align:left">sync_scope</p></th>
* <td headers="ri sync_sco send_req">yes</td>
* <td headers="ri sync_sco send_poll">no </td>
* <td headers="ri sync_sco rec_reply">yes</td>
@@ -663,14 +664,14 @@
* <td headers="ri sync_sco rec_oth">yes</td>
* </tr>
*
- * <tr><th id="rep_stat"><p align="left">reply_status</p></th>
+ * <tr><th id="rep_stat"><p style="text-align:left">reply_status</p></th>
* <td headers="ri rep_stat send_req">no </td>
* <td headers="ri rep_stat send_poll">no </td>
* <td headers="ri rep_stat rec_reply">yes</td>
* <td headers="ri rep_stat rec_ex">yes</td>
* <td headers="ri rep_stat rec_oth">yes</td></tr>
*
- * <tr><th id="for_ref"><p align="left">forward_reference</p></th>
+ * <tr><th id="for_ref"><p style="text-align:left">forward_reference</p></th>
* <td headers="ri for_ref send_req">no </td>
* <td headers="ri for_ref send_poll">no </td>
* <td headers="ri for_ref rec_reply">no </td>
@@ -678,21 +679,21 @@
* <td headers="ri for_ref rec_oth">yes<sub>2</sub>
* </td></tr>
*
- * <tr><th id="get_slot"><p align="left">get_slot</p></th>
+ * <tr><th id="get_slot"><p style="text-align:left">get_slot</p></th>
* <td headers="ri get_slot send_req">yes</td>
* <td headers="ri get_slot send_poll">yes</td>
* <td headers="ri get_slot rec_reply">yes</td>
* <td headers="ri get_slot rec_ex">yes</td>
* <td headers="ri get_slot rec_oth">yes</td></tr>
*
- * <tr><th id="grsc"><p align="left">get_request_service_context</p></th>
+ * <tr><th id="grsc"><p style="text-align:left">get_request_service_context</p></th>
* <td headers="ri grsc send_req">yes</td>
* <td headers="ri grsc send_poll">no </td>
* <td headers="ri grsc rec_reply">yes</td>
* <td headers="ri grsc rec_ex">yes</td>
* <td headers="ri grsc rec_oth">yes</td></tr>
*
- * <tr><th id="gpsc"><p align="left">get_reply_service_context</p></th>
+ * <tr><th id="gpsc"><p style="text-align:left">get_reply_service_context</p></th>
* <td headers="ri gpsc send_req">no </td>
* <td headers="ri gpsc send_poll">no </td>
* <td headers="ri gpsc rec_reply">yes</td>
@@ -704,14 +705,14 @@
* <td id="cri" colspan=6><i>ClientRequestInfo-specific:</i></td>
* </tr>
*
- * <tr><th id="target"><p align="left">target</p></th>
+ * <tr><th id="target"><p style="text-align:left">target</p></th>
* <td headers="cri target send_req">yes</td>
* <td headers="cri target send_poll">yes</td>
* <td headers="cri target rec_reply">yes</td>
* <td headers="cri target rec_ex">yes</td>
* <td headers="cri target rec_oth">yes</td></tr>
*
- * <tr><th id="eftarget"><p align="left">effective_target</p></th>
+ * <tr><th id="eftarget"><p style="text-align:left">effective_target</p></th>
* <td headers="cri eftarget send_req">yes</td>
* <td headers="cri eftarget send_poll">yes</td>
* <td headers="cri eftarget rec_reply">yes</td>
@@ -719,49 +720,49 @@
* <td headers="cri eftarget rec_oth">yes</td>
* </tr>
*
- * <tr><th id="efprof"><p align="left">effective_profile</p></th>
+ * <tr><th id="efprof"><p style="text-align:left">effective_profile</p></th>
* <td headers="cri efprof send_req">yes</td>
* <td headers="cri efprof send_poll">yes</td>
* <td headers="cri efprof rec_reply">yes</td>
* <td headers="cri efprof rec_ex">yes</td>
* <td headers="cri efprof rec_oth">yes</td></tr>
*
- * <tr><th id="rxp"><p align="left">received_exception</p></th>
+ * <tr><th id="rxp"><p style="text-align:left">received_exception</p></th>
* <td headers="cri rxp send_req">no </td>
* <td headers="cri rxp send_poll">no </td>
* <td headers="cri rxp rec_reply">no </td>
* <td headers="cri rxp rec_ex">yes</td>
* <td headers="cri rxp rec_oth">no </td></tr>
*
- * <tr><th id="rei"><p align="left">received_exception_id</p></th>
+ * <tr><th id="rei"><p style="text-align:left">received_exception_id</p></th>
* <td headers="cri rei send_req">no </td>
* <td headers="cri rei send_poll">no </td>
* <td headers="cri rei rec_reply">no </td>
* <td headers="cri rei rec_ex">yes</td>
* <td headers="cri rei rec_oth">no </td></tr>
*
- * <tr><th id="gec"><p align="left">get_effective_component</p></th>
+ * <tr><th id="gec"><p style="text-align:left">get_effective_component</p></th>
* <td headers="cri gec send_req">yes</td>
* <td headers="cri gec send_poll">no </td>
* <td headers="cri gec rec_reply">yes</td>
* <td headers="cri gec rec_ex">yes</td>
* <td headers="cri gec rec_oth">yes</td></tr>
*
- * <tr><th id="gecs"><p align="left">get_effective_components</p></th>
+ * <tr><th id="gecs"><p style="text-align:left">get_effective_components</p></th>
* <td headers="cri gecs send_req">yes</td>
* <td headers="cri gecs send_poll">no </td>
* <td headers="cri gecs rec_reply">yes</td>
* <td headers="cri gecs rec_ex">yes</td>
* <td headers="cri gecs rec_oth">yes</td></tr>
*
- * <tr><th id="grpcy"><p align="left">get_request_policy</p></th>
+ * <tr><th id="grpcy"><p style="text-align:left">get_request_policy</p></th>
* <td headers="cri grpcy send_req">yes</td>
* <td headers="cri grpcy send_poll">no </td>
* <td headers="cri grpcy rec_reply">yes</td>
* <td headers="cri grpcy rec_ex">yes</td>
* <td headers="cri grpcy rec_oth">yes</td></tr>
*
- * <tr><th id="arsc"><p align="left">add_request_service_context</p></th>
+ * <tr><th id="arsc"><p style="text-align:left">add_request_service_context</p></th>
* <td headers="cri arsc send_req">yes</td>
* <td headers="cri arsc send_poll">no </td>
* <td headers="cri arsc rec_reply">no </td>
@@ -935,7 +936,8 @@
* standard minor code of 14.
*
*
- * <table border=1 summary="Shows the validity of each attribute or operation">
+ * <table class="plain">
+ * <caption style="display:none">Shows the validity of each attribute or operation</caption>
* <thead>
* <tr>
* <th> </th>
@@ -953,21 +955,21 @@
* <td id="ri" colspan=6><i>Inherited from RequestInfo:</i></td>
* </tr>
*
- * <tr><th id="req_id"><p align="left">request_id</p></th>
+ * <tr><th id="req_id"><p style="text-align:left">request_id</p></th>
* <td headers="ri req_id rec_req_ser_con">yes</td>
* <td headers="ri req_id rec_req">yes</td>
* <td headers="ri req_id send_rep">yes</td>
* <td headers="ri req_id send_exc">yes</td>
* <td headers="ri req_id send_oth">yes</td></tr>
*
- * <tr><th id="op"><p align="left">operation</p></th>
+ * <tr><th id="op"><p style="text-align:left">operation</p></th>
* <td headers="ri op rec_req_ser_con">yes</td>
* <td headers="ri op rec_req">yes</td>
* <td headers="ri op send_rep">yes</td>
* <td headers="ri op send_exc">yes</td>
* <td headers="ri op send_oth">yes</td></tr>
*
- * <tr><th id="args"><p align="left">arguments</p></th>
+ * <tr><th id="args"><p style="text-align:left">arguments</p></th>
* <td headers="ri args rec_req_ser_con">no </td>
* <td headers="ri args rec_req">yes<sub>1</sub></td>
* <td headers="ri args send_rep">yes</td>
@@ -975,21 +977,21 @@
* <td headers="ri args send_oth">no<sub>2</sub>
* </td></tr>
*
- * <tr><th id="exps"><p align="left">exceptions</p></th>
+ * <tr><th id="exps"><p style="text-align:left">exceptions</p></th>
* <td headers="ri exps rec_req_ser_con">no </td>
* <td headers="ri exps rec_req">yes</td>
* <td headers="ri exps send_rep">yes</td>
* <td headers="ri exps send_exc">yes</td>
* <td headers="ri exps send_oth">yes</td></tr>
*
- * <tr><th id="contexts"><p align="left">contexts</p></th>
+ * <tr><th id="contexts"><p style="text-align:left">contexts</p></th>
* <td headers="ri contexts rec_req_ser_con">no </td>
* <td headers="ri contexts rec_req">yes</td>
* <td headers="ri contexts send_rep">yes</td>
* <td headers="ri contexts send_exc">yes</td>
* <td headers="ri contexts send_oth">yes</td></tr>
*
- * <tr><th id="op_con"><p align="left">operation_context</p></th>
+ * <tr><th id="op_con"><p style="text-align:left">operation_context</p></th>
* <td headers="ri op_con rec_req_ser_con">no </td>
* <td headers="ri op_con rec_req">yes</td>
* <td headers="ri op_con send_rep">yes</td>
@@ -997,7 +999,7 @@
* <td headers="ri op_con send_oth">no </td>
* </tr>
*
- * <tr><th id="result"><p align="left">result</p></th>
+ * <tr><th id="result"><p style="text-align:left">result</p></th>
* <td headers="ri result rec_req_ser_con">no </td>
* <td headers="ri result rec_req">no </td>
* <td headers="ri result send_rep">yes</td>
@@ -1005,14 +1007,14 @@
* <td headers="ri result send_oth">no </td>
* </tr>
*
- * <tr><th id="res_ex"><p align="left">response_expected</p></th>
+ * <tr><th id="res_ex"><p style="text-align:left">response_expected</p></th>
* <td headers="ri res_ex rec_req_ser_con">yes</td>
* <td headers="ri res_ex rec_req">yes</td>
* <td headers="ri res_ex send_rep">yes</td>
* <td headers="ri res_ex send_exc">yes</td>
* <td headers="ri res_ex send_oth">yes</td></tr>
*
- * <tr><th id="syn_scp"><p align="left">sync_scope</p></th>
+ * <tr><th id="syn_scp"><p style="text-align:left">sync_scope</p></th>
* <td headers="ri syn_scp rec_req_ser_con">yes</td>
* <td headers="ri syn_scp rec_req">yes</td>
* <td headers="ri syn_scp send_rep">yes</td>
--- a/corba/src/java.corba/share/classes/org/omg/PortableInterceptor/package.html Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/org/omg/PortableInterceptor/package.html Thu May 25 09:15:55 2017 -0700
@@ -1,9 +1,9 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!doctype html>
<html>
<head>
<!--
-Copyright (c) 2000, 2015, 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
@@ -29,7 +29,7 @@
-->
</head>
-<body bgcolor="white">
+<body>
Provides a mechanism to register ORB hooks through which ORB services
can intercept the normal flow of execution of the ORB.
@@ -52,7 +52,7 @@
{@link org.omg.PortableInterceptor.ORBInitializer ORBInitializer}</code>
for how to go about registering interceptors.
-<a name="unimpl"></a>
+<a id="unimpl"></a>
<h2>Known limitations / unimplemented methods in package
<code>org.omg.PortableInterceptor</code></h2>
--- a/corba/src/java.corba/share/classes/org/omg/PortableServer/package.html Mon May 22 09:34:38 2017 -0700
+++ b/corba/src/java.corba/share/classes/org/omg/PortableServer/package.html Thu May 25 09:15:55 2017 -0700
@@ -1,9 +1,9 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!doctype html>
<html>
<head>
<!--
- Copyright (c) 2000, 2015, 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
@@ -30,7 +30,7 @@
-->
</head>
-<body bgcolor="white">
+<body>
Provides classes and interfaces for making the server side of your applications
portable across multivendor ORBs.
@@ -160,7 +160,7 @@
<A HREF="../../../../technotes/guides/idl/index.html">Java IDL home page</A>.
<H2>Example Code</H2>
-<a name="sampleserver"></a>
+<a id="sampleserver"></a>
<H3>Example Server Code</H3>
<PRE>
import javax.naming.InitialContext;
--- a/hotspot/.hgtags Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/.hgtags Thu May 25 09:15:55 2017 -0700
@@ -579,3 +579,6 @@
1ca7ed1b17b5776930d641d1379834f3140a74e4 jdk-9+167
fbb9c802649585d19f6d7e81b4a519d44806225a jdk-9+168
16d692be099c5c38eb48cc9aca78b0c900910d5b jdk-9+169
+38a240fd58a287acb1963920b92ed4d9c2fd39e3 jdk-9+170
+9d4746eca95aec3e5a344bf2520745dcc1d17eed jdk-10+7
+f5ded0cf954c770deeecb80f2ba1ba6a05cd979b jdk-10+8
--- a/hotspot/make/templates/gpl-cp-header Mon May 22 09:34:38 2017 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-Copyright (c) %YEARS%, 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.
--- a/hotspot/make/templates/gpl-header Mon May 22 09:34:38 2017 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-Copyright (c) %YEARS%, 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.
--- a/hotspot/src/cpu/aarch64/vm/c1_LIRGenerator_aarch64.cpp Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/src/cpu/aarch64/vm/c1_LIRGenerator_aarch64.cpp Thu May 25 09:15:55 2017 -0700
@@ -1347,6 +1347,16 @@
void LIRGenerator::volatile_field_load(LIR_Address* address, LIR_Opr result,
CodeEmitInfo* info) {
+ // 8179954: We need to make sure that the code generated for
+ // volatile accesses forms a sequentially-consistent set of
+ // operations when combined with STLR and LDAR. Without a leading
+ // membar it's possible for a simple Dekker test to fail if loads
+ // use LD;DMB but stores use STLR. This can happen if C2 compiles
+ // the stores in one method and C1 compiles the loads in another.
+ if (! UseBarriersForVolatile) {
+ __ membar();
+ }
+
__ volatile_load_mem_reg(address, result, info);
}
--- a/hotspot/src/cpu/aarch64/vm/templateTable_aarch64.cpp Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/src/cpu/aarch64/vm/templateTable_aarch64.cpp Thu May 25 09:15:55 2017 -0700
@@ -2389,17 +2389,31 @@
const Register obj = r4;
const Register off = r19;
const Register flags = r0;
+ const Register raw_flags = r6;
const Register bc = r4; // uses same reg as obj, so don't mix them
resolve_cache_and_index(byte_no, cache, index, sizeof(u2));
jvmti_post_field_access(cache, index, is_static, false);
- load_field_cp_cache_entry(obj, cache, index, off, flags, is_static);
+ load_field_cp_cache_entry(obj, cache, index, off, raw_flags, is_static);
if (!is_static) {
// obj is on the stack
pop_and_check_object(obj);
}
+ // 8179954: We need to make sure that the code generated for
+ // volatile accesses forms a sequentially-consistent set of
+ // operations when combined with STLR and LDAR. Without a leading
+ // membar it's possible for a simple Dekker test to fail if loads
+ // use LDR;DMB but stores use STLR. This can happen if C2 compiles
+ // the stores in one method and we interpret the loads in another.
+ if (! UseBarriersForVolatile) {
+ Label notVolatile;
+ __ tbz(raw_flags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile);
+ __ membar(MacroAssembler::AnyAny);
+ __ bind(notVolatile);
+ }
+
const Address field(obj, off);
Label Done, notByte, notBool, notInt, notShort, notChar,
@@ -2407,7 +2421,8 @@
// x86 uses a shift and mask or wings it with a shift plus assert
// the mask is not needed. aarch64 just uses bitfield extract
- __ ubfxw(flags, flags, ConstantPoolCacheEntry::tos_state_shift, ConstantPoolCacheEntry::tos_state_bits);
+ __ ubfxw(flags, raw_flags, ConstantPoolCacheEntry::tos_state_shift,
+ ConstantPoolCacheEntry::tos_state_bits);
assert(btos == 0, "change code, btos != 0");
__ cbnz(flags, notByte);
@@ -2529,9 +2544,11 @@
#endif
__ bind(Done);
- // It's really not worth bothering to check whether this field
- // really is volatile in the slow case.
+
+ Label notVolatile;
+ __ tbz(raw_flags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile);
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
+ __ bind(notVolatile);
}
@@ -2979,6 +2996,19 @@
__ null_check(r0);
const Address field(r0, r1);
+ // 8179954: We need to make sure that the code generated for
+ // volatile accesses forms a sequentially-consistent set of
+ // operations when combined with STLR and LDAR. Without a leading
+ // membar it's possible for a simple Dekker test to fail if loads
+ // use LDR;DMB but stores use STLR. This can happen if C2 compiles
+ // the stores in one method and we interpret the loads in another.
+ if (! UseBarriersForVolatile) {
+ Label notVolatile;
+ __ tbz(r3, ConstantPoolCacheEntry::is_volatile_shift, notVolatile);
+ __ membar(MacroAssembler::AnyAny);
+ __ bind(notVolatile);
+ }
+
// access field
switch (bytecode()) {
case Bytecodes::_fast_agetfield:
@@ -3027,6 +3057,22 @@
__ get_cache_and_index_at_bcp(r2, r3, 2);
__ ldr(r1, Address(r2, in_bytes(ConstantPoolCache::base_offset() +
ConstantPoolCacheEntry::f2_offset())));
+
+ // 8179954: We need to make sure that the code generated for
+ // volatile accesses forms a sequentially-consistent set of
+ // operations when combined with STLR and LDAR. Without a leading
+ // membar it's possible for a simple Dekker test to fail if loads
+ // use LDR;DMB but stores use STLR. This can happen if C2 compiles
+ // the stores in one method and we interpret the loads in another.
+ if (! UseBarriersForVolatile) {
+ Label notVolatile;
+ __ ldrw(r3, Address(r2, in_bytes(ConstantPoolCache::base_offset() +
+ ConstantPoolCacheEntry::flags_offset())));
+ __ tbz(r3, ConstantPoolCacheEntry::is_volatile_shift, notVolatile);
+ __ membar(MacroAssembler::AnyAny);
+ __ bind(notVolatile);
+ }
+
// make sure exception is reported in correct bcp range (getfield is
// next instruction)
__ increment(rbcp);
--- a/hotspot/src/share/vm/classfile/stringTable.cpp Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/src/share/vm/classfile/stringTable.cpp Thu May 25 09:15:55 2017 -0700
@@ -314,7 +314,11 @@
}
void StringTable::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int* processed, int* removed) {
- buckets_unlink_or_oops_do(is_alive, f, 0, the_table()->table_size(), processed, removed);
+ BucketUnlinkContext context;
+ buckets_unlink_or_oops_do(is_alive, f, 0, the_table()->table_size(), &context);
+ _the_table->bulk_free_entries(&context);
+ *processed = context._num_processed;
+ *removed = context._num_removed;
}
void StringTable::possibly_parallel_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int* processed, int* removed) {
@@ -323,6 +327,7 @@
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
const int limit = the_table()->table_size();
+ BucketUnlinkContext context;
for (;;) {
// Grab next set of buckets to scan
int start_idx = Atomic::add(ClaimChunkSize, &_parallel_claimed_idx) - ClaimChunkSize;
@@ -332,8 +337,11 @@
}
int end_idx = MIN2(limit, start_idx + ClaimChunkSize);
- buckets_unlink_or_oops_do(is_alive, f, start_idx, end_idx, processed, removed);
+ buckets_unlink_or_oops_do(is_alive, f, start_idx, end_idx, &context);
}
+ _the_table->bulk_free_entries(&context);
+ *processed = context._num_processed;
+ *removed = context._num_removed;
}
void StringTable::buckets_oops_do(OopClosure* f, int start_idx, int end_idx) {
@@ -359,7 +367,7 @@
}
}
-void StringTable::buckets_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int start_idx, int end_idx, int* processed, int* removed) {
+void StringTable::buckets_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int start_idx, int end_idx, BucketUnlinkContext* context) {
const int limit = the_table()->table_size();
assert(0 <= start_idx && start_idx <= limit,
@@ -383,10 +391,9 @@
p = entry->next_addr();
} else {
*p = entry->next();
- the_table()->free_entry(entry);
- (*removed)++;
+ context->free_entry(entry);
}
- (*processed)++;
+ context->_num_processed++;
entry = *p;
}
}
--- a/hotspot/src/share/vm/classfile/stringTable.hpp Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/src/share/vm/classfile/stringTable.hpp Thu May 25 09:15:55 2017 -0700
@@ -61,9 +61,13 @@
// Apply the give oop closure to the entries to the buckets
// in the range [start_idx, end_idx).
static void buckets_oops_do(OopClosure* f, int start_idx, int end_idx);
+
+ typedef StringTable::BucketUnlinkContext BucketUnlinkContext;
// Unlink or apply the give oop closure to the entries to the buckets
- // in the range [start_idx, end_idx).
- static void buckets_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int start_idx, int end_idx, int* processed, int* removed);
+ // in the range [start_idx, end_idx). Unlinked bucket entries are collected in the given
+ // context to be freed later.
+ // This allows multiple threads to work on the table at once.
+ static void buckets_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int start_idx, int end_idx, BucketUnlinkContext* context);
// Hashing algorithm, used as the hash value used by the
// StringTable for bucket selection and comparison (stored in the
--- a/hotspot/src/share/vm/classfile/symbolTable.cpp Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/src/share/vm/classfile/symbolTable.cpp Thu May 25 09:15:55 2017 -0700
@@ -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
@@ -98,7 +98,7 @@
int SymbolTable::_symbols_counted = 0;
volatile int SymbolTable::_parallel_claimed_idx = 0;
-void SymbolTable::buckets_unlink(int start_idx, int end_idx, int* processed, int* removed) {
+void SymbolTable::buckets_unlink(int start_idx, int end_idx, BucketUnlinkContext* context) {
for (int i = start_idx; i < end_idx; ++i) {
HashtableEntry<Symbol*, mtSymbol>** p = the_table()->bucket_addr(i);
HashtableEntry<Symbol*, mtSymbol>* entry = the_table()->bucket(i);
@@ -111,15 +111,14 @@
break;
}
Symbol* s = entry->literal();
- (*processed)++;
+ context->_num_processed++;
assert(s != NULL, "just checking");
// If reference count is zero, remove.
if (s->refcount() == 0) {
assert(!entry->is_shared(), "shared entries should be kept live");
delete s;
- (*removed)++;
*p = entry->next();
- the_table()->free_entry(entry);
+ context->free_entry(entry);
} else {
p = entry->next_addr();
}
@@ -132,17 +131,20 @@
// Remove unreferenced symbols from the symbol table
// This is done late during GC.
void SymbolTable::unlink(int* processed, int* removed) {
- size_t memory_total = 0;
- buckets_unlink(0, the_table()->table_size(), processed, removed);
- _symbols_removed += *removed;
- _symbols_counted += *processed;
+ BucketUnlinkContext context;
+ buckets_unlink(0, the_table()->table_size(), &context);
+ _the_table->bulk_free_entries(&context);
+ *processed = context._num_processed;
+ *removed = context._num_removed;
+
+ _symbols_removed = context._num_removed;
+ _symbols_counted = context._num_processed;
}
void SymbolTable::possibly_parallel_unlink(int* processed, int* removed) {
const int limit = the_table()->table_size();
- size_t memory_total = 0;
-
+ BucketUnlinkContext context;
for (;;) {
// Grab next set of buckets to scan
int start_idx = Atomic::add(ClaimChunkSize, &_parallel_claimed_idx) - ClaimChunkSize;
@@ -152,10 +154,15 @@
}
int end_idx = MIN2(limit, start_idx + ClaimChunkSize);
- buckets_unlink(start_idx, end_idx, processed, removed);
+ buckets_unlink(start_idx, end_idx, &context);
}
- Atomic::add(*processed, &_symbols_counted);
- Atomic::add(*removed, &_symbols_removed);
+
+ _the_table->bulk_free_entries(&context);
+ *processed = context._num_processed;
+ *removed = context._num_removed;
+
+ Atomic::add(context._num_processed, &_symbols_counted);
+ Atomic::add(context._num_removed, &_symbols_removed);
}
// Create a new table and using alternate hash code, populate the new table
--- a/hotspot/src/share/vm/classfile/symbolTable.hpp Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/src/share/vm/classfile/symbolTable.hpp Thu May 25 09:15:55 2017 -0700
@@ -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
@@ -154,8 +154,11 @@
static volatile int _parallel_claimed_idx;
- // Release any dead symbols
- static void buckets_unlink(int start_idx, int end_idx, int* processed, int* removed);
+ typedef SymbolTable::BucketUnlinkContext BucketUnlinkContext;
+ // Release any dead symbols. Unlinked bucket entries are collected in the given
+ // context to be freed later.
+ // This allows multiple threads to work on the table at once.
+ static void buckets_unlink(int start_idx, int end_idx, BucketUnlinkContext* context);
public:
enum {
symbol_alloc_batch_size = 8,
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Thu May 25 09:15:55 2017 -0700
@@ -675,7 +675,7 @@
\
nonstatic_field(BasicHashtable<mtInternal>, _table_size, int) \
nonstatic_field(BasicHashtable<mtInternal>, _buckets, HashtableBucket<mtInternal>*) \
- nonstatic_field(BasicHashtable<mtInternal>, _free_list, BasicHashtableEntry<mtInternal>*) \
+ volatile_nonstatic_field(BasicHashtable<mtInternal>, _free_list, BasicHashtableEntry<mtInternal>*) \
nonstatic_field(BasicHashtable<mtInternal>, _first_free_entry, char*) \
nonstatic_field(BasicHashtable<mtInternal>, _end_block, char*) \
nonstatic_field(BasicHashtable<mtInternal>, _entry_size, int) \
--- a/hotspot/src/share/vm/utilities/hashtable.cpp Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/src/share/vm/utilities/hashtable.cpp Thu May 25 09:15:55 2017 -0700
@@ -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
@@ -173,6 +173,35 @@
}
}
+template <MEMFLAGS F> void BasicHashtable<F>::BucketUnlinkContext::free_entry(BasicHashtableEntry<F>* entry) {
+ entry->set_next(_removed_head);
+ _removed_head = entry;
+ if (_removed_tail == NULL) {
+ _removed_tail = entry;
+ }
+ _num_removed++;
+}
+
+template <MEMFLAGS F> void BasicHashtable<F>::bulk_free_entries(BucketUnlinkContext* context) {
+ if (context->_num_removed == 0) {
+ assert(context->_removed_head == NULL && context->_removed_tail == NULL,
+ "Zero entries in the unlink context, but elements linked from " PTR_FORMAT " to " PTR_FORMAT,
+ p2i(context->_removed_head), p2i(context->_removed_tail));
+ return;
+ }
+
+ // MT-safe add of the list of BasicHashTableEntrys from the context to the free list.
+ BasicHashtableEntry<F>* current = _free_list;
+ while (true) {
+ context->_removed_tail->set_next(current);
+ BasicHashtableEntry<F>* old = (BasicHashtableEntry<F>*)Atomic::cmpxchg_ptr(context->_removed_head, &_free_list, current);
+ if (old == current) {
+ break;
+ }
+ current = old;
+ }
+ Atomic::add(-context->_num_removed, &_number_of_entries);
+}
// Copy the table to the shared space.
--- a/hotspot/src/share/vm/utilities/hashtable.hpp Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/src/share/vm/utilities/hashtable.hpp Thu May 25 09:15:55 2017 -0700
@@ -173,11 +173,11 @@
// Instance variables
int _table_size;
HashtableBucket<F>* _buckets;
- BasicHashtableEntry<F>* _free_list;
+ BasicHashtableEntry<F>* volatile _free_list;
char* _first_free_entry;
char* _end_block;
int _entry_size;
- int _number_of_entries;
+ volatile int _number_of_entries;
protected:
@@ -225,6 +225,24 @@
// Free the buckets in this hashtable
void free_buckets();
+ // Helper data structure containing context for the bucket entry unlink process,
+ // storing the unlinked buckets in a linked list.
+ // Also avoids the need to pass around these four members as parameters everywhere.
+ struct BucketUnlinkContext {
+ int _num_processed;
+ int _num_removed;
+ // Head and tail pointers for the linked list of removed entries.
+ BasicHashtableEntry<F>* _removed_head;
+ BasicHashtableEntry<F>* _removed_tail;
+
+ BucketUnlinkContext() : _num_processed(0), _num_removed(0), _removed_head(NULL), _removed_tail(NULL) {
+ }
+
+ void free_entry(BasicHashtableEntry<F>* entry);
+ };
+ // Add of bucket entries linked together in the given context to the global free list. This method
+ // is mt-safe wrt. to other calls of this method.
+ void bulk_free_entries(BucketUnlinkContext* context);
public:
int table_size() { return _table_size; }
void set_entry(int index, BasicHashtableEntry<F>* entry);
--- a/hotspot/test/gc/arguments/TestDynMaxHeapFreeRatio.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/gc/arguments/TestDynMaxHeapFreeRatio.java Thu May 25 09:15:55 2017 -0700
@@ -24,7 +24,7 @@
import static jdk.test.lib.Asserts.assertEQ;
import static jdk.test.lib.Asserts.assertFalse;
import static jdk.test.lib.Asserts.assertTrue;
-import jdk.test.lib.DynamicVMOption;
+import jdk.test.lib.management.DynamicVMOption;
/**
* @test TestDynMaxHeapFreeRatio
--- a/hotspot/test/gc/arguments/TestDynMinHeapFreeRatio.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/gc/arguments/TestDynMinHeapFreeRatio.java Thu May 25 09:15:55 2017 -0700
@@ -38,7 +38,7 @@
import static jdk.test.lib.Asserts.assertEQ;
import static jdk.test.lib.Asserts.assertFalse;
import static jdk.test.lib.Asserts.assertTrue;
-import jdk.test.lib.DynamicVMOption;
+import jdk.test.lib.management.DynamicVMOption;
public class TestDynMinHeapFreeRatio {
--- a/hotspot/test/gc/metaspace/TestMetaspacePerfCounters.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/gc/metaspace/TestMetaspacePerfCounters.java Thu May 25 09:15:55 2017 -0700
@@ -26,7 +26,7 @@
import java.util.ArrayList;
import jdk.test.lib.ByteCodeLoader;
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.Platform;
import sun.management.ManagementFactoryHelper;
--- a/hotspot/test/gc/parallel/TestDynShrinkHeap.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/gc/parallel/TestDynShrinkHeap.java Thu May 25 09:15:55 2017 -0700
@@ -31,7 +31,7 @@
* @library /test/lib /
* @run main/othervm -XX:+UseAdaptiveSizePolicyWithSystemGC -XX:+UseParallelGC -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=100 -Xmx1g -verbose:gc TestDynShrinkHeap
*/
-import jdk.test.lib.DynamicVMOption;
+import jdk.test.lib.management.DynamicVMOption;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryUsage;
import java.util.ArrayList;
--- a/hotspot/test/runtime/BadObjectClass/BootstrapRedefine.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/BadObjectClass/BootstrapRedefine.java Thu May 25 09:15:55 2017 -0700
@@ -31,7 +31,7 @@
* @run main BootstrapRedefine
*/
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
--- a/hotspot/test/runtime/CommandLine/OptionsValidation/TestJcmdOutput.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/CommandLine/OptionsValidation/TestJcmdOutput.java Thu May 25 09:15:55 2017 -0700
@@ -34,7 +34,7 @@
*/
import jdk.test.lib.Asserts;
-import jdk.test.lib.DynamicVMOption;
+import jdk.test.lib.management.DynamicVMOption;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.dcmd.PidJcmdExecutor;
--- a/hotspot/test/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOption.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOption.java Thu May 25 09:15:55 2017 -0700
@@ -29,7 +29,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import jdk.test.lib.DynamicVMOption;
+import jdk.test.lib.management.DynamicVMOption;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.dcmd.CommandExecutor;
--- a/hotspot/test/runtime/CommandLine/VMOptionsFile/TestVMOptionsFile.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/CommandLine/VMOptionsFile/TestVMOptionsFile.java Thu May 25 09:15:55 2017 -0700
@@ -51,7 +51,7 @@
import java.util.Properties;
import java.util.Set;
import jdk.test.lib.Asserts;
-import jdk.test.lib.DynamicVMOption;
+import jdk.test.lib.management.DynamicVMOption;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
--- a/hotspot/test/runtime/RedefineTests/ModifyAnonymous.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/RedefineTests/ModifyAnonymous.java Thu May 25 09:15:55 2017 -0700
@@ -34,15 +34,14 @@
import java.io.FileNotFoundException;
import java.io.PrintWriter;
-import java.lang.NoSuchFieldException;
-import java.lang.NoSuchMethodException;
import java.lang.RuntimeException;
import java.lang.instrument.ClassDefinition;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;
-import jdk.test.lib.*;
+
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
public class ModifyAnonymous {
--- a/hotspot/test/runtime/Unsafe/DefineClass.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/Unsafe/DefineClass.java Thu May 25 09:15:55 2017 -0700
@@ -32,8 +32,8 @@
*/
import java.security.ProtectionDomain;
-import java.io.InputStream;
-import jdk.test.lib.InMemoryJavaCompiler;
+
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.internal.misc.Unsafe;
import static jdk.test.lib.Asserts.*;
--- a/hotspot/test/runtime/Unsafe/NestedUnsafe.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/Unsafe/NestedUnsafe.java Thu May 25 09:15:55 2017 -0700
@@ -31,12 +31,9 @@
* @run main NestedUnsafe
*/
-import java.security.ProtectionDomain;
-import java.io.InputStream;
import java.lang.*;
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.internal.misc.Unsafe;
-import static jdk.test.lib.Asserts.*;
// package p;
--- a/hotspot/test/runtime/defineAnonClass/NestedUnsafe.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/defineAnonClass/NestedUnsafe.java Thu May 25 09:15:55 2017 -0700
@@ -34,11 +34,10 @@
package p;
-import java.security.ProtectionDomain;
-import java.io.InputStream;
import java.lang.*;
-import jdk.test.lib.*;
+
import jdk.internal.misc.Unsafe;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
// Test that an anonymous class in package 'p' cannot define its own anonymous class
--- a/hotspot/test/runtime/defineAnonClass/NestedUnsafe2.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/defineAnonClass/NestedUnsafe2.java Thu May 25 09:15:55 2017 -0700
@@ -34,11 +34,10 @@
package p;
-import java.security.ProtectionDomain;
-import java.io.InputStream;
import java.lang.*;
-import jdk.test.lib.*;
+
import jdk.internal.misc.Unsafe;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
// Test that an anonymous class that gets put in its host's package cannot define
--- a/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java Thu May 25 09:15:55 2017 -0700
@@ -33,7 +33,7 @@
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
--- a/hotspot/test/runtime/modules/ModuleStress/ModuleStress.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/ModuleStress/ModuleStress.java Thu May 25 09:15:55 2017 -0700
@@ -38,8 +38,7 @@
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
-import jdk.test.lib.InMemoryJavaCompiler;
-import java.io.File;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
public class ModuleStress {
--- a/hotspot/test/runtime/modules/PatchModule/PatchModule2Dirs.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModule2Dirs.java Thu May 25 09:15:55 2017 -0700
@@ -30,10 +30,9 @@
* @run main PatchModule2Dirs
*/
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
-import java.io.File;
public class PatchModule2Dirs {
--- a/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java Thu May 25 09:15:55 2017 -0700
@@ -31,8 +31,7 @@
* @run main PatchModuleCDS
*/
-import java.io.File;
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
--- a/hotspot/test/runtime/modules/PatchModule/PatchModuleClassList.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleClassList.java Thu May 25 09:15:55 2017 -0700
@@ -33,7 +33,7 @@
import java.nio.file.Files;
import java.nio.file.Paths;
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
--- a/hotspot/test/runtime/modules/PatchModule/PatchModuleJavaBase.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleJavaBase.java Thu May 25 09:15:55 2017 -0700
@@ -31,7 +31,7 @@
* @run main PatchModuleJavaBase
*/
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
--- a/hotspot/test/runtime/modules/PatchModule/PatchModuleTest.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleTest.java Thu May 25 09:15:55 2017 -0700
@@ -31,7 +31,7 @@
* @run main PatchModuleTest
*/
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
--- a/hotspot/test/runtime/modules/PatchModule/PatchModuleTestJar.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleTestJar.java Thu May 25 09:15:55 2017 -0700
@@ -31,7 +31,7 @@
* @run main PatchModuleTestJar
*/
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
--- a/hotspot/test/runtime/modules/PatchModule/PatchModuleTestJarDir.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleTestJarDir.java Thu May 25 09:15:55 2017 -0700
@@ -32,8 +32,8 @@
*/
import java.io.File;
-import java.nio.file.Files;
-import jdk.test.lib.InMemoryJavaCompiler;
+
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
--- a/hotspot/test/runtime/modules/PatchModule/PatchModuleTraceCL.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleTraceCL.java Thu May 25 09:15:55 2017 -0700
@@ -32,8 +32,7 @@
* @run main PatchModuleTraceCL
*/
-import java.io.File;
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
--- a/hotspot/test/runtime/modules/Visibility/PatchModuleVisibility.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/Visibility/PatchModuleVisibility.java Thu May 25 09:15:55 2017 -0700
@@ -36,7 +36,7 @@
import java.nio.file.Files;
import java.nio.file.Paths;
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
--- a/hotspot/test/runtime/modules/Visibility/XbootcpNoVisibility.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/Visibility/XbootcpNoVisibility.java Thu May 25 09:15:55 2017 -0700
@@ -31,7 +31,7 @@
* @run main/othervm XbootcpNoVisibility
*/
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.ProcessTools;
import jdk.test.lib.process.OutputAnalyzer;
--- a/hotspot/test/runtime/modules/Visibility/XbootcpVisibility.java Mon May 22 09:34:38 2017 -0700
+++ b/hotspot/test/runtime/modules/Visibility/XbootcpVisibility.java Thu May 25 09:15:55 2017 -0700
@@ -36,7 +36,7 @@
import java.nio.file.Files;
import java.nio.file.Paths;
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
import jdk.test.lib.process.OutputAnalyzer;
import jdk.test.lib.process.ProcessTools;
--- a/jaxp/.hgtags Mon May 22 09:34:38 2017 -0700
+++ b/jaxp/.hgtags Thu May 25 09:15:55 2017 -0700
@@ -419,3 +419,6 @@
646567dcfa64b9a39b33d71330427737d1c1a0d5 jdk-9+167
23a87f409371fb8ce7b764cccb3a74c3f6b29900 jdk-9+168
5d9d2a65fb26aa183019346c11d9314819621665 jdk-9+169
+6e78f902f477a093afca85a1042f97410d01eb69 jdk-9+170
+09cae4c36242734f5450de739b8264523a030809 jdk-10+7
+856998840907b67b7e1fc49259f785ac085a189b jdk-10+8
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/FeatureState.java Mon May 22 09:34:38 2017 -0700
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/FeatureState.java Thu May 25 09:15:55 2017 -0700
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,14 +23,6 @@
* questions.
*/
-/*
- * Copyright (c) 2009 by Oracle Corporation. All Rights Reserved.
- */
-
-/*
- * $Id: FeatureState.java 3024 2011-03-01 03:46:13Z joehw $
- */
-
package com.sun.org.apache.xerces.internal.util;
public class FeatureState {
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/ParserConfigurationSettings.java Mon May 22 09:34:38 2017 -0700
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/ParserConfigurationSettings.java Thu May 25 09:15:55 2017 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/PropertyState.java Mon May 22 09:34:38 2017 -0700
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/PropertyState.java Thu May 25 09:15:55 2017 -0700
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,13 +23,6 @@
* questions.
*/
-/*
- * Copyright (c) 2009 by Oracle Corporation. All Rights Reserved.
- */
-
-/*
- * $Id: PropertyState.java 3024 2011-03-01 03:46:13Z joehw $
- */
package com.sun.org.apache.xerces.internal.util;
public class PropertyState {
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/Status.java Mon May 22 09:34:38 2017 -0700
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/util/Status.java Thu May 25 09:15:55 2017 -0700
@@ -1,4 +1,5 @@
/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,13 +23,6 @@
* questions.
*/
-/*
- * Copyright (c) 2009 by Oracle Corporation. All Rights Reserved.
- */
-
-/*
- * $Id: Status.java 3024 2011-03-01 03:46:13Z joehw $
- */
package com.sun.org.apache.xerces.internal.util;
public enum Status {
--- a/jaxp/src/java.xml/share/classes/com/sun/xml/internal/stream/dtd/nonvalidating/XMLSimpleType.java Mon May 22 09:34:38 2017 -0700
+++ b/jaxp/src/java.xml/share/classes/com/sun/xml/internal/stream/dtd/nonvalidating/XMLSimpleType.java Thu May 25 09:15:55 2017 -0700
@@ -1,32 +1,21 @@
/*
* 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).
+ */
+/*
+ * 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
*
- * 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.
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * 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.
- *
- * THIS FILE WAS MODIFIED BY SUN MICROSYSTEMS, INC.
- */
-
-/*
- * Copyright 2005 The Apache Software Foundation.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*/
package com.sun.xml.internal.stream.dtd.nonvalidating;
--- a/jaxp/src/java.xml/share/classes/javax/xml/transform/stax/package.html Mon May 22 09:34:38 2017 -0700
+++ b/jaxp/src/java.xml/share/classes/javax/xml/transform/stax/package.html Thu May 25 09:15:55 2017 -0700
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
-
-Copyright (c) 2005, 2006, 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
@@ -23,48 +22,45 @@
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.
-
-->
<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>javax.xml.transform.stax</title>
-
- <meta name="CVS"
- content="$Id: package.html,v 1.2 2005/11/03 19:34:28 jeffsuttor Exp $" />
- <meta name="AUTHOR"
- content="Jeff.Suttor@Sun.com" />
- <meta name="AUTHOR"
- content="Neeraj.Bajaj@Sun.com" />
- </head>
- <body>
- <p>
- Provides for StAX-specific transformation APIs.
- TODO: better description(s).
- </p>
+ <head>
+ <title>javax.xml.transform.stax</title>
- <h2>Package Specification</h2>
- <ul>
- <li><a href="http://jcp.org/en/jsr/detail?id=173">JSR 173: Streaming API for XML</a></li>
- </ul>
-
- <h2>Related Documentation</h2>
+ <meta name="CVS"
+ content="$Id: package.html,v 1.2 2005/11/03 19:34:28 jeffsuttor Exp $" />
+ <meta name="AUTHOR"
+ content="Jeff.Suttor@Sun.com" />
+ <meta name="AUTHOR"
+ content="Neeraj.Bajaj@Sun.com" />
+ </head>
+ <body>
+ <p>
+ This package implements StAX-specific transformation APIs. It provides
+ classes which allow input from a StAX reader, that is,
+ {@link javax.xml.stream.XMLStreamReader} or {@link javax.xml.stream.XMLEventReader},
+ and output to a StAX writer, that is,
+ {@link javax.xml.stream.XMLStreamWriter} or {@link javax.xml.stream.XMLEventWriter}.
+ </p>
+ <p>
+ The {@link javax.xml.transform.stax.StAXSource} class encapsulates a
+ {@link javax.xml.stream.XMLStreamReader} or {@link javax.xml.stream.XMLEventReader}
+ and can be used as an input where a {@link javax.xml.transform.Source}
+ object is accepted.
+ </p>
+ <p>
+ The {@link javax.xml.transform.stax.StAXResult} class encapsulates a
+ {@link javax.xml.stream.XMLStreamWriter} or {@link javax.xml.stream.XMLEventWriter}
+ and can be used as an output where a {@link javax.xml.transform.Result}
+ object is accepted.
+ </p>
- <p>For overviews, tutorials, examples, guides, and tool documentation, please see:</p>
- <ul>
- <li><a href="">TODO: Refer to non-spec documentation</a></li>
- </ul>
+ @since 1.6
+ </body>
+</html>
- <!-- Put @see and @since tags down here. -->
- <ul>
- <li>@see XMLStreamReader</li>
- <li>@see XMLEventReader</li>
- </ul>
-
- @since 1.6
- </body>
-</html>
--- a/jaxws/.hgtags Mon May 22 09:34:38 2017 -0700
+++ b/jaxws/.hgtags Thu May 25 09:15:55 2017 -0700
@@ -422,3 +422,6 @@
1c610f1b4097c64cdd722a7fb59f5a4d9cc15ca9 jdk-9+167
2746716dcc5a8c28ccf41df0c8fb620b1a1e7098 jdk-9+168
912cf69806d518c5af7fba30b340c4cb5458dd22 jdk-9+169
+e75d3abe579a7b39b762fc0a1a337c49eb072d82 jdk-9+170
+b0efae7df1dfa14926058baebaf999e4268c955c jdk-10+7
+e705867d9989d00e4357f66f18b302c95e13b5e7 jdk-10+8
--- a/jdk/.hgtags Mon May 22 09:34:38 2017 -0700
+++ b/jdk/.hgtags Thu May 25 09:15:55 2017 -0700
@@ -420,3 +420,5 @@
e78da9db6299b3fcba49300d52e2359e82fdd218 jdk-9+168
177436a54ca13730ffc725a6e5dbfcd9486f3da3 jdk-9+169
ef9954f6896bb0b95ac62bf769f68b59a7a56ccd jdk-9+170
+cbd65760a005766610583949b3b5c9ace92e74b3 jdk-10+7
+f0adc10ed8316e6cf316e3208c5ecf6835d22bc4 jdk-10+8
--- a/jdk/src/java.base/share/classes/sun/security/ssl/RecordType.java Mon May 22 09:34:38 2017 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 2015, 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.ssl;
-
-/*
- * enumation of record type
- */
-enum RecordType {
-
- RECORD_CHANGE_CIPHER_SPEC (Record.ct_change_cipher_spec,
- HandshakeMessage.ht_not_applicable),
- RECORD_ALERT (Record.ct_alert,
- HandshakeMessage.ht_not_applicable),
- RECORD_HELLO_REQUEST (Record.ct_handshake,
- HandshakeMessage.ht_hello_request),
- RECORD_CLIENT_HELLO (Record.ct_handshake,
- HandshakeMessage.ht_client_hello),
- RECORD_SERVER_HELLO (Record.ct_handshake,
- HandshakeMessage.ht_server_hello),
- RECORD_HELLO_VERIFY_REQUEST (Record.ct_handshake,
- HandshakeMessage.ht_hello_verify_request),
- RECORD_NEW_SESSION_TICKET (Record.ct_handshake,
- HandshakeMessage.ht_new_session_ticket),
- RECORD_CERTIFICATE (Record.ct_handshake,
- HandshakeMessage.ht_certificate),
- RECORD_SERVER_KEY_EXCHANGE (Record.ct_handshake,
- HandshakeMessage.ht_server_key_exchange),
- RECORD_CERTIFICATE_REQUEST (Record.ct_handshake,
- HandshakeMessage.ht_certificate_request),
- RECORD_SERVER_HELLO_DONE (Record.ct_handshake,
- HandshakeMessage.ht_server_hello_done),
- RECORD_CERTIFICATE_VERIFY (Record.ct_handshake,
- HandshakeMessage.ht_certificate_verify),
- RECORD_CLIENT_KEY_EXCHANGE (Record.ct_handshake,
- HandshakeMessage.ht_client_key_exchange),
- RECORD_FINISHED (Record.ct_handshake,
- HandshakeMessage.ht_finished),
- RECORD_CERTIFICATE_URL (Record.ct_handshake,
- HandshakeMessage.ht_certificate_url),
- RECORD_CERTIFICATE_STATUS (Record.ct_handshake,
- HandshakeMessage.ht_certificate_status),
- RECORD_SUPPLIEMENTAL_DATA (Record.ct_handshake,
- HandshakeMessage.ht_supplemental_data),
- RECORD_APPLICATION_DATA (Record.ct_application_data,
- HandshakeMessage.ht_not_applicable);
-
- byte contentType;
- byte handshakeType;
-
- private RecordType(byte contentType, byte handshakeType) {
- this.contentType = contentType;
- this.handshakeType = handshakeType;
- }
-
- static RecordType valueOf(byte contentType, byte handshakeType) {
- if (contentType == Record.ct_change_cipher_spec) {
- return RECORD_CHANGE_CIPHER_SPEC;
- } else if (contentType == Record.ct_alert) {
- return RECORD_ALERT;
- } else if (contentType == Record.ct_application_data) {
- return RECORD_APPLICATION_DATA;
- } else if (handshakeType == HandshakeMessage.ht_hello_request) {
- return RECORD_HELLO_REQUEST;
- } else if (handshakeType == HandshakeMessage.ht_client_hello) {
- return RECORD_CLIENT_HELLO;
- } else if (handshakeType == HandshakeMessage.ht_server_hello) {
- return RECORD_SERVER_HELLO;
- } else if (handshakeType == HandshakeMessage.ht_hello_verify_request) {
- return RECORD_HELLO_VERIFY_REQUEST;
- } else if (handshakeType == HandshakeMessage.ht_new_session_ticket) {
- return RECORD_NEW_SESSION_TICKET;
- } else if (handshakeType == HandshakeMessage.ht_certificate) {
- return RECORD_CERTIFICATE;
- } else if (handshakeType == HandshakeMessage.ht_server_key_exchange) {
- return RECORD_SERVER_KEY_EXCHANGE;
- } else if (handshakeType == HandshakeMessage.ht_certificate_request) {
- return RECORD_CERTIFICATE_REQUEST;
- } else if (handshakeType == HandshakeMessage.ht_server_hello_done) {
- return RECORD_SERVER_HELLO_DONE;
- } else if (handshakeType == HandshakeMessage.ht_certificate_verify) {
- return RECORD_CERTIFICATE_VERIFY;
- } else if (handshakeType == HandshakeMessage.ht_client_key_exchange) {
- return RECORD_CLIENT_KEY_EXCHANGE;
- } else if (handshakeType == HandshakeMessage.ht_finished) {
- return RECORD_FINISHED;
- } else if (handshakeType == HandshakeMessage.ht_certificate_url) {
- return RECORD_CERTIFICATE_URL;
- } else if (handshakeType == HandshakeMessage.ht_certificate_status) {
- return RECORD_CERTIFICATE_STATUS;
- } else if (handshakeType == HandshakeMessage.ht_supplemental_data) {
- return RECORD_SUPPLIEMENTAL_DATA;
- }
-
- // otherwise, invalid record type
- throw new IllegalArgumentException(
- "Invalid record type (ContentType:" + contentType +
- ", HandshakeType:" + handshakeType + ")");
- }
-}
--- a/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/KeyStore.java Mon May 22 09:34:38 2017 -0700
+++ b/jdk/src/jdk.crypto.mscapi/windows/classes/sun/security/mscapi/KeyStore.java Thu May 25 09:15:55 2017 -0700
@@ -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
@@ -513,7 +513,7 @@
if (entry != null) {
// Get end-entity certificate and remove from system cert store
X509Certificate[] certChain = entry.getCertificateChain();
- if (certChain != null) {
+ if (certChain != null && certChain.length > 0) {
try {
@@ -629,7 +629,9 @@
for (Map.Entry<String,KeyEntry> mapEntry : entries.entrySet()) {
KeyEntry entry = mapEntry.getValue();
- if (entry.certChain != null && entry.certChain[0].equals(cert)) {
+ if (entry.certChain != null &&
+ entry.certChain.length > 0 &&
+ entry.certChain[0].equals(cert)) {
return entry.getAlias();
}
}
--- a/jdk/test/java/lang/Thread/ThreadStateController.java Mon May 22 09:34:38 2017 -0700
+++ b/jdk/test/java/lang/Thread/ThreadStateController.java Thu May 25 09:15:55 2017 -0700
@@ -27,7 +27,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport;
-import jdk.testlibrary.LockFreeLogManager;
+import jdk.test.lib.LockFreeLogger;
import jdk.testlibrary.Utils;
/**
@@ -100,7 +100,7 @@
private final AtomicInteger iterations = new AtomicInteger();
private final AtomicInteger interrupted = new AtomicInteger();
- private final LockFreeLogManager logManager = new LockFreeLogManager();
+ private final LockFreeLogger logger = new LockFreeLogger();
@Override
public void run() {
@@ -349,7 +349,7 @@
}
private void log(String msg, Object ... params) {
- logManager.log(msg, params);
+ logger.log(msg, params);
}
/**
@@ -361,6 +361,6 @@
public String getLog() throws InterruptedException {
this.join();
- return logManager.toString();
+ return logger.toString();
}
}
--- a/jdk/test/java/lang/Thread/ThreadStateTest.java Mon May 22 09:34:38 2017 -0700
+++ b/jdk/test/java/lang/Thread/ThreadStateTest.java Thu May 25 09:15:55 2017 -0700
@@ -31,6 +31,7 @@
*
* @author Mandy Chung
* @library /lib/testlibrary
+ * @library /test/lib
* @build jdk.testlibrary.*
* @build ThreadStateTest ThreadStateController
* @run main/othervm -Xmixed ThreadStateTest
--- a/jdk/test/java/lang/management/ThreadMXBean/Locks.java Mon May 22 09:34:38 2017 -0700
+++ b/jdk/test/java/lang/management/ThreadMXBean/Locks.java Thu May 25 09:15:55 2017 -0700
@@ -29,17 +29,17 @@
* @author Mandy Chung
* @author Jaroslav Bachorik
*
- * @library /lib/testlibrary
+ * @library /test/lib
*
- * @build jdk.testlibrary.*
* @run main/othervm Locks
*/
import java.lang.management.*;
import java.util.Arrays;
+import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.Phaser;
import java.util.function.Predicate;
-import jdk.testlibrary.LockFreeLogManager;
+import jdk.test.lib.LockFreeLogger;
public class Locks {
@@ -47,7 +47,7 @@
private static final Object OBJB = new Object();
private static final EnhancedWaiter OBJC = new EnhancedWaiter();
private static final ThreadMXBean TM = ManagementFactory.getThreadMXBean();
- private static final LockFreeLogManager LOGGER = new LockFreeLogManager();
+ private static final LockFreeLogger LOGGER = new LockFreeLogger();
private static String getLockName(Object lock) {
if (lock == null) return null;
@@ -60,12 +60,12 @@
if (t == null) {
return;
}
- Optional<ThreadInfo> result = Arrays.asList(
- TM.getThreadInfo(TM.getAllThreadIds(), true, true)).
- stream().
- filter(tInfo -> (tInfo != null && tInfo.getLockOwnerName() != null)
- ? tInfo.getLockOwnerName().equals(t.getName()) : false).
- findAny();
+ String name = t.getName();
+ Optional<ThreadInfo> result = Arrays.stream(
+ TM.getThreadInfo(TM.getAllThreadIds(), true, true))
+ .filter(Objects::nonNull)
+ .filter(i -> name.equals(i.getLockOwnerName()))
+ .findAny();
if (result.isPresent()) {
throw new RuntimeException("Thread " + t.getName() + " is not "
+ "supposed to be hold any lock. Currently owning lock : "
--- a/jdk/test/java/lang/management/ThreadMXBean/ThreadMXBeanStateTest.java Mon May 22 09:34:38 2017 -0700
+++ b/jdk/test/java/lang/management/ThreadMXBean/ThreadMXBeanStateTest.java Thu May 25 09:15:55 2017 -0700
@@ -31,6 +31,7 @@
*
* @library ../../Thread
* @library /lib/testlibrary
+ * @library /test/lib
*
* @build jdk.testlibrary.*
* @build ThreadMXBeanStateTest ThreadStateController
--- a/jdk/test/lib/testlibrary/ModuleInfoMaker.java Mon May 22 09:34:38 2017 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +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.
- */
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Stream;
-
-import static org.testng.Assert.assertTrue;
-
-/**
- * Utility class for creating test modules.
- */
-public class ModuleInfoMaker {
- private static String MODULE_INFO_JAVA = "module-info.java";
- private static Pattern MODULE_PATTERN =
- Pattern.compile("module\\s+((?:\\w+\\.)*)");
- private static Pattern PACKAGE_PATTERN =
- Pattern.compile("package\\s+(((?:\\w+\\.)*)(?:\\w+))");
- private static Pattern CLASS_PATTERN =
- Pattern.compile("(?:public\\s+)?(?:class|enum|interface)\\s+(\\w+)");
-
- private final Path dir;
- public ModuleInfoMaker(Path dir) {
- this.dir = dir;
- }
-
- /**
- * Create java source files of the given module
- */
- public void writeJavaFiles(String module, String moduleInfoJava, String... contents)
- throws IOException
- {
- Path msrc = dir.resolve(module);
- new JavaSource(moduleInfoJava).write(msrc);
- for (String c : contents) {
- new JavaSource(c).write(msrc);
- }
- }
-
- /**
- * Compile the module to the given destination.
- */
- public void compile(String module, Path dest, String... options)
- throws IOException
- {
- Path msrc = dir.resolve(module);
- Stream<String> args =
- Stream.concat(Arrays.stream(options),
- Stream.of("--module-source-path",
- dir.toString()));
- assertTrue(CompilerUtils.compile(msrc, dest, args.toArray(String[]::new)),
- "Fail to compile " + module);
- }
-
- static class JavaSource {
- final String source;
- JavaSource(String source) {
- this.source = source;
- }
-
- /**
- * Writes the source code to a file in a specified directory.
- * @param dir the directory
- * @throws IOException if there is a problem writing the file
- */
- public void write(Path dir) throws IOException {
- Path file = dir.resolve(getJavaFileNameFromSource(source));
- Files.createDirectories(file.getParent());
- try (BufferedWriter out = Files.newBufferedWriter(file)) {
- out.write(source.replace("\n", System.lineSeparator()));
- }
- }
-
- /**
- * Extracts the Java file name from the class declaration.
- * This method is intended for simple files and uses regular expressions,
- * so comments matching the pattern can make the method fail.
- */
- static String getJavaFileNameFromSource(String source) {
- String packageName = null;
-
- Matcher matcher = MODULE_PATTERN.matcher(source);
- if (matcher.find())
- return MODULE_INFO_JAVA;
-
- matcher = PACKAGE_PATTERN.matcher(source);
- if (matcher.find())
- packageName = matcher.group(1).replace(".", "/");
-
- matcher = CLASS_PATTERN.matcher(source);
- if (matcher.find()) {
- String className = matcher.group(1) + ".java";
- return (packageName == null) ? className : packageName + "/" + className;
- } else if (packageName != null) {
- return packageName + "/package-info.java";
- } else {
- throw new Error("Could not extract the java class " +
- "name from the provided source");
- }
- }
- }
-}
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/LockFreeLogManager.java Mon May 22 09:34:38 2017 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package jdk.testlibrary;
-
-import java.util.Collection;
-import java.util.Formatter;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
-
-/**
- * A log manager designed specifically to allow collecting ordered log messages
- * in a multi-threaded environment without involving any kind of locking.
- * <p>
- * It is particularly useful in situations when one needs to assert various
- * details about the tested thread state or the locks it hold while also wanting
- * to produce diagnostic log messages.
- * <p>
- * The log manager does not provide any guarantees about the completness of the
- * logs written from different threads - it is up to the caller to make sure
- * {@code toString()} method is called only when all the activity has ceased
- * and the per-thread logs contain all the necessary data.
- *
- * @author Jaroslav Bachorik
- **/
-public class LockFreeLogManager {
- private final AtomicInteger logCntr = new AtomicInteger(0);
- private final Collection<Map<Integer, String>> allRecords = new ConcurrentLinkedQueue<>();
- private final ThreadLocal<Map<Integer, String>> records = new ThreadLocal<Map<Integer, String>>() {
- @Override
- protected Map<Integer, String> initialValue() {
- Map<Integer, String> m = new ConcurrentHashMap<>();
- allRecords.add(m);
- return m;
- }
-
- };
-
- /**
- * Log a message
- * @param format Message format
- * @param params Message parameters
- */
- public void log(String format, Object ... params) {
- int id = logCntr.getAndIncrement();
- try (Formatter formatter = new Formatter()) {
- records.get().put(id, formatter.format(format, params).toString());
- }
- }
-
- /**
- * Will generate an aggregated log of chronologically ordered messages.
- * <p>
- * Make sure that you call this method only when all the related threads
- * have finished; otherwise you might get incomplete data.
- *
- * @return An aggregated log of chronologically ordered messages
- */
- @Override
- public String toString() {
- return allRecords.stream()
- .flatMap(m->m.entrySet().stream())
- .sorted((l, r)->l.getKey().compareTo(r.getKey()))
- .map(e->e.getValue())
- .collect(Collectors.joining());
- }
-}
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/management/ThreadMXBeanTool.java Mon May 22 09:34:38 2017 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2015, 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 jdk.testlibrary.management;
-
-import java.lang.management.ManagementFactory;
-import java.lang.management.ThreadInfo;
-import java.lang.management.ThreadMXBean;
-import java.util.concurrent.TimeoutException;
-
-/**
- * A few utility methods to use ThreadMXBean.
- */
-public final class ThreadMXBeanTool {
-
- /**
- * Waits until {@link Thread} is in the certain {@link State}
- * and blocking on {@code object}.
- *
- * @param state The thread state
- * @param object The object to block on
- */
- public static void waitUntilBlockingOnObject(Thread thread, Thread.State state, Object object)
- throws InterruptedException {
- String want = object == null ? null : object.getClass().getName() + '@'
- + Integer.toHexString(System.identityHashCode(object));
- ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
- while (thread.isAlive()) {
- ThreadInfo ti = tmx.getThreadInfo(thread.getId());
- if (ti.getThreadState() == state
- && (want == null || want.equals(ti.getLockName()))) {
- return;
- }
- Thread.sleep(1);
- }
- }
-
- /**
- * Waits until {@link Thread} is in native.
- */
- public static void waitUntilInNative(Thread thread) throws InterruptedException {
- ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
- while (thread.isAlive()) {
- ThreadInfo ti = tmx.getThreadInfo(thread.getId());
- if (ti.isInNative()) {
- return;
- }
- Thread.sleep(1);
- }
- }
-
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/mscapi/KeyStoreEmptyCertChain.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8172244
+ * @summary Verify that no exception is thrown with empty cert chain
+ * in MSCAPI.
+ * @requires os.family == "windows"
+ * @modules java.base/sun.security.tools.keytool java.base/sun.security.x509
+ * @run main/othervm --add-opens java.base/java.security=ALL-UNNAMED
+ * KeyStoreEmptyCertChain
+ */
+
+import java.security.KeyStore;
+import java.security.cert.Certificate;
+import sun.security.x509.X500Name;
+import sun.security.tools.keytool.CertAndKeyGen;
+import java.security.KeyPairGenerator;
+import java.security.KeyPair;
+import java.security.PrivateKey;
+import java.security.KeyStoreSpi;
+import java.lang.reflect.*;
+
+public class KeyStoreEmptyCertChain {
+
+ public static void main(String[] args) {
+
+ try {
+
+ KeyStore keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
+ keyStore.load(null, null);
+
+ // Generate a certificate to use for testing
+ CertAndKeyGen gen = new CertAndKeyGen("RSA", "SHA256withRSA");
+ gen.generate(2048);
+ Certificate cert =
+ gen.getSelfCertificate(new X500Name("CN=test"), 3600);
+ String alias = "JDK-8172244";
+ char[] password = "password".toCharArray();
+ KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
+
+ // generate a private key for the certificate
+ kpg.initialize(2048);
+ KeyPair keyPair = kpg.generateKeyPair();
+ PrivateKey privKey = keyPair.getPrivate();
+ // need to bypass checks to store the private key without the cert
+ Field spiField = KeyStore.class.getDeclaredField("keyStoreSpi");
+ spiField.setAccessible(true);
+ KeyStoreSpi spi = (KeyStoreSpi) spiField.get(keyStore);
+ spi.engineSetKeyEntry(alias, privKey, password, new Certificate[0]);
+ keyStore.store(null, null);
+
+ keyStore.getCertificateAlias(cert);
+ keyStore.deleteEntry(alias);
+ // test passes if no exception is thrown
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+}
--- a/jdk/test/tools/jmod/hashes/HashesTest.java Mon May 22 09:34:38 2017 -0700
+++ b/jdk/test/tools/jmod/hashes/HashesTest.java Thu May 25 09:15:55 2017 -0700
@@ -25,13 +25,12 @@
* @test
* @bug 8160286
* @summary Test the recording and checking of module hashes
- * @library /lib/testlibrary
+ * @library /test/lib
* @modules java.base/jdk.internal.misc
* java.base/jdk.internal.module
* jdk.compiler
* jdk.jartool
* jdk.jlink
- * @build CompilerUtils ModuleInfoMaker
* @run testng HashesTest
*/
@@ -62,6 +61,8 @@
import jdk.internal.module.ModuleHashes;
import jdk.internal.module.ModulePath;
+import jdk.test.lib.compiler.ModuleInfoMaker;
+
import org.testng.annotations.Test;
import static org.testng.Assert.*;
@@ -382,7 +383,7 @@
makeModule(mn, null, deps);
}
- private void makeModule(String mn, ModuleDescriptor.Requires.Modifier mod, String... deps)
+ private void makeModule(String mn, ModuleDescriptor.Requires.Modifier mod, String... deps)
throws IOException
{
if (mod != null && mod != TRANSITIVE && mod != STATIC) {
@@ -390,23 +391,23 @@
}
StringBuilder sb = new StringBuilder();
- sb.append("module " + mn + " {").append("\n");
- Arrays.stream(deps).forEach(req -> {
- sb.append(" requires ");
- if (mod != null) {
- sb.append(mod.toString().toLowerCase()).append(" ");
- }
- sb.append(req + ";\n");
- });
+ sb.append("module ")
+ .append(mn)
+ .append(" {")
+ .append("\n");
+ Arrays.stream(deps)
+ .forEach(req -> {
+ sb.append(" requires ");
+ if (mod != null) {
+ sb.append(mod.toString().toLowerCase())
+ .append(" ");
+ }
+ sb.append(req)
+ .append(";\n");
+ });
sb.append("}\n");
builder.writeJavaFiles(mn, sb.toString());
-
- compileModule(mn, srcDir);
- }
-
- private void compileModule(String moduleName, Path src) throws IOException {
- Path msrc = src.resolve(moduleName);
- assertTrue(CompilerUtils.compile(msrc, mods, "--module-source-path", src.toString()));
+ builder.compile(mn, mods);
}
private void jmodHashModules(String moduleName, String hashModulesPattern) {
--- a/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java Mon May 22 09:34:38 2017 -0700
+++ b/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java Thu May 25 09:15:55 2017 -0700
@@ -25,9 +25,8 @@
* @test
* @bug 8168836
* @summary Basic argument validation for --add-exports
- * @library /lib/testlibrary
+ * @library /lib/testlibrary /test/lib
* @modules jdk.compiler
- * @build AddExportsTestWarningError CompilerUtils ModuleInfoMaker
* @build jdk.testlibrary.*
* @run testng AddExportsTestWarningError
*/
@@ -40,6 +39,7 @@
import java.util.Arrays;
import java.util.stream.Stream;
+import jdk.test.lib.compiler.ModuleInfoMaker;
import jdk.testlibrary.OutputAnalyzer;
import static jdk.testlibrary.ProcessTools.*;
@@ -48,7 +48,6 @@
import org.testng.annotations.Test;
import static org.testng.Assert.*;
-
@Test
public class AddExportsTestWarningError {
--- a/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java Mon May 22 09:34:38 2017 -0700
+++ b/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java Thu May 25 09:15:55 2017 -0700
@@ -25,9 +25,9 @@
* @test
* @bug 8168836
* @summary Basic argument validation for --add-reads
- * @library /lib/testlibrary
+ * @library /lib/testlibrary /test/lib
* @modules jdk.compiler
- * @build AddReadsTestWarningError CompilerUtils ModuleInfoMaker
+ * @build AddReadsTestWarningError
* @build jdk.testlibrary.*
* @run testng AddReadsTestWarningError
*/
@@ -40,6 +40,7 @@
import java.util.Arrays;
import java.util.stream.Stream;
+import jdk.test.lib.compiler.ModuleInfoMaker;
import jdk.testlibrary.OutputAnalyzer;
import static jdk.testlibrary.ProcessTools.*;
@@ -48,7 +49,6 @@
import org.testng.annotations.Test;
import static org.testng.Assert.*;
-
@Test
public class AddReadsTestWarningError {
--- a/langtools/.hgtags Mon May 22 09:34:38 2017 -0700
+++ b/langtools/.hgtags Thu May 25 09:15:55 2017 -0700
@@ -419,3 +419,6 @@
f260f1a2acf616509a4ee5a29bc7f2acca3853e3 jdk-9+167
bc21e5ba6bf1538551093f57fa0f1a6571be05cc jdk-9+168
0e522ff8b9f52a9d4929af9a6aa84110f4dcd81d jdk-9+169
+18355c879c69a33167f1862896738a7b9a4da729 jdk-9+170
+85581ae8a97f20fd2f817a71eb3cd7b04e492722 jdk-10+7
+6d9a33d72d0647f3981c9d9c636a6f1290689895 jdk-10+8
--- a/langtools/make/gendata/Gendata-jdk.compiler.gmk Mon May 22 09:34:38 2017 -0700
+++ b/langtools/make/gendata/Gendata-jdk.compiler.gmk Thu May 25 09:15:55 2017 -0700
@@ -25,10 +25,20 @@
include JarArchive.gmk
include JavaCompilation.gmk
+include Modules.gmk
include SetupJavaCompilers.gmk
################################################################################
+# This is needed to properly setup DOCS_MODULES.
+$(eval $(call ReadImportMetaData))
+
+# Modules that should be visible for 9 - the documented modules:
+CT_MODULES := $(DOCS_MODULES)
+
+# Get the complete module source path:
+CT_MODULESOURCEPATH := $(call GetModuleSrcPath)
+
CT_DATA_DESCRIPTION ?= $(LANGTOOLS_TOPDIR)/make/data/symbols/symbols
$(eval $(call SetupJavaCompilation, COMPILE_CREATE_SYMBOLS, \
@@ -41,6 +51,8 @@
ifeq ($(BOOT_JDK_MODULAR), true)
COMPILECREATESYMBOLS_ADD_EXPORTS := \
+ --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \
+ --add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED \
--add-exports=jdk.jdeps/com.sun.tools.classfile=ALL-UNNAMED
@@ -59,6 +71,14 @@
build-ctsym \
$(CT_DATA_DESCRIPTION) \
$(@D)
+ $(MKDIR) $(@D)/9
+ $(JAVA_SMALL) $(INTERIM_LANGTOOLS_ARGS) \
+ $(COMPILECREATESYMBOLS_ADD_EXPORTS) \
+ -classpath $(BUILDTOOLS_OUTPUTDIR)/create_symbols \
+ build.tools.symbolgenerator.TransitiveDependencies \
+ $(CT_MODULESOURCEPATH) \
+ $(CT_MODULES) \
+ >$(@D)/9/system-modules
$(TOUCH) $@
# Can't generate ct.sym directly into modules libs as the SetupJarArchive macro
@@ -66,7 +86,7 @@
$(eval $(call SetupJarArchive, CREATE_CTSYM, \
DEPENDENCIES := $(SUPPORT_OUTPUTDIR)/symbols/ct.sym-files/_the.symbols, \
SRCS := $(SUPPORT_OUTPUTDIR)/symbols/ct.sym-files, \
- SUFFIXES := .sig, \
+ SUFFIXES := .sig system-modules, \
JAR := $(SUPPORT_OUTPUTDIR)/symbols/ct.sym, \
))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/make/src/classes/build/tools/symbolgenerator/TransitiveDependencies.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,103 @@
+/*
+ * 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. 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 build.tools.symbolgenerator;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.lang.model.element.ModuleElement.RequiresDirective;
+import javax.lang.model.util.Elements;
+import javax.tools.JavaCompiler;
+import javax.tools.ToolProvider;
+
+import com.sun.tools.javac.api.JavacTaskImpl;
+import com.sun.tools.javac.code.Symbol.ModuleSymbol;
+
+/**
+ * Print reflexive transitive closure of the given modules along their requires transitive edges.
+ */
+public class TransitiveDependencies {
+
+ private static void help() {
+ System.err.println("java TransitiveDependencies <module-source-path> <root-modules>");
+ }
+
+ public static void main(String... args) throws IOException {
+ if (args.length < 1) {
+ help();
+ return ;
+ }
+
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+ List<String> options = Arrays.asList("-source", "9",
+ "-target", "9",
+ "--system", "none",
+ "--module-source-path", args[0],
+ "--add-modules", Arrays.stream(args)
+ .skip(1)
+ .collect(Collectors.joining(",")));
+ List<String> jlObjectList = Arrays.asList("java.lang.Object");
+ JavacTaskImpl task = (JavacTaskImpl) compiler.getTask(null, null, d -> {}, options, jlObjectList, null);
+ task.enter();
+ Elements elements = task.getElements();
+ List<String> todo = new LinkedList<>();
+ Arrays.stream(args).skip(1).forEach(todo::add);
+ Set<String> allModules = new HashSet<>();
+
+ while (!todo.isEmpty()) {
+ String current = todo.remove(0);
+
+ if (!allModules.add(current))
+ continue;
+
+ ModuleSymbol mod = (ModuleSymbol) elements.getModuleElement(current);
+
+ if (mod == null) {
+ throw new IllegalStateException("Missing: " + current);
+ }
+
+ //use the internal structure to avoid unnecesarily completing the symbol using the UsesProvidesVisitor:
+ for (RequiresDirective rd : mod.requires) {
+ if (rd.isTransitive()) {
+ todo.add(rd.getDependency().getQualifiedName().toString());
+ }
+ }
+ }
+
+ allModules.add("java.base");
+ allModules.add("jdk.unsupported");
+
+ allModules.stream()
+ .sorted()
+ .forEach(System.out::println);
+ }
+
+}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java Thu May 25 09:15:55 2017 -0700
@@ -1889,10 +1889,13 @@
Type i = n_i.data.first();
for (Node n_j : nodes) {
Type j = n_j.data.first();
- UndetVar uv_i = (UndetVar)inferenceContext.asUndetVar(i);
- if (Type.containsAny(uv_i.getBounds(InferenceBound.values()), List.of(j))) {
- //update i's bound dependencies
- n_i.addDependency(n_j);
+ // don't compare a variable to itself
+ if (i != j) {
+ UndetVar uv_i = (UndetVar)inferenceContext.asUndetVar(i);
+ if (Type.containsAny(uv_i.getBounds(InferenceBound.values()), List.of(j))) {
+ //update i's bound dependencies
+ n_i.addDependency(n_j);
+ }
}
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java Thu May 25 09:15:55 2017 -0700
@@ -142,6 +142,7 @@
private final ModuleFinder moduleFinder;
private final Source source;
private final boolean allowModules;
+ private final boolean allowAccessIntoSystem;
public final boolean multiModuleMode;
@@ -192,6 +193,7 @@
allowModules = source.allowModules();
Options options = Options.instance(context);
+ allowAccessIntoSystem = options.isUnset(Option.RELEASE);
lintOptions = options.isUnset(Option.XLINT_CUSTOM, "-" + LintCategory.OPTIONS.option);
Collection<String> xmodules = options.keySet()
@@ -1221,7 +1223,7 @@
for (String limit : extraLimitMods) {
limitMods.add(syms.enterModule(names.fromString(limit)));
}
- observable = computeTransitiveClosure(limitMods, null);
+ observable = computeTransitiveClosure(limitMods, rootModules, null);
observable.addAll(rootModules);
if (lintOptions) {
for (ModuleSymbol msym : limitMods) {
@@ -1301,7 +1303,7 @@
}
}
- Set<ModuleSymbol> result = computeTransitiveClosure(enabledRoot, observable);
+ Set<ModuleSymbol> result = computeTransitiveClosure(enabledRoot, rootModules, observable);
result.add(syms.unnamedModule);
@@ -1339,12 +1341,18 @@
return allModules == null || allModules.contains(msym);
}
- private Set<ModuleSymbol> computeTransitiveClosure(Set<? extends ModuleSymbol> base, Set<ModuleSymbol> observable) {
+ private Set<ModuleSymbol> computeTransitiveClosure(Set<? extends ModuleSymbol> base,
+ Set<? extends ModuleSymbol> rootModules,
+ Set<ModuleSymbol> observable) {
List<ModuleSymbol> primaryTodo = List.nil();
List<ModuleSymbol> secondaryTodo = List.nil();
for (ModuleSymbol ms : base) {
- primaryTodo = primaryTodo.prepend(ms);
+ if (rootModules.contains(ms)) {
+ primaryTodo = primaryTodo.prepend(ms);
+ } else {
+ secondaryTodo = secondaryTodo.prepend(ms);
+ }
}
Set<ModuleSymbol> result = new LinkedHashSet<>();
@@ -1367,12 +1375,12 @@
if (!result.add(current) || current == syms.unnamedModule || ((current.flags_field & Flags.AUTOMATIC_MODULE) != 0))
continue;
current.complete();
- if (current.kind == ERR && isPrimaryTodo && warnedMissing.add(current)) {
+ if (current.kind == ERR && (isPrimaryTodo || base.contains(current)) && warnedMissing.add(current)) {
log.error(Errors.ModuleNotFound(current));
}
for (RequiresDirective rd : current.requires) {
if (rd.module == syms.java_base) continue;
- if ((rd.isTransitive() && isPrimaryTodo) || base.contains(current)) {
+ if ((rd.isTransitive() && isPrimaryTodo) || rootModules.contains(current)) {
primaryTodo = primaryTodo.prepend(rd.module);
} else {
secondaryTodo = secondaryTodo.prepend(rd.module);
@@ -1479,6 +1487,10 @@
}
}
+ if (!allowAccessIntoSystem && (msym.flags() & Flags.SYSTEM_MODULE) != 0 &&
+ msym.patchLocation != null) {
+ log.error(Errors.PatchModuleWithRelease(msym));
+ }
}
private Set<ModuleSymbol> retrieveRequiresTransitive(ModuleSymbol msym) {
@@ -1604,6 +1616,12 @@
if (!isValidName(packageName))
continue;
+
+ if (!allowAccessIntoSystem && (msym.flags() & Flags.SYSTEM_MODULE) != 0) {
+ log.error(Errors.AddExportsWithRelease(msym));
+ continue;
+ }
+
PackageSymbol p = syms.enterPackage(msym, names.fromString(packageName));
p.modle = msym; // TODO: do we need this?
@@ -1679,6 +1697,11 @@
continue;
}
+ if (!allowAccessIntoSystem && (msym.flags() & Flags.SYSTEM_MODULE) != 0) {
+ log.error(Errors.AddReadsWithRelease(msym));
+ continue;
+ }
+
for (String targetName : targetNames.split("[ ,]+", -1)) {
ModuleSymbol targetModule;
if (targetName.equals("ALL-UNNAMED")) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java Thu May 25 09:15:55 2017 -0700
@@ -25,6 +25,7 @@
package com.sun.tools.javac.jvm;
+import com.sun.tools.javac.tree.TreeInfo.PosKind;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.tools.javac.util.List;
@@ -1399,12 +1400,16 @@
catchallpc, 0);
startseg = env.info.gaps.next().intValue();
}
- code.statBegin(TreeInfo.finalizerPos(env.tree));
+ code.statBegin(TreeInfo.finalizerPos(env.tree, PosKind.FIRST_STAT_POS));
code.markStatBegin();
Item excVar = makeTemp(syms.throwableType);
excVar.store();
genFinalizer(env);
+ code.resolvePending();
+ code.statBegin(TreeInfo.finalizerPos(env.tree, PosKind.END_POS));
+ code.markStatBegin();
+
excVar.load();
registerCatch(body.pos(), startseg,
env.info.gaps.next().intValue(),
@@ -1418,7 +1423,7 @@
code.resolve(env.info.cont);
// Mark statement line number
- code.statBegin(TreeInfo.finalizerPos(env.tree));
+ code.statBegin(TreeInfo.finalizerPos(env.tree, PosKind.FIRST_STAT_POS));
code.markStatBegin();
// Save return address.
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Arguments.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Arguments.java Thu May 25 09:15:55 2017 -0700
@@ -300,7 +300,8 @@
Option.XBOOTCLASSPATH_PREPEND,
Option.ENDORSEDDIRS, Option.DJAVA_ENDORSED_DIRS,
Option.EXTDIRS, Option.DJAVA_EXT_DIRS,
- Option.SOURCE, Option.TARGET);
+ Option.SOURCE, Option.TARGET,
+ Option.SYSTEM, Option.UPGRADE_MODULE_PATH);
if (platformString != null) {
PlatformDescription platformDescription = PlatformUtils.lookupPlatformDescription(platformString);
@@ -331,7 +332,12 @@
try {
StandardJavaFileManager sfm = (StandardJavaFileManager) fm;
- sfm.setLocationFromPaths(StandardLocation.PLATFORM_CLASS_PATH, platformCP);
+ if (Source.instance(context).allowModules()) {
+ sfm.handleOption("--system", Arrays.asList("none").iterator());
+ sfm.setLocationFromPaths(StandardLocation.UPGRADE_MODULE_PATH, platformCP);
+ } else {
+ sfm.setLocationFromPaths(StandardLocation.PLATFORM_CLASS_PATH, platformCP);
+ }
} catch (IOException ex) {
log.printLines(PrefixKind.JAVAC, "msg.io");
ex.printStackTrace(log.getWriter(WriterKind.NOTICE));
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/platform/JDKPlatformProvider.java Thu May 25 09:15:55 2017 -0700
@@ -26,6 +26,8 @@
package com.sun.tools.javac.platform;
import java.io.IOException;
+import java.net.URI;
+import java.nio.charset.Charset;
import java.nio.file.DirectoryStream;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
@@ -41,6 +43,7 @@
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
+import java.util.stream.Stream;
import javax.annotation.processing.Processor;
@@ -63,7 +66,7 @@
@Override
public PlatformDescription getPlatform(String platformName, String options) {
- return new PlatformDescriptionImpl(platformName);
+ return new PlatformDescriptionImpl(platformName.equals("10") ? "9" : platformName);
}
private static final String[] symbolFileLocation = { "lib", "ct.sym" };
@@ -90,9 +93,10 @@
} catch (IOException | ProviderNotFoundException ex) {
}
}
- // Workaround until full support for --release 9 distinct from --release 10
- SUPPORTED_JAVA_PLATFORM_VERSIONS.add(targetNumericVersion(Target.JDK1_9));
- SUPPORTED_JAVA_PLATFORM_VERSIONS.add(targetNumericVersion(Target.DEFAULT));
+
+ if (SUPPORTED_JAVA_PLATFORM_VERSIONS.contains("9")) {
+ SUPPORTED_JAVA_PLATFORM_VERSIONS.add("10");
+ }
}
private static String targetNumericVersion(Target target) {
@@ -110,12 +114,6 @@
@Override
public Collection<Path> getPlatformPath() {
- // Comparison should be == Target.DEFAULT once --release 9
- // is distinct from 10
- if (Target.lookup(version).compareTo(Target.JDK1_9) >= 0) {
- return null;
- }
-
List<Path> paths = new ArrayList<>();
Path file = findCtSym();
// file == ${jdk.home}/lib/ct.sym
@@ -132,7 +130,21 @@
try (DirectoryStream<Path> dir = Files.newDirectoryStream(root)) {
for (Path section : dir) {
if (section.getFileName().toString().contains(version)) {
- paths.add(section);
+ Path systemModules = section.resolve("system-modules");
+
+ if (Files.isRegularFile(systemModules)) {
+ Path modules =
+ FileSystems.getFileSystem(URI.create("jrt:/"))
+ .getPath("modules");
+ try (Stream<String> lines =
+ Files.lines(systemModules, Charset.forName("UTF-8"))) {
+ lines.map(line -> modules.resolve(line))
+ .filter(mod -> Files.exists(mod))
+ .forEach(mod -> paths.add(mod));
+ }
+ } else {
+ paths.add(section);
+ }
}
}
} catch (IOException ex) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Thu May 25 09:15:55 2017 -0700
@@ -3027,6 +3027,18 @@
compiler.err.addmods.all.module.path.invalid=\
--add-modules ALL-MODULE-PATH can only be used when compiling the unnamed module
+# 0: symbol
+compiler.err.add.exports.with.release=\
+ exporting a package from system module {0} is not allowed with --release
+
+# 0: symbol
+compiler.err.add.reads.with.release=\
+ adding read edges for system module {0} is not allowed with --release
+
+# 0: symbol
+compiler.err.patch.module.with.release=\
+ patching system module {0} is not allowed in combination with --release
+
compiler.warn.addopens.ignored=\
--add-opens has no effect at compile time
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeInfo.java Thu May 25 09:15:55 2017 -0700
@@ -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
@@ -46,6 +46,8 @@
import javax.tools.JavaFileObject;
+import java.util.function.ToIntFunction;
+
import static com.sun.tools.javac.tree.JCTree.JCOperatorExpression.OperandPos.LEFT;
import static com.sun.tools.javac.tree.JCTree.JCOperatorExpression.OperandPos.RIGHT;
@@ -580,13 +582,29 @@
};
}
+ public enum PosKind {
+ START_POS(TreeInfo::getStartPos),
+ FIRST_STAT_POS(TreeInfo::firstStatPos),
+ END_POS(TreeInfo::endPos);
+
+ final ToIntFunction<JCTree> posFunc;
+
+ PosKind(ToIntFunction<JCTree> posFunc) {
+ this.posFunc = posFunc;
+ }
+
+ int toPos(JCTree tree) {
+ return posFunc.applyAsInt(tree);
+ }
+ }
+
/** The position of the finalizer of given try/synchronized statement.
*/
- public static int finalizerPos(JCTree tree) {
+ public static int finalizerPos(JCTree tree, PosKind posKind) {
if (tree.hasTag(TRY)) {
JCTry t = (JCTry) tree;
Assert.checkNonNull(t.finalizer);
- return firstStatPos(t.finalizer);
+ return posKind.toPos(t.finalizer);
} else if (tree.hasTag(SYNCHRONIZED)) {
return endPos(((JCSynchronized) tree).body);
} else {
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/javadoc/package-info.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/javadoc/package-info.java Thu May 25 09:15:55 2017 -0700
@@ -26,7 +26,7 @@
/**
<p style="font-style: italic; font-size:larger">
<b>Note:</b> The declarations in this package have been superseded by those
-in the package {@code jdk.javadoc.doclet}.
+in the package {@link jdk.javadoc.doclet}.
For more information, see the <i>Migration Guide</i> in the documentation for that package.
</p>
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/package-info.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/package-info.java Thu May 25 09:15:55 2017 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2015, 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
@@ -26,16 +26,8 @@
/**
<p style="font-style: italic; font-size:larger">
<b>Note:</b> The declarations in this package have been superseded by those
-in the new package {@code jdk.javadoc.doclet}.
+in the new package {@link jdk.javadoc.doclet}.
</p>
-
- As of JDK version 1.5, replaced by
- {@code com.sun.tools.doclets.internal.toolkit.util}.
-
- <p><b>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.</b>
*/
package com.sun.tools.doclets;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/standard/package-info.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,33 @@
+/*
+ * 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
+ * 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.
+ */
+
+/**
+<p style="font-style: italic; font-size:larger">
+<b>Note:</b> The declarations in this package have been superseded by those
+in the new package {@link jdk.javadoc.doclet}.
+</p>
+*/
+
+package com.sun.tools.doclets.standard;
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractModuleIndexWriter.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractModuleIndexWriter.java Thu May 25 09:15:55 2017 -0700
@@ -25,6 +25,7 @@
package jdk.javadoc.internal.doclets.formats.html;
+import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
@@ -101,7 +102,7 @@
* @param tableSummary summary for the table
* @param body the document tree to which the modules list will be added
*/
- protected abstract void addModulesList(Map<ModuleElement, Set<PackageElement>> modules, String text,
+ protected abstract void addModulesList(Collection<ModuleElement> modules, String text,
String tableSummary, Content body);
/**
@@ -173,7 +174,7 @@
* @param body the document tree to which the index will be added
*/
protected void addIndex(Content body) {
- addIndexContents(modules, "doclet.Module_Summary",
+ addIndexContents(configuration.modules, "doclet.Module_Summary",
configuration.getText("doclet.Member_Table_Summary",
configuration.getText("doclet.Module_Summary"),
configuration.getText("doclet.modules")), body);
@@ -201,7 +202,7 @@
* @param tableSummary summary for the table
* @param body the document tree to which the index contents will be added
*/
- protected void addIndexContents(Map<ModuleElement, Set<PackageElement>> modules, String text,
+ protected void addIndexContents(Collection<ModuleElement> modules, String text,
String tableSummary, Content body) {
HtmlTree htmlTree = (configuration.allowTag(HtmlTag.NAV))
? HtmlTree.NAV()
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexFrameWriter.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexFrameWriter.java Thu May 25 09:15:55 2017 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2016, 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,6 +25,7 @@
package jdk.javadoc.internal.doclets.formats.html;
+import java.util.Collection;
import java.util.Map;
import java.util.Set;
@@ -81,7 +82,7 @@
/**
* {@inheritDoc}
*/
- protected void addModulesList(Map<ModuleElement, Set<PackageElement>> modules, String text,
+ protected void addModulesList(Collection<ModuleElement> modules, String text,
String tableSummary, Content body) {
Content heading = HtmlTree.HEADING(HtmlConstants.MODULE_HEADING, true,
contents.modulesLabel);
@@ -90,7 +91,7 @@
: HtmlTree.DIV(HtmlStyle.indexContainer, heading);
HtmlTree ul = new HtmlTree(HtmlTag.UL);
ul.setTitle(contents.modulesLabel);
- for (ModuleElement mdle: modules.keySet()) {
+ for (ModuleElement mdle: modules) {
ul.addContent(getModuleLink(mdle));
}
htmlTree.addContent(ul);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleIndexWriter.java Thu May 25 09:15:55 2017 -0700
@@ -30,7 +30,7 @@
import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
-import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
+import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
@@ -56,11 +56,16 @@
public class ModuleIndexWriter extends AbstractModuleIndexWriter {
/**
- * Set representing the modules.
+ * Map representing the group of modules as specified on the command line.
*
* @see Group
*/
- private final SortedSet<ModuleElement> modules;
+ private final Map<String, SortedSet<ModuleElement>> groupModuleMap;
+
+ /**
+ * List to store the order groups as specified on the command line.
+ */
+ private final List<String> groupList;
/**
* HTML tree for main tag.
@@ -74,7 +79,8 @@
*/
public ModuleIndexWriter(ConfigurationImpl configuration, DocPath filename) {
super(configuration, filename);
- modules = configuration.modules;
+ groupModuleMap = configuration.group.groupModules(configuration.modules);
+ groupList = configuration.group.getGroupList();
}
/**
@@ -96,11 +102,13 @@
*/
@Override
protected void addIndex(Content body) {
- if (modules != null && !modules.isEmpty()) {
- addIndexContents(configuration.getText("doclet.Modules"),
- configuration.getText("doclet.Member_Table_Summary",
- configuration.getText("doclet.Module_Summary"),
- configuration.getText("doclet.modules")), body);
+ for (String groupname : groupList) {
+ SortedSet<ModuleElement> list = groupModuleMap.get(groupname);
+ if (list != null && !list.isEmpty()) {
+ addIndexContents(list,
+ groupname, configuration.getText("doclet.Member_Table_Summary",
+ groupname, configuration.getText("doclet.modules")), body);
+ }
}
}
@@ -111,7 +119,7 @@
* @param tableSummary summary for the table
* @param body the document tree to which the index contents will be added
*/
- protected void addIndexContents(String title, String tableSummary, Content body) {
+ protected void addIndexContents(Collection<ModuleElement> modules, String title, String tableSummary, Content body) {
HtmlTree htmltree = (configuration.allowTag(HtmlTag.NAV))
? HtmlTree.NAV()
: new HtmlTree(HtmlTag.DIV);
@@ -123,7 +131,7 @@
}
htmltree.addContent(ul);
body.addContent(htmltree);
- addModulesList(title, tableSummary, body);
+ addModulesList(modules, title, tableSummary, body);
}
/**
@@ -133,15 +141,17 @@
* @param tableSummary the summary of the table tag
* @param body the content tree to which the module list will be added
*/
- protected void addModulesList(String text, String tableSummary, Content body) {
+ protected void addModulesList(Collection<ModuleElement> modules, String text, String tableSummary, Content body) {
Content table = (configuration.isOutputHtml5())
? HtmlTree.TABLE(HtmlStyle.overviewSummary, getTableCaption(new RawHtml(text)))
: HtmlTree.TABLE(HtmlStyle.overviewSummary, tableSummary, getTableCaption(new RawHtml(text)));
table.addContent(getSummaryTableHeader(moduleTableHeader, "col"));
Content tbody = new HtmlTree(HtmlTag.TBODY);
- addModulesList(tbody);
+ addModulesList(modules, tbody);
table.addContent(tbody);
- Content div = HtmlTree.DIV(HtmlStyle.contentContainer, table);
+ Content anchor = getMarkerAnchor(text);
+ Content div = HtmlTree.DIV(HtmlStyle.contentContainer, anchor);
+ div.addContent(table);
if (configuration.allowTag(HtmlTag.MAIN)) {
htmlTree.addContent(div);
} else {
@@ -154,7 +164,7 @@
*
* @param tbody the documentation tree to which the list will be added
*/
- protected void addModulesList(Content tbody) {
+ protected void addModulesList(Collection<ModuleElement> modules, Content tbody) {
boolean altColor = true;
for (ModuleElement mdle : modules) {
if (!mdle.isUnnamed()) {
@@ -260,9 +270,4 @@
protected void addModulePackagesList(Map<ModuleElement, Set<PackageElement>> modules, String text,
String tableSummary, Content body, ModuleElement mdle) {
}
-
- @Override
- protected void addModulesList(Map<ModuleElement, Set<PackageElement>> modules, String text,
- String tableSummary, Content body) {
- }
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModulePackageIndexFrameWriter.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModulePackageIndexFrameWriter.java Thu May 25 09:15:55 2017 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2016, 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
@@ -26,6 +26,7 @@
package jdk.javadoc.internal.doclets.formats.html;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -175,7 +176,7 @@
protected void addOverviewHeader(Content body) {
}
- protected void addModulesList(Map<ModuleElement, Set<PackageElement>> modules, String text,
+ protected void addModulesList(Collection<ModuleElement> modules, String text,
String tableSummary, Content body) {
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexWriter.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/PackageIndexWriter.java Thu May 25 09:15:55 2017 -0700
@@ -29,11 +29,12 @@
import javax.lang.model.element.PackageElement;
-import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
+import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
import jdk.javadoc.internal.doclets.formats.html.markup.RawHtml;
+import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
import jdk.javadoc.internal.doclets.toolkit.Content;
import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
@@ -112,8 +113,8 @@
SortedSet<PackageElement> list = groupPackageMap.get(groupname);
if (list != null && !list.isEmpty()) {
addIndexContents(list,
- groupname, configuration.getText("doclet.Member_Table_Summary",
- groupname, configuration.getText("doclet.packages")), body);
+ groupname, configuration.getText("doclet.Member_Table_Summary",
+ groupname, configuration.getText("doclet.packages")), body);
}
}
}
@@ -131,7 +132,9 @@
Content tbody = new HtmlTree(HtmlTag.TBODY);
addPackagesList(packages, tbody);
table.addContent(tbody);
- Content div = HtmlTree.DIV(HtmlStyle.contentContainer, table);
+ Content anchor = getMarkerAnchor(text);
+ Content div = HtmlTree.DIV(HtmlStyle.contentContainer, anchor);
+ div.addContent(table);
if (configuration.allowTag(HtmlTag.MAIN)) {
htmlTree.addContent(div);
} else {
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties Thu May 25 09:15:55 2017 -0700
@@ -192,9 +192,9 @@
doclet.Window_ClassUse_Header=Uses of {0} {1}
doclet.ClassUse_Title=Uses of {0}
doclet.navClassUse=Use
-doclet.Error_in_packagelist=Error in using -group option: {0} {1}
-doclet.Groupname_already_used=In -group option, groupname already used: {0}
-doclet.Same_package_name_used=Package name format used twice: {0}
+doclet.Error_in_grouplist=Bad -group option: {0} {1}
+doclet.Groupname_already_used=In -group option, group name already used: {0}
+doclet.Same_element_name_used=Element name or pattern used twice: {0}
# option specifiers
doclet.usage.d.parameters=\
@@ -274,9 +274,9 @@
Exclude any doc-files subdirectories with given name
doclet.usage.group.parameters=\
- <name> <p1>:<p2>..
+ <name> <g1>:<g2>...
doclet.usage.group.description=\
- Group specified packages together in overview page
+ Group specified elements together in overview page
doclet.usage.nocomment.description=\
Suppress description and tags, generate only declarations
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java Thu May 25 09:15:55 2017 -0700
@@ -699,7 +699,11 @@
typeElementCatalog = new TypeElementCatalog(includedTypeElements, this);
initTagletManager(customTagStrs);
groups.stream().forEach((grp) -> {
- group.checkPackageGroups(grp.value1, grp.value2);
+ if (showModules) {
+ group.checkModuleGroups(grp.value1, grp.value2);
+ } else {
+ group.checkPackageGroups(grp.value1, grp.value2);
+ }
});
}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties Thu May 25 09:15:55 2017 -0700
@@ -49,6 +49,7 @@
doclet.Packages=Packages
doclet.Modules=Modules
doclet.Other_Packages=Other Packages
+doclet.Other_Modules=Other Modules
doclet.Notice_taglet_registered=Registered Taglet {0} ...
doclet.Notice_taglet_unseen=Note: Custom tags that were not seen: {0}
doclet.Notice_taglet_overriden=Note: Custom tags that override standard tags: {0}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/stylesheet.css Thu May 25 09:15:55 2017 -0700
@@ -789,4 +789,82 @@
z-index: 1;
}
+/*
+ * Styles for user-provided tables.
+ *
+ * borderless:
+ * No borders, vertical margins, styled caption.
+ * This style is provided for use with existing doc comments.
+ * In general, borderless tables should not be used for layout purposes.
+ *
+ * plain:
+ * Plain borders around table and cells, vertical margins, styled caption.
+ * Best for small tables or for complex tables for tables with cells that span
+ * rows and columns, when the "striped" style does not work well.
+ *
+ * striped:
+ * Borders around the table and vertical borders between cells, striped rows,
+ * vertical margins, styled caption.
+ * Best for tables that have a header row, and a body containing a series of simple rows.
+ */
+table.borderless,
+table.plain,
+table.striped {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+table.borderless > caption,
+table.plain > caption,
+table.striped > caption {
+ font-weight: bold;
+ font-size: smaller;
+}
+
+table.borderless th, table.borderless td,
+table.plain th, table.plain td,
+table.striped th, table.striped td {
+ padding: 2px 5px;
+}
+
+table.borderless,
+table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th,
+table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td {
+ border: none;
+}
+table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr {
+ background-color: transparent;
+}
+
+table.plain {
+ border-collapse: collapse;
+ border: 1px solid black;
+}
+table.plain > thead > tr, table.plain > tbody tr, table.plain > tr {
+ background-color: transparent;
+}
+table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th,
+table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td {
+ border: 1px solid black;
+}
+
+table.striped {
+ border-collapse: collapse;
+ border: 1px solid black;
+}
+table.striped > thead {
+ background-color: #DDD;
+ border: 1px solid black;
+}
+table.striped > tbody > tr:nth-child(even) {
+ background-color: #EEE
+}
+table.striped > tbody > tr:nth-child(odd) {
+ background-color: #FFF
+}
+table.striped > thead > tr > th, table.striped > tbody > tr > th,
+table.striped > tbody > tr > td, table.striped > tbody > tr > td {
+ border-left: 1px solid black;
+ border-right: 1px solid black;
+}
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Group.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Group.java Thu May 25 09:15:55 2017 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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 @@
import java.util.*;
-import javax.lang.model.element.Element;
+import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import jdk.javadoc.internal.doclets.toolkit.Configuration;
@@ -35,7 +35,7 @@
/**
- * Process and manage grouping of packages, as specified by "-group" option on
+ * Process and manage grouping of elements, as specified by "-group" option on
* the command line.
* <p>
* For example, if user has used -group option as
@@ -79,10 +79,10 @@
private List<String> groupList = new ArrayList<>();
/**
- * Map of non-regular expressions(possible package names) with the
+ * Map of non-regular expressions(possible package or module names) with the
* corresponding group name.
*/
- private Map<String,String> pkgNameGroupMap = new HashMap<>();
+ private Map<String,String> elementNameGroupMap = new HashMap<>();
/**
* The global configuration information for this run.
@@ -107,11 +107,57 @@
}
/**
+ * Depending upon the format of the module name provided in the "-group"
+ * option, generate two separate maps. There will be a map for mapping
+ * regular expression(only meta character allowed is '*' and that is at the
+ * end of the regular expression) on to the group name. And another map
+ * for mapping (possible) module names(if the name format doesn't contain
+ * meta character '*', then it is assumed to be a module name) on to the
+ * group name. This will also sort all the regular expressions found in the
+ * reverse order of their lengths, i.e. longest regular expression will be
+ * first in the sorted list.
+ *
+ * @param groupname The name of the group from -group option.
+ * @param moduleNameFormList List of the module name formats.
+ */
+ public boolean checkModuleGroups(String groupname, String moduleNameFormList) {
+ String[] mdlPatterns = moduleNameFormList.split(":");
+ if (groupList.contains(groupname)) {
+ initMessages();
+ messages.warning("doclet.Groupname_already_used", groupname);
+ return false;
+ }
+ groupList.add(groupname);
+ for (String mdlPattern : mdlPatterns) {
+ if (mdlPattern.length() == 0) {
+ initMessages();
+ messages.warning("doclet.Error_in_grouplist", groupname, moduleNameFormList);
+ return false;
+ }
+ if (mdlPattern.endsWith("*")) {
+ mdlPattern = mdlPattern.substring(0, mdlPattern.length() - 1);
+ if (foundGroupFormat(regExpGroupMap, mdlPattern)) {
+ return false;
+ }
+ regExpGroupMap.put(mdlPattern, groupname);
+ sortedRegExpList.add(mdlPattern);
+ } else {
+ if (foundGroupFormat(elementNameGroupMap, mdlPattern)) {
+ return false;
+ }
+ elementNameGroupMap.put(mdlPattern, groupname);
+ }
+ }
+ Collections.sort(sortedRegExpList, new MapKeyComparator());
+ return true;
+ }
+
+ /**
* Depending upon the format of the package name provided in the "-group"
* option, generate two separate maps. There will be a map for mapping
* regular expression(only meta character allowed is '*' and that is at the
* end of the regular expression) on to the group name. And another map
- * for mapping (possible) package names(if the name format doesen't contain
+ * for mapping (possible) package names(if the name format doesn't contain
* meta character '*', then it is assumed to be a package name) on to the
* group name. This will also sort all the regular expressions found in the
* reverse order of their lengths, i.e. longest regular expression will be
@@ -121,32 +167,31 @@
* @param pkgNameFormList List of the package name formats.
*/
public boolean checkPackageGroups(String groupname, String pkgNameFormList) {
- StringTokenizer strtok = new StringTokenizer(pkgNameFormList, ":");
+ String[] pkgPatterns = pkgNameFormList.split(":");
if (groupList.contains(groupname)) {
initMessages();
messages.warning("doclet.Groupname_already_used", groupname);
return false;
}
groupList.add(groupname);
- while (strtok.hasMoreTokens()) {
- String id = strtok.nextToken();
- if (id.length() == 0) {
+ for (String pkgPattern : pkgPatterns) {
+ if (pkgPattern.length() == 0) {
initMessages();
- messages.warning("doclet.Error_in_packagelist", groupname, pkgNameFormList);
+ messages.warning("doclet.Error_in_grouplist", groupname, pkgNameFormList);
return false;
}
- if (id.endsWith("*")) {
- id = id.substring(0, id.length() - 1);
- if (foundGroupFormat(regExpGroupMap, id)) {
+ if (pkgPattern.endsWith("*")) {
+ pkgPattern = pkgPattern.substring(0, pkgPattern.length() - 1);
+ if (foundGroupFormat(regExpGroupMap, pkgPattern)) {
return false;
}
- regExpGroupMap.put(id, groupname);
- sortedRegExpList.add(id);
+ regExpGroupMap.put(pkgPattern, groupname);
+ sortedRegExpList.add(pkgPattern);
} else {
- if (foundGroupFormat(pkgNameGroupMap, id)) {
+ if (foundGroupFormat(elementNameGroupMap, pkgPattern)) {
return false;
}
- pkgNameGroupMap.put(id, groupname);
+ elementNameGroupMap.put(pkgPattern, groupname);
}
}
Collections.sort(sortedRegExpList, new MapKeyComparator());
@@ -162,39 +207,82 @@
}
/**
- * Search if the given map has given the package format.
+ * Search if the given map has the given element format.
*
* @param map Map to be searched.
- * @param pkgFormat The pacakge format to search.
+ * @param elementFormat The format to search.
*
- * @return true if package name format found in the map, else false.
+ * @return true if element name format found in the map, else false.
*/
- boolean foundGroupFormat(Map<String,?> map, String pkgFormat) {
- if (map.containsKey(pkgFormat)) {
+ boolean foundGroupFormat(Map<String,?> map, String elementFormat) {
+ if (map.containsKey(elementFormat)) {
initMessages();
- messages.error("doclet.Same_package_name_used", pkgFormat);
+ messages.error("doclet.Same_element_name_used", elementFormat);
return true;
}
return false;
}
/**
+ * Group the modules according the grouping information provided on the
+ * command line. Given a list of modules, search each module name in
+ * regular expression map as well as module name map to get the
+ * corresponding group name. Create another map with mapping of group name
+ * to the module list, which will fall under the specified group. If any
+ * module doesn't belong to any specified group on the command line, then
+ * a new group named "Other Modules" will be created for it. If there are
+ * no groups found, in other words if "-group" option is not at all used,
+ * then all the modules will be grouped under group "Modules".
+ *
+ * @param modules Specified modules.
+ * @return map of group names and set of module elements.
+ */
+ public Map<String, SortedSet<ModuleElement>> groupModules(Set<ModuleElement> modules) {
+ Map<String, SortedSet<ModuleElement>> groupModuleMap = new HashMap<>();
+ String defaultGroupName =
+ (elementNameGroupMap.isEmpty() && regExpGroupMap.isEmpty())?
+ configuration.getResources().getText("doclet.Modules") :
+ configuration.getResources().getText("doclet.Other_Modules");
+ // if the user has not used the default group name, add it
+ if (!groupList.contains(defaultGroupName)) {
+ groupList.add(defaultGroupName);
+ }
+ for (ModuleElement mdl : modules) {
+ String moduleName = mdl.isUnnamed() ? null : mdl.getQualifiedName().toString();
+ String groupName = mdl.isUnnamed() ? null : elementNameGroupMap.get(moduleName);
+ // if this module is not explicitly assigned to a group,
+ // try matching it to group specified by regular expression
+ if (groupName == null) {
+ groupName = regExpGroupName(moduleName);
+ }
+ // if it is in neither group map, put it in the default
+ // group
+ if (groupName == null) {
+ groupName = defaultGroupName;
+ }
+ getModuleList(groupModuleMap, groupName).add(mdl);
+ }
+ return groupModuleMap;
+ }
+
+ /**
* Group the packages according the grouping information provided on the
* command line. Given a list of packages, search each package name in
* regular expression map as well as package name map to get the
* corresponding group name. Create another map with mapping of group name
* to the package list, which will fall under the specified group. If any
- * package doesen't belong to any specified group on the comamnd line, then
+ * package doesn't belong to any specified group on the command line, then
* a new group named "Other Packages" will be created for it. If there are
* no groups found, in other words if "-group" option is not at all used,
* then all the packages will be grouped under group "Packages".
*
* @param packages Packages specified on the command line.
+ * @return map of group names and set of package elements
*/
public Map<String, SortedSet<PackageElement>> groupPackages(Set<PackageElement> packages) {
Map<String, SortedSet<PackageElement>> groupPackageMap = new HashMap<>();
String defaultGroupName =
- (pkgNameGroupMap.isEmpty() && regExpGroupMap.isEmpty())?
+ (elementNameGroupMap.isEmpty() && regExpGroupMap.isEmpty())?
configuration.getResources().getText("doclet.Packages") :
configuration.getResources().getText("doclet.Other_Packages");
// if the user has not used the default group name, add it
@@ -203,7 +291,7 @@
}
for (PackageElement pkg : packages) {
String pkgName = pkg.isUnnamed() ? null : configuration.utils.getPackageName(pkg);
- String groupName = pkg.isUnnamed() ? null : pkgNameGroupMap.get(pkgName);
+ String groupName = pkg.isUnnamed() ? null : elementNameGroupMap.get(pkgName);
// if this package is not explicitly assigned to a group,
// try matching it to group specified by regular expression
if (groupName == null) {
@@ -220,15 +308,15 @@
}
/**
- * Search for package name in the sorted regular expression
+ * Search for element name in the sorted regular expression
* list, if found return the group name. If not, return null.
*
- * @param pkgName Name of package to be found in the regular
+ * @param elementName Name of element to be found in the regular
* expression list.
*/
- String regExpGroupName(String pkgName) {
+ String regExpGroupName(String elementName) {
for (String regexp : sortedRegExpList) {
- if (pkgName.startsWith(regexp)) {
+ if (elementName.startsWith(regexp)) {
return regExpGroupMap.get(regexp);
}
}
@@ -239,7 +327,7 @@
* For the given group name, return the package list, on which it is mapped.
* Create a new list, if not found.
*
- * @param map Map to be searched for gorup name.
+ * @param map Map to be searched for group name.
* @param groupname Group name to search.
*/
SortedSet<PackageElement> getPkgList(Map<String, SortedSet<PackageElement>> map,
@@ -248,6 +336,18 @@
}
/**
+ * For the given group name, return the module list, on which it is mapped.
+ * Create a new list, if not found.
+ *
+ * @param map Map to be searched for group name.
+ * @param groupname Group name to search.
+ */
+ SortedSet<ModuleElement> getModuleList(Map<String, SortedSet<ModuleElement>> map,
+ String groupname) {
+ return map.computeIfAbsent(groupname, g -> new TreeSet<>(configuration.utils.makeModuleComparator()));
+ }
+
+ /**
* Return the list of groups, in the same order as specified
* on the command line.
*/
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ArgTokenizer.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ArgTokenizer.java Thu May 25 09:15:55 2017 -0700
@@ -121,6 +121,17 @@
}
/**
+ * Is the specified option allowed.
+ *
+ * @param opt the option to check
+ * @return true if the option is allowed
+ */
+ boolean isAllowedOption(String opt) {
+ Boolean has = options.get(opt);
+ return has != null;
+ }
+
+ /**
* Has the specified option been encountered.
*
* @param opt the option to check
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Thu May 25 09:15:55 2017 -0700
@@ -90,7 +90,6 @@
import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;
import static java.nio.file.StandardOpenOption.WRITE;
import java.util.MissingResourceException;
-import java.util.Optional;
import java.util.ResourceBundle;
import java.util.ServiceLoader;
import java.util.Spliterators;
@@ -126,6 +125,7 @@
public class JShellTool implements MessageHandler {
private static final Pattern LINEBREAK = Pattern.compile("\\R");
+ private static final Pattern ID = Pattern.compile("[se]?\\d+([-\\s].*)?");
static final String RECORD_SEPARATOR = "\u241E";
private static final String RB_NAME_PREFIX = "jdk.internal.jshell.tool.resources";
private static final String VERSION_RB_NAME = RB_NAME_PREFIX + ".version";
@@ -1189,36 +1189,54 @@
}
}
- private void processCommand(String cmd) {
- if (cmd.startsWith("/-")) {
+ /**
+ * Process a command (as opposed to a snippet) -- things that start with
+ * slash.
+ *
+ * @param input
+ */
+ private void processCommand(String input) {
+ if (input.startsWith("/-")) {
try {
//handle "/-[number]"
- cmdUseHistoryEntry(Integer.parseInt(cmd.substring(1)));
+ cmdUseHistoryEntry(Integer.parseInt(input.substring(1)));
return ;
} catch (NumberFormatException ex) {
//ignore
}
}
- String arg = "";
- int idx = cmd.indexOf(' ');
+ String cmd;
+ String arg;
+ int idx = input.indexOf(' ');
if (idx > 0) {
- arg = cmd.substring(idx + 1).trim();
- cmd = cmd.substring(0, idx);
+ arg = input.substring(idx + 1).trim();
+ cmd = input.substring(0, idx);
+ } else {
+ cmd = input;
+ arg = "";
}
+ // find the command as a "real command", not a pseudo-command or doc subject
Command[] candidates = findCommand(cmd, c -> c.kind.isRealCommand);
switch (candidates.length) {
case 0:
- if (!rerunHistoryEntryById(cmd.substring(1))) {
- errormsg("jshell.err.no.such.command.or.snippet.id", cmd);
+ // not found, it is either a snippet command or an error
+ if (ID.matcher(cmd.substring(1)).matches()) {
+ // it is in the form of a snipppet id, see if it is a valid history reference
+ rerunHistoryEntriesById(input);
+ } else {
+ errormsg("jshell.err.invalid.command", cmd);
fluffmsg("jshell.msg.help.for.help");
- } break;
+ }
+ break;
case 1:
Command command = candidates[0];
// If comand was successful and is of a replayable kind, add it the replayable history
if (command.run.apply(arg) && command.kind == CommandKind.REPLAY) {
addToReplayHistory((command.command + " " + arg).trim());
- } break;
+ }
+ break;
default:
+ // command if too short (ambigous), show the possibly matches
errormsg("jshell.err.command.ambiguous", cmd,
Arrays.stream(candidates).map(c -> c.command).collect(Collectors.joining(", ")));
fluffmsg("jshell.msg.help.for.help");
@@ -1701,6 +1719,9 @@
registerCommand(new Command("context",
"help.context",
CommandKind.HELP_SUBJECT));
+ registerCommand(new Command("rerun",
+ "help.rerun",
+ CommandKind.HELP_SUBJECT));
commandCompletions = new ContinuousCompletionProvider(
commands.values().stream()
@@ -2247,6 +2268,20 @@
Predicate<Snippet> defFilter, String rawargs, String cmd) {
ArgTokenizer at = new ArgTokenizer(cmd, rawargs.trim());
at.allowedOptions("-all", "-start");
+ return argsOptionsToSnippets(snippetSupplier, defFilter, at);
+ }
+
+ /**
+ * Convert user arguments to a Stream of snippets referenced by those
+ * arguments (or lack of arguments).
+ *
+ * @param snippets the base list of possible snippets
+ * @param defFilter the filter to apply to the arguments if no argument
+ * @param at the ArgTokenizer, with allowed options set
+ * @return
+ */
+ private <T extends Snippet> Stream<T> argsOptionsToSnippets(Supplier<Stream<T>> snippetSupplier,
+ Predicate<Snippet> defFilter, ArgTokenizer at) {
List<String> args = new ArrayList<>();
String s;
while ((s = at.next()) != null) {
@@ -2263,11 +2298,11 @@
errormsg("jshell.err.conflicting.options", at.whole());
return null;
}
- if (at.hasOption("-all")) {
+ if (at.isAllowedOption("-all") && at.hasOption("-all")) {
// all snippets including start-up, failed, and overwritten
return snippetSupplier.get();
}
- if (at.hasOption("-start")) {
+ if (at.isAllowedOption("-start") && at.hasOption("-start")) {
// start-up snippets
return snippetSupplier.get()
.filter(this::inStartUp);
@@ -2277,54 +2312,227 @@
return snippetSupplier.get()
.filter(defFilter);
}
- return argsToSnippets(snippetSupplier, args);
+ return new ArgToSnippets<>(snippetSupplier).argsToSnippets(args);
}
/**
- * Convert user arguments to a Stream of snippets referenced by those
- * arguments.
+ * Support for converting arguments that are definition names, snippet ids,
+ * or snippet id ranges into a stream of snippets,
*
- * @param snippetSupplier the base list of possible snippets
- * @param args the user's argument to the command, maybe be the empty list
- * @return a Stream of referenced snippets or null if no matches to specific
- * arg
+ * @param <T> the snipper subtype
*/
- private <T extends Snippet> Stream<T> argsToSnippets(Supplier<Stream<T>> snippetSupplier,
- List<String> args) {
- Stream<T> result = null;
- for (String arg : args) {
+ private class ArgToSnippets<T extends Snippet> {
+
+ // the supplier of snippet streams
+ final Supplier<Stream<T>> snippetSupplier;
+ // these two are parallel, and lazily filled if a range is encountered
+ List<T> allSnippets;
+ String[] allIds = null;
+
+ /**
+ *
+ * @param snippetSupplier the base list of possible snippets
+ */
+ ArgToSnippets(Supplier<Stream<T>> snippetSupplier) {
+ this.snippetSupplier = snippetSupplier;
+ }
+
+ /**
+ * Convert user arguments to a Stream of snippets referenced by those
+ * arguments.
+ *
+ * @param args the user's argument to the command, maybe be the empty
+ * list
+ * @return a Stream of referenced snippets or null if no matches to
+ * specific arg
+ */
+ Stream<T> argsToSnippets(List<String> args) {
+ Stream<T> result = null;
+ for (String arg : args) {
+ // Find the best match
+ Stream<T> st = argToSnippets(arg);
+ if (st == null) {
+ return null;
+ } else {
+ result = (result == null)
+ ? st
+ : Stream.concat(result, st);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Convert a user argument to a Stream of snippets referenced by the
+ * argument.
+ *
+ * @param snippetSupplier the base list of possible snippets
+ * @param arg the user's argument to the command
+ * @return a Stream of referenced snippets or null if no matches to
+ * specific arg
+ */
+ Stream<T> argToSnippets(String arg) {
+ if (arg.contains("-")) {
+ return range(arg);
+ }
// Find the best match
Stream<T> st = layeredSnippetSearch(snippetSupplier, arg);
if (st == null) {
- Stream<Snippet> est = layeredSnippetSearch(state::snippets, arg);
- if (est == null) {
+ badSnippetErrormsg(arg);
+ return null;
+ } else {
+ return st;
+ }
+ }
+
+ /**
+ * Look for inappropriate snippets to give best error message
+ *
+ * @param arg the bad snippet arg
+ * @param errKey the not found error key
+ */
+ void badSnippetErrormsg(String arg) {
+ Stream<Snippet> est = layeredSnippetSearch(state::snippets, arg);
+ if (est == null) {
+ if (ID.matcher(arg).matches()) {
+ errormsg("jshell.err.no.snippet.with.id", arg);
+ } else {
errormsg("jshell.err.no.such.snippets", arg);
- } else {
- errormsg("jshell.err.the.snippet.cannot.be.used.with.this.command",
- arg, est.findFirst().get().source());
}
- return null;
- }
- if (result == null) {
- result = st;
} else {
- result = Stream.concat(result, st);
+ errormsg("jshell.err.the.snippet.cannot.be.used.with.this.command",
+ arg, est.findFirst().get().source());
}
}
- return result;
- }
-
- private <T extends Snippet> Stream<T> layeredSnippetSearch(Supplier<Stream<T>> snippetSupplier, String arg) {
- return nonEmptyStream(
- // the stream supplier
- snippetSupplier,
- // look for active user declarations matching the name
- sn -> isActive(sn) && matchingDeclaration(sn, arg),
- // else, look for any declarations matching the name
- sn -> matchingDeclaration(sn, arg),
- // else, look for an id of this name
- sn -> sn.id().equals(arg)
- );
+
+ /**
+ * Search through the snippets for the best match to the id/name.
+ *
+ * @param <R> the snippet type
+ * @param aSnippetSupplier the supplier of snippet streams
+ * @param arg the arg to match
+ * @return a Stream of referenced snippets or null if no matches to
+ * specific arg
+ */
+ <R extends Snippet> Stream<R> layeredSnippetSearch(Supplier<Stream<R>> aSnippetSupplier, String arg) {
+ return nonEmptyStream(
+ // the stream supplier
+ aSnippetSupplier,
+ // look for active user declarations matching the name
+ sn -> isActive(sn) && matchingDeclaration(sn, arg),
+ // else, look for any declarations matching the name
+ sn -> matchingDeclaration(sn, arg),
+ // else, look for an id of this name
+ sn -> sn.id().equals(arg)
+ );
+ }
+
+ /**
+ * Given an id1-id2 range specifier, return a stream of snippets within
+ * our context
+ *
+ * @param arg the range arg
+ * @return a Stream of referenced snippets or null if no matches to
+ * specific arg
+ */
+ Stream<T> range(String arg) {
+ int dash = arg.indexOf('-');
+ String iid = arg.substring(0, dash);
+ String tid = arg.substring(dash + 1);
+ int iidx = snippetIndex(iid);
+ if (iidx < 0) {
+ return null;
+ }
+ int tidx = snippetIndex(tid);
+ if (tidx < 0) {
+ return null;
+ }
+ if (tidx < iidx) {
+ errormsg("jshell.err.end.snippet.range.less.than.start", iid, tid);
+ return null;
+ }
+ return allSnippets.subList(iidx, tidx+1).stream();
+ }
+
+ /**
+ * Lazily initialize the id mapping -- needed only for id ranges.
+ */
+ void initIdMapping() {
+ if (allIds == null) {
+ allSnippets = snippetSupplier.get()
+ .sorted((a, b) -> order(a) - order(b))
+ .collect(toList());
+ allIds = allSnippets.stream()
+ .map(sn -> sn.id())
+ .toArray(n -> new String[n]);
+ }
+ }
+
+ /**
+ * Return all the snippet ids -- within the context, and in order.
+ *
+ * @return the snippet ids
+ */
+ String[] allIds() {
+ initIdMapping();
+ return allIds;
+ }
+
+ /**
+ * Establish an order on snippet ids. All startup snippets are first,
+ * all error snippets are last -- within that is by snippet number.
+ *
+ * @param id the id string
+ * @return an ordering int
+ */
+ int order(String id) {
+ try {
+ switch (id.charAt(0)) {
+ case 's':
+ return Integer.parseInt(id.substring(1));
+ case 'e':
+ return 0x40000000 + Integer.parseInt(id.substring(1));
+ default:
+ return 0x20000000 + Integer.parseInt(id);
+ }
+ } catch (Exception ex) {
+ return 0x60000000;
+ }
+ }
+
+ /**
+ * Establish an order on snippets, based on its snippet id. All startup
+ * snippets are first, all error snippets are last -- within that is by
+ * snippet number.
+ *
+ * @param sn the id string
+ * @return an ordering int
+ */
+ int order(Snippet sn) {
+ return order(sn.id());
+ }
+
+ /**
+ * Find the index into the parallel allSnippets and allIds structures.
+ *
+ * @param s the snippet id name
+ * @return the index, or, if not found, report the error and return a
+ * negative number
+ */
+ int snippetIndex(String s) {
+ int idx = Arrays.binarySearch(allIds(), 0, allIds().length, s,
+ (a, b) -> order(a) - order(b));
+ if (idx < 0) {
+ // the id is not in the snippet domain, find the right error to report
+ if (!ID.matcher(s).matches()) {
+ errormsg("jshell.err.range.requires.id", s);
+ } else {
+ badSnippetErrormsg(s);
+ }
+ }
+ return idx;
+ }
+
}
private boolean cmdDrop(String rawargs) {
@@ -2342,24 +2550,13 @@
errormsg("jshell.err.drop.arg");
return false;
}
- Stream<Snippet> stream = argsToSnippets(this::dropableSnippets, args);
+ Stream<Snippet> stream = new ArgToSnippets<>(this::dropableSnippets).argsToSnippets(args);
if (stream == null) {
// Snippet not found. Error already printed
fluffmsg("jshell.msg.see.classes.etc");
return false;
}
- List<Snippet> snippets = stream.collect(toList());
- if (snippets.size() > args.size()) {
- // One of the args references more thean one snippet
- errormsg("jshell.err.drop.ambiguous");
- fluffmsg("jshell.msg.use.one.of", snippets.stream()
- .map(sn -> String.format("\n/drop %-5s : %s", sn.id(), sn.source().replace("\n", "\n ")))
- .collect(Collectors.joining(", "))
- );
- return false;
- }
- snippets.stream()
- .forEach(sn -> state.drop(sn).forEach(this::handleEvent));
+ stream.forEach(sn -> state.drop(sn).forEach(this::handleEvent));
return true;
}
@@ -2690,37 +2887,38 @@
}
private boolean cmdSave(String rawargs) {
- ArgTokenizer at = new ArgTokenizer("/save", rawargs.trim());
- at.allowedOptions("-all", "-start", "-history");
- String filename = at.next();
- if (filename == null) {
+ // The filename to save to is the last argument, extract it
+ String[] args = rawargs.split("\\s");
+ String filename = args[args.length - 1];
+ if (filename.isEmpty()) {
errormsg("jshell.err.file.filename", "/save");
return false;
}
- if (!checkOptionsAndRemainingInput(at)) {
- return false;
- }
- if (at.optionCount() > 1) {
- errormsg("jshell.err.conflicting.options", at.whole());
+ // All the non-filename arguments are the specifier of what to save
+ String srcSpec = Arrays.stream(args, 0, args.length - 1)
+ .collect(Collectors.joining("\n"));
+ // From the what to save specifier, compute the snippets (as a stream)
+ ArgTokenizer at = new ArgTokenizer("/save", srcSpec);
+ at.allowedOptions("-all", "-start", "-history");
+ Stream<Snippet> snippetStream = argsOptionsToSnippets(state::snippets, this::mainActive, at);
+ if (snippetStream == null) {
+ // error occurred, already reported
return false;
}
try (BufferedWriter writer = Files.newBufferedWriter(toPathResolvingUserHome(filename),
Charset.defaultCharset(),
CREATE, TRUNCATE_EXISTING, WRITE)) {
if (at.hasOption("-history")) {
+ // they want history (commands and snippets), ignore the snippet stream
for (String s : input.currentSessionHistory()) {
writer.write(s);
writer.write("\n");
}
- } else if (at.hasOption("-start")) {
- writer.append(startup.toString());
} else {
- String sources = (at.hasOption("-all")
- ? state.snippets()
- : state.snippets().filter(this::mainActive))
+ // write the snippet stream to the file
+ writer.write(snippetStream
.map(Snippet::source)
- .collect(Collectors.joining("\n"));
- writer.write(sources);
+ .collect(Collectors.joining("\n")));
}
} catch (FileNotFoundException e) {
errormsg("jshell.err.file.not.found", "/save", filename, e.getMessage());
@@ -2837,14 +3035,21 @@
return true;
}
- private boolean rerunHistoryEntryById(String id) {
- Optional<Snippet> snippet = state.snippets()
- .filter(s -> s.id().equals(id))
- .findFirst();
- return snippet.map(s -> {
- rerunSnippet(s);
- return true;
- }).orElse(false);
+ /**
+ * Handle snippet reevaluation commands: {@code /<id>}. These commands are a
+ * sequence of ids and id ranges (names are permitted, though not in the
+ * first position. Support for names is purposely not documented).
+ *
+ * @param rawargs the whole command including arguments
+ */
+ private void rerunHistoryEntriesById(String rawargs) {
+ ArgTokenizer at = new ArgTokenizer("/<id>", rawargs.trim().substring(1));
+ at.allowedOptions();
+ Stream<Snippet> stream = argsOptionsToSnippets(state::snippets, sn -> true, at);
+ if (stream != null) {
+ // successfully parsed, rerun snippets
+ stream.forEach(sn -> rerunSnippet(sn));
+ }
}
private void rerunSnippet(Snippet snippet) {
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Mon May 22 09:34:38 2017 -0700
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Thu May 25 09:15:55 2017 -0700
@@ -50,7 +50,7 @@
jshell.err.startup.unexpected.exception = Unexpected exception reading start-up: {0}
jshell.err.unexpected.exception = Unexpected exception: {0}
-jshell.err.no.such.command.or.snippet.id = No such command or snippet id: {0}
+jshell.err.invalid.command = Invalid command: {0}
jshell.err.command.ambiguous = Command: ''{0}'' is ambiguous: {1}
jshell.msg.set.restore = Setting new options and restoring state.
jshell.msg.set.editor.set = Editor set to: {0}
@@ -105,10 +105,13 @@
Subjects:\n\
\n
+jshell.err.no.snippet.with.id = No snippet with id: {0}
+jshell.err.end.snippet.range.less.than.start = End of snippet range less than start: {0} - {1}
+jshell.err.range.requires.id = Snippet ranges require snippet ids: {0}
+
jshell.err.drop.arg =\
In the /drop argument, please specify an import, variable, method, or class to drop.\n\
Specify by id or name. Use /list to see ids. Use /reset to reset all state.
-jshell.err.drop.ambiguous = The argument references more than one import, variable, method, or class.
jshell.err.failed = Failed.
jshell.msg.native.method = Native Method
jshell.msg.unknown.source = Unknown Source
@@ -225,7 +228,11 @@
/list <name>\n\t\
List snippets with the specified name (preference for active snippets)\n\n\
/list <id>\n\t\
- List the snippet with the specified snippet id
+ List the snippet with the specified snippet id\n\n\
+/list <id> <id>...\n\t\
+ List the snippets with the specified snippet ids\n\n\
+/list <id>-<id>\n\t\
+ List the snippets within the range of snippet ids
help.edit.summary = edit a source entry referenced by name or id
help.edit.args = <name or id>
@@ -238,6 +245,10 @@
Edit the snippet or snippets with the specified name (preference for active snippets)\n\n\
/edit <id>\n\t\
Edit the snippet with the specified snippet id\n\n\
+/edit <id> <id>...\n\t\
+ Edit the snippets with the specified snippet ids\n\n\
+/edit <id>-<id>\n\t\
+ Edit the snippets within the range of snippet ids\n\n\
/edit\n\t\
Edit the currently active snippets of code that you typed or read with /open
@@ -249,7 +260,11 @@
/drop <name>\n\t\
Drop the snippet with the specified name\n\n\
/drop <id>\n\t\
- Drop the snippet with the specified snippet id
+ Drop the snippet with the specified snippet id\n\n\
+/drop <id> <id>...\n\t\
+ Drop the snippets with the specified snippet ids\n\n\
+/drop <id>-<id>\n\t\
+ Drop the snippets within the range of snippet ids
help.save.summary = Save snippet source to a file.
help.save.args = [-all|-history|-start] <file>
@@ -264,7 +279,13 @@
/save -history <file>\n\t\
Save the sequential history of all commands and snippets entered since jshell was launched.\n\n\
/save -start <file>\n\t\
- Save the current start-up definitions to the file.
+ Save the current start-up definitions to the file.\n\n\
+/save <id> <file>\n\t\
+ Save the snippet with the specified snippet id\n\n\
+/save <id> <id>... <file>\n\t\
+ Save the snippets with the specified snippet ids\n\n\
+/save <id>-<id> <file>\n\t\
+ Save the snippets within the range of snippet ids
help.open.summary = open a file as source input
help.open.args = <file>
@@ -285,6 +306,10 @@
List jshell variables with the specified name (preference for active variables)\n\n\
/vars <id>\n\t\
List the jshell variable with the specified snippet id\n\n\
+/vars <id> <id>... <file>\n\t\
+ List the jshell variables with the specified snippet ids\n\n\
+/vars <id>-<id> <file>\n\t\
+ List the jshell variables within the range of snippet ids\n\n\
/vars -start\n\t\
List the automatically added start-up jshell variables\n\n\
/vars -all\n\t\
@@ -301,6 +326,10 @@
List jshell methods with the specified name (preference for active methods)\n\n\
/methods <id>\n\t\
List the jshell method with the specified snippet id\n\n\
+/methods <id> <id>... <file>\n\t\
+ List jshell methods with the specified snippet ids\n\n\
+/methods <id>-<id> <file>\n\t\
+ List jshell methods within the range of snippet ids\n\n\
/methods -start\n\t\
List the automatically added start-up jshell methods\n\n\
/methods -all\n\t\
@@ -317,6 +346,10 @@
List jshell types with the specified name (preference for active types)\n\n\
/types <id>\n\t\
List the jshell type with the specified snippet id\n\n\
+/types <id> <id>... <file>\n\t\
+ List jshell types with the specified snippet ids\n\n\
+/types <id>-<id> <file>\n\t\
+ List jshell types within the range of snippet ids\n\n\
/types -start\n\t\
List the automatically added start-up jshell types\n\n\
/types -all\n\t\
@@ -461,17 +494,24 @@
/? <subject>\n\t\
Display information about the specified help subject. Example: /? intro
-help.bang.summary = re-run last snippet
+help.bang.summary = rerun last snippet -- see /help rerun
help.bang.args =
help.bang =\
Reevaluate the most recently entered snippet.
-help.id.summary = re-run snippet by id
+help.id.summary = rerun snippets by id or id range -- see /help rerun
help.id.args =
help.id =\
-Reevaluate the snippet specified by the id.
+/<id> <id> <id>\n\
+\n\
+/<id>-<id>\n\
+\n\
+Reevaluate the snippets specified by the id or id range.\n\
+An id range is represented as a two ids separated by a hyphen, e.g.: 3-17\n\
+Start-up and error snippets maybe used, e.g.: s3-s9 or e1-e4\n\
+Any number of ids or id ranges may be used, e.g.: /3-7 s4 14-16 e2
-help.previous.summary = re-run n-th previous snippet
+help.previous.summary = rerun n-th previous snippet -- see /help rerun
help.previous.args =
help.previous =\
Reevaluate the n-th most recently entered snippet.
@@ -509,7 +549,7 @@
then release and press "i", and jshell will propose possible imports\n\t\t\
which will resolve the identifier based on the content of the specified classpath.
-help.context.summary = the evaluation context options for /env /reload and /reset
+help.context.summary = a description of the evaluation context options for /env /reload and /reset
help.context =\
These options configure the evaluation context, they can be specified when\n\
jshell is started: on the command-line, or restarted with the commands /env,\n\
@@ -540,6 +580,38 @@
On the command-line these options must have two dashes, e.g.: --module-path\n\
On jshell commands they can have one or two dashes, e.g.: -module-path\n\
+help.rerun.summary = a description of ways to re-evaluate previously entered snippets
+help.rerun =\
+There are four ways to re-evaluate previously entered snippets.\n\
+The last snippet can be re-evaluated using: /!\n\
+The n-th previous snippet can be re-evaluated by slash-minus and the digits of n, e.g.: /-4\n\
+For example:\n\
+\n\
+ \tjshell> 2 + 2\n\
+ \t$1 ==> 4\n\
+\n\
+ \tjshell> /!\n\
+ \t2 + 2\n\
+ \t$2 ==> 4\n\
+\n\
+ \tjshell> int z\n\
+ \tz ==> 0\n\
+\n\
+ \tjshell> /-1\n\
+ \tint z;\n\
+ \tz ==> 0\n\
+\n\
+ \tjshell> /-4\n\
+ \t2 + 2\n\
+ \t$5 ==> 4\n\
+\n\
+The snippets to re-evaluate may be specified by snippet id or id range.\n\
+An id range is represented as a two ids separated by a hyphen, e.g.: 3-17\n\
+Start-up and error snippets maybe used, e.g.: s3-s9 or e1-e4\n\
+Any number of ids or id ranges may be used, e.g.: /3-7 s4 14-16 e2\n\
+\n\
+Finally, you can search backwards through history by entering ctrl-R followed by the string to search for.
+
help.set._retain = \
The '-retain' option saves a setting so that it is used in future sessions.\n\
The -retain option can be used on the following forms of /set:\n\n\t\
--- a/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/test/jdk/javadoc/doclet/testModules/TestModules.java Thu May 25 09:15:55 2017 -0700
@@ -25,6 +25,7 @@
* @test
* @bug 8154119 8154262 8156077 8157987 8154261 8154817 8135291 8155995 8162363
* 8168766 8168688 8162674 8160196 8175799 8174974 8176778 8177562 8175218 8175823 8166306
+ * 8178043
* @summary Test modules support in javadoc.
* @author bpatel
* @library ../lib
@@ -326,6 +327,54 @@
checkAllModulesLink(false);
}
+ /**
+ * Test -group option for modules. The overview-summary.html page should group the modules accordingly.
+ */
+ @Test
+ void testGroupOption() {
+ javadoc("-d", "out-group", "--show-module-contents=all",
+ "-tag", "regular:a:Regular Tag:",
+ "-tag", "moduletag:s:Module Tag:",
+ "--module-source-path", testSrc,
+ "-group", "Module Group A", "moduleA*",
+ "-group", "Module Group B & C", "moduleB*:moduleC*",
+ "-group", "Java SE Modules", "java*",
+ "--module", "moduleA,moduleB,moduleC,moduletags",
+ "moduleA/concealedpkgmdlA", "testpkgmdlA", "testpkg2mdlB", "testpkgmdlB", "testpkgmdlC",
+ "testpkgmdltags");
+ checkExit(Exit.OK);
+ checkGroupOption();
+ }
+
+ /**
+ * Test -group option for unnamed modules. The overview-summary.html page should group the packages accordingly.
+ */
+ @Test
+ void testUnnamedModuleGroupOption() {
+ javadoc("-d", "out-groupnomodule", "-use",
+ "-overview", testSrc("overview.html"),
+ "-sourcepath", testSrc,
+ "-group", "Package Group 0", "testpkgnomodule",
+ "-group", "Package Group 1", "testpkgnomodule1",
+ "testpkgnomodule", "testpkgnomodule1");
+ checkExit(Exit.OK);
+ checkUnnamedModuleGroupOption();
+ }
+
+ /**
+ * Test -group option for a single module.
+ */
+ @Test
+ void testGroupOptionSingleModule() {
+ javadoc("-d", "out-groupsinglemodule", "-use",
+ "--module-source-path", testSrc,
+ "-group", "Module Group B", "moduleB*",
+ "--module", "moduleB",
+ "testpkg2mdlB", "testpkgmdlB");
+ checkExit(Exit.OK);
+ //checkOverviewSummaryPackages();
+ }
+
void checkDescription(boolean found) {
checkOutput("moduleA-summary.html", found,
"<!-- ============ MODULE DESCRIPTION =========== -->\n"
@@ -346,8 +395,10 @@
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
- + "<div class=\"contentContainer\">\n"
- + "<table class=\"overviewSummary\" summary=\"Module Summary table, listing modules, and an explanation\">\n"
+ + "<div class=\"contentContainer\"><a name=\"Modules\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ + "<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>");
checkOutput("overview-summary.html", false,
"</table>\n"
@@ -355,8 +406,10 @@
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
- + "<div class=\"contentContainer\">\n"
- + "<table class=\"overviewSummary\" summary=\"Module Summary table, listing modules, and an explanation\">\n"
+ + "<div class=\"contentContainer\"><a name=\"Modules\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ + "<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>");
}
@@ -405,7 +458,9 @@
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
- + "<div class=\"contentContainer\">\n"
+ + "<div class=\"contentContainer\"><a id=\"Modules\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ "<table class=\"overviewSummary\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>");
checkOutput("overview-summary.html", false,
@@ -416,7 +471,9 @@
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
- + "<div class=\"contentContainer\">\n"
+ + "<div class=\"contentContainer\"><a id=\"Modules\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ "<table class=\"overviewSummary\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>");
}
@@ -495,7 +552,7 @@
void checkOverviewSummaryModules() {
checkOutput("overview-summary.html", true,
- "<table class=\"overviewSummary\" summary=\"Module Summary table, listing modules, and an explanation\">\n"
+ "<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<tr>\n"
+ "<th class=\"colFirst\" scope=\"col\">Module</th>\n"
@@ -512,7 +569,7 @@
void checkOverviewSummaryPackages() {
checkOutput("overview-summary.html", false,
- "<table class=\"overviewSummary\" summary=\"Module Summary table, listing modules, and an explanation\">\n"
+ "<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>\n"
+ "<tr>\n"
+ "<th class=\"colFirst\" scope=\"col\">Module</th>\n"
@@ -523,7 +580,9 @@
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
- + "<div class=\"contentContainer\">\n"
+ + "<div class=\"contentContainer\"><a name=\"Packages\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Packages table, listing packages, and an explanation\">\n"
+ "<caption><span>Packages</span><span class=\"tabEnd\"> </span></caption>");
checkOutput("overview-summary.html", true,
@@ -537,7 +596,9 @@
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
- + "<div class=\"contentContainer\">\n"
+ + "<div class=\"contentContainer\"><a name=\"Packages\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ "<table class=\"overviewSummary\" summary=\"Packages table, listing packages, and an explanation\">\n"
+ "<caption><span>Packages</span><span class=\"tabEnd\"> </span></caption>");
}
@@ -574,7 +635,9 @@
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
- + "<div class=\"contentContainer\">\n"
+ + "<div class=\"contentContainer\"><a id=\"Packages\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ "<table class=\"overviewSummary\">\n"
+ "<caption><span>Packages</span><span class=\"tabEnd\"> </span></caption>");
checkOutput("overview-summary.html", true,
@@ -591,7 +654,9 @@
+ "<div class=\"contentContainer\">\n"
+ "<div class=\"block\">The overview summary page header.</div>\n"
+ "</div>\n"
- + "<div class=\"contentContainer\">\n"
+ + "<div class=\"contentContainer\"><a id=\"Packages\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ "<table class=\"overviewSummary\">\n"
+ "<caption><span>Packages</span><span class=\"tabEnd\"> </span></caption>");
}
@@ -974,4 +1039,54 @@
+ "</a>",
"<caption><span>Concealed</span><span class=\"tabEnd\"> </span></caption>");
}
+
+ void checkGroupOption() {
+ checkOutput("overview-summary.html", true,
+ "<div class=\"contentContainer\"><a name=\"ModuleGroupA\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ + "<table class=\"overviewSummary\" summary=\"Module Group A table, listing modules, and an explanation\">\n"
+ + "<caption><span>Module Group A</span><span class=\"tabEnd\"> </span></caption>",
+ "<div class=\"contentContainer\"><a name=\"ModuleGroupB&C\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ + "<table class=\"overviewSummary\" summary=\"Module Group B & C table, listing modules, and an explanation\">\n"
+ + "<caption><span>Module Group B & C</span><span class=\"tabEnd\"> </span></caption>",
+ "<div class=\"contentContainer\"><a name=\"OtherModules\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ + "<table class=\"overviewSummary\" summary=\"Other Modules table, listing modules, and an explanation\">\n"
+ + "<caption><span>Other Modules</span><span class=\"tabEnd\"> </span></caption>");
+ checkOutput("overview-summary.html", false,
+ "<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ + "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>",
+ "Java SE Modules");
+ }
+
+ void checkUnnamedModuleGroupOption() {
+ checkOutput("overview-summary.html", true,
+ "<div class=\"contentContainer\"><a name=\"PackageGroup0\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ + "<table class=\"overviewSummary\" summary=\"Package Group 0 table, listing packages, and an explanation\">\n"
+ + "<caption><span>Package Group 0</span><span class=\"tabEnd\"> </span></caption>\n"
+ + "<tr>",
+ "<div class=\"contentContainer\"><a name=\"PackageGroup1\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ + "<table class=\"overviewSummary\" summary=\"Package Group 1 table, listing packages, and an explanation\">\n"
+ + "<caption><span>Package Group 1</span><span class=\"tabEnd\"> </span></caption>");
+ }
+
+ void checkGroupOptionSingleModule() {
+ checkOutput("overview-summary.html", true,
+ "<div class=\"contentContainer\"><a name=\"ModuleGroupB\">\n"
+ + "<!-- -->\n"
+ + "</a>\n"
+ + "<table class=\"overviewSummary\" summary=\"Module Group B table, listing modules, and an explanation\">\n"
+ + "<caption><span>Module Group B</span><span class=\"tabEnd\"> </span></caption>");
+ checkOutput("overview-summary.html", false,
+ "<table class=\"overviewSummary\" summary=\"Modules table, listing modules, and an explanation\">\n"
+ + "<caption><span>Modules</span><span class=\"tabEnd\"> </span></caption>");
+ }
}
--- a/langtools/test/jdk/jshell/CommandCompletionTest.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/test/jdk/jshell/CommandCompletionTest.java Thu May 25 09:15:55 2017 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8144095 8164825 8169818 8153402 8165405 8177079 8178013
+ * @bug 8144095 8164825 8169818 8153402 8165405 8177079 8178013 8167554
* @summary Test Command Completion
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.main
@@ -162,13 +162,13 @@
"/edit ", "/env ", "/exit ",
"/help ", "/history ", "/imports ",
"/list ", "/methods ", "/open ", "/reload ", "/reset ",
- "/save ", "/set ", "/types ", "/vars ", "context ", "intro ", "shortcuts "),
+ "/save ", "/set ", "/types ", "/vars ", "context ", "intro ", "rerun ", "shortcuts "),
a -> assertCompletion(a, "/? |", false,
"/! ", "/-<n> ", "/<id> ", "/? ", "/drop ",
"/edit ", "/env ", "/exit ",
"/help ", "/history ", "/imports ",
"/list ", "/methods ", "/open ", "/reload ", "/reset ",
- "/save ", "/set ", "/types ", "/vars ", "context ", "intro ", "shortcuts "),
+ "/save ", "/set ", "/types ", "/vars ", "context ", "intro ", "rerun ", "shortcuts "),
a -> assertCompletion(a, "/help /s|", false,
"/save ", "/set "),
a -> assertCompletion(a, "/help /set |", false,
--- a/langtools/test/jdk/jshell/EditorTestBase.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/test/jdk/jshell/EditorTestBase.java Thu May 25 09:15:55 2017 -0700
@@ -73,7 +73,7 @@
for (String edit : new String[] {"/ed", "/edit"}) {
test(new String[]{"--no-startup"},
a -> assertCommandOutputStartsWith(a, edit + " 1",
- "| No such snippet: 1"),
+ "| No snippet with id: 1"),
a -> assertCommandOutputStartsWith(a, edit + " unknown",
"| No such snippet: unknown")
);
--- a/langtools/test/jdk/jshell/MergedTabShiftTabCommandTest.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/test/jdk/jshell/MergedTabShiftTabCommandTest.java Thu May 25 09:15:55 2017 -0700
@@ -66,17 +66,17 @@
Pattern.quote(getResource("jshell.console.see.next.command.doc")) + "\n" +
"\r\u0005/");
- inputSink.write("lis\011");
- waitOutput(out, "list $");
+ inputSink.write("ed\011");
+ waitOutput(out, "edit $");
inputSink.write("\011");
waitOutput(out, ".*-all.*" +
"\n\n" + Pattern.quote(getResource("jshell.console.see.synopsis")) + "\n\r\u0005/");
inputSink.write("\011");
- waitOutput(out, Pattern.quote(getResource("help.list.summary")) + "\n\n" +
- Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n\r\u0005/list ");
+ waitOutput(out, Pattern.quote(getResource("help.edit.summary")) + "\n\n" +
+ Pattern.quote(getResource("jshell.console.see.full.documentation")) + "\n\r\u0005/edit ");
inputSink.write("\011");
- waitOutput(out, Pattern.quote(getResource("help.list").replaceAll("\t", " ")));
+ waitOutput(out, Pattern.quote(getResource("help.edit").replaceAll("\t", " ")));
inputSink.write("\u0003/env \011");
waitOutput(out, "\u0005/env -\n" +
--- a/langtools/test/jdk/jshell/ToolBasicTest.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/test/jdk/jshell/ToolBasicTest.java Thu May 25 09:15:55 2017 -0700
@@ -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
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347 8154714 8166649 8167643 8170162 8172102 8165405 8174796 8174797 8175304
+ * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347 8154714 8166649 8167643 8170162 8172102 8165405 8174796 8174797 8175304 8167554 8180508
* @summary Tests for Basic tests for REPL tool
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.main
@@ -190,8 +190,8 @@
public void testRerun() {
test(false, new String[] {"--no-startup"},
- (a) -> assertCommand(a, "/0", "| No such command or snippet id: /0\n| Type /help for help."),
- (a) -> assertCommand(a, "/5", "| No such command or snippet id: /5\n| Type /help for help.")
+ (a) -> assertCommand(a, "/0", "| No snippet with id: 0"),
+ (a) -> assertCommand(a, "/5", "| No snippet with id: 5")
);
String[] codes = new String[] {
"int a = 0;", // var
@@ -252,9 +252,9 @@
);
test(false, new String[] {"--no-startup"},
- (a) -> assertCommand(a, "/s1", "| No such command or snippet id: /s1\n| Type /help for help."),
- (a) -> assertCommand(a, "/1", "| No such command or snippet id: /1\n| Type /help for help."),
- (a) -> assertCommand(a, "/e1", "| No such command or snippet id: /e1\n| Type /help for help.")
+ (a) -> assertCommand(a, "/s1", "| No snippet with id: s1"),
+ (a) -> assertCommand(a, "/1", "| No snippet with id: 1"),
+ (a) -> assertCommand(a, "/e1", "| No snippet with id: e1")
);
}
@@ -481,17 +481,19 @@
public void testSave() throws IOException {
Compiler compiler = new Compiler();
Path path = compiler.getPath("testSave.repl");
- List<String> list = Arrays.asList(
- "int a;",
- "class A { public String toString() { return \"A\"; } }"
- );
- test(
- (a) -> assertVariable(a, "int", "a"),
- (a) -> assertCommand(a, "()", null, null, null, "", ""),
- (a) -> assertClass(a, "class A { public String toString() { return \"A\"; } }", "class", "A"),
- (a) -> assertCommand(a, "/save " + path.toString(), "")
- );
- assertEquals(Files.readAllLines(path), list);
+ {
+ List<String> list = Arrays.asList(
+ "int a;",
+ "class A { public String toString() { return \"A\"; } }"
+ );
+ test(
+ (a) -> assertVariable(a, "int", "a"),
+ (a) -> assertCommand(a, "()", null, null, null, "", ""),
+ (a) -> assertClass(a, "class A { public String toString() { return \"A\"; } }", "class", "A"),
+ (a) -> assertCommand(a, "/save " + path.toString(), "")
+ );
+ assertEquals(Files.readAllLines(path), list);
+ }
{
List<String> output = new ArrayList<>();
test(
@@ -499,28 +501,47 @@
(a) -> assertCommand(a, "()", null, null, null, "", ""),
(a) -> assertClass(a, "class A { public String toString() { return \"A\"; } }", "class", "A"),
(a) -> assertCommandCheckOutput(a, "/list -all", (out) ->
- output.addAll(Stream.of(out.split("\n"))
- .filter(str -> !str.isEmpty())
- .map(str -> str.substring(str.indexOf(':') + 2))
- .filter(str -> !str.startsWith("/"))
- .collect(Collectors.toList()))),
+ output.addAll(Stream.of(out.split("\n"))
+ .filter(str -> !str.isEmpty())
+ .map(str -> str.substring(str.indexOf(':') + 2))
+ .filter(str -> !str.startsWith("/"))
+ .collect(Collectors.toList()))),
(a) -> assertCommand(a, "/save -all " + path.toString(), "")
);
assertEquals(Files.readAllLines(path), output);
}
- List<String> output = new ArrayList<>();
- test(
- (a) -> assertVariable(a, "int", "a"),
- (a) -> assertCommand(a, "()", null, null, null, "", ""),
- (a) -> assertClass(a, "class A { public String toString() { return \"A\"; } }", "class", "A"),
- (a) -> assertCommandCheckOutput(a, "/history", (out) ->
- output.addAll(Stream.of(out.split("\n"))
- .filter(str -> !str.isEmpty())
- .collect(Collectors.toList()))),
- (a) -> assertCommand(a, "/save -history " + path.toString(), "")
- );
- output.add("/save -history " + path.toString());
- assertEquals(Files.readAllLines(path), output);
+ {
+ List<String> output = new ArrayList<>();
+ test(
+ (a) -> assertCommand(a, "int a;", null),
+ (a) -> assertCommand(a, "int b;", null),
+ (a) -> assertCommand(a, "int c;", null),
+ (a) -> assertClass(a, "class A { public String toString() { return \"A\"; } }", "class", "A"),
+ (a) -> assertCommandCheckOutput(a, "/list b c a A", (out) ->
+ output.addAll(Stream.of(out.split("\n"))
+ .filter(str -> !str.isEmpty())
+ .map(str -> str.substring(str.indexOf(':') + 2))
+ .filter(str -> !str.startsWith("/"))
+ .collect(Collectors.toList()))),
+ (a) -> assertCommand(a, "/save 2-3 1 4 " + path.toString(), "")
+ );
+ assertEquals(Files.readAllLines(path), output);
+ }
+ {
+ List<String> output = new ArrayList<>();
+ test(
+ (a) -> assertVariable(a, "int", "a"),
+ (a) -> assertCommand(a, "()", null, null, null, "", ""),
+ (a) -> assertClass(a, "class A { public String toString() { return \"A\"; } }", "class", "A"),
+ (a) -> assertCommandCheckOutput(a, "/history", (out) ->
+ output.addAll(Stream.of(out.split("\n"))
+ .filter(str -> !str.isEmpty())
+ .collect(Collectors.toList()))),
+ (a) -> assertCommand(a, "/save -history " + path.toString(), "")
+ );
+ output.add("/save -history " + path.toString());
+ assertEquals(Files.readAllLines(path), output);
+ }
}
public void testStartRetain() {
@@ -652,6 +673,64 @@
);
}
+ public void testRerunIdRange() {
+ Compiler compiler = new Compiler();
+ Path startup = compiler.getPath("rangeStartup");
+ String[] startupSources = new String[] {
+ "boolean go = false",
+ "void println(String s) { if (go) System.out.println(s); }",
+ "void println(int i) { if (go) System.out.println(i); }",
+ "println(\"s4\")",
+ "println(\"s5\")",
+ "println(\"s6\")"
+ };
+ String[] sources = new String[] {
+ "frog",
+ "go = true",
+ "println(2)",
+ "println(3)",
+ "println(4)",
+ "querty"
+ };
+ compiler.writeToFile(startup, startupSources);
+ test(false, new String[]{"--startup", startup.toString()},
+ a -> assertCommandOutputStartsWith(a, sources[0], "| Error:"),
+ a -> assertCommand(a, sources[1], "go ==> true", "", null, "", ""),
+ a -> assertCommand(a, sources[2], "", "", null, "2\n", ""),
+ a -> assertCommand(a, sources[3], "", "", null, "3\n", ""),
+ a -> assertCommand(a, sources[4], "", "", null, "4\n", ""),
+ a -> assertCommandOutputStartsWith(a, sources[5], "| Error:"),
+ a -> assertCommand(a, "/3", "println(3)", "", null, "3\n", ""),
+ a -> assertCommand(a, "/s4", "println(\"s4\")", "", null, "s4\n", ""),
+ a -> assertCommandOutputStartsWith(a, "/e1", "frog\n| Error:"),
+ a -> assertCommand(a, "/2-4",
+ "println(2)\nprintln(3)\nprintln(4)",
+ "", null, "2\n3\n4\n", ""),
+ a -> assertCommand(a, "/s4-s6",
+ startupSources[3] + "\n" +startupSources[4] + "\n" +startupSources[5],
+ "", null, "s4\ns5\ns6\n", ""),
+ a -> assertCommand(a, "/s4-4", null,
+ "", null, "s4\ns5\ns6\n2\n3\n4\n", ""),
+ a -> assertCommandCheckOutput(a, "/e1-e2",
+ s -> {
+ assertTrue(s.trim().startsWith("frog\n| Error:"),
+ "Output: \'" + s + "' does not start with: " + "| Error:");
+ assertTrue(s.trim().lastIndexOf("| Error:") > 10,
+ "Output: \'" + s + "' does not have second: " + "| Error:");
+ }),
+ a -> assertCommand(a, "/4 s4 2",
+ "println(4)\nprintln(\"s4\")\nprintln(2)",
+ "", null, "4\ns4\n2\n", ""),
+ a -> assertCommand(a, "/s5 2-4 3",
+ "println(\"s5\")\nprintln(2)\nprintln(3)\nprintln(4)\nprintln(3)",
+ "", null, "s5\n2\n3\n4\n3\n", ""),
+ a -> assertCommand(a, "/2 ff", "| No such snippet: ff"),
+ a -> assertCommand(a, "/4-2", "| End of snippet range less than start: 4 - 2"),
+ a -> assertCommand(a, "/s5-s3", "| End of snippet range less than start: s5 - s3"),
+ a -> assertCommand(a, "/4-s5", "| End of snippet range less than start: 4 - s5")
+ );
+ }
+
@Test(enabled = false) // TODO 8158197
public void testHeadlessEditPad() {
String prevHeadless = System.getProperty("java.awt.headless");
--- a/langtools/test/jdk/jshell/ToolLocaleMessageTest.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/test/jdk/jshell/ToolLocaleMessageTest.java Thu May 25 09:15:55 2017 -0700
@@ -117,7 +117,6 @@
(a) -> assertCommandFail(a, "/drop rats"),
(a) -> assertCommandOK(a, "void dup() {}"),
(a) -> assertCommandOK(a, "int dup"),
- (a) -> assertCommandFail(a, "/drop dup"),
(a) -> assertCommandFail(a, "/edit zebra", "zebra"),
(a) -> assertCommandFail(a, "/list zebra", "zebra", "No such snippet: zebra"),
(a) -> assertCommandFail(a, "/open", "/open"),
--- a/langtools/test/jdk/jshell/ToolSimpleTest.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/test/jdk/jshell/ToolSimpleTest.java Thu May 25 09:15:55 2017 -0700
@@ -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
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8153716 8143955 8151754 8150382 8153920 8156910 8131024 8160089 8153897 8167128 8154513 8170015 8170368 8172102 8172103 8165405 8173073 8173848 8174041 8173916 8174028 8174262 8174797 8177079
+ * @bug 8153716 8143955 8151754 8150382 8153920 8156910 8131024 8160089 8153897 8167128 8154513 8170015 8170368 8172102 8172103 8165405 8173073 8173848 8174041 8173916 8174028 8174262 8174797 8177079 8180508
* @summary Simple jshell tool tests
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.main
@@ -37,6 +37,7 @@
import java.util.List;
import java.util.Locale;
import java.util.function.Consumer;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -202,7 +203,7 @@
@Test
public void testUnknownCommand() {
test((a) -> assertCommand(a, "/unknown",
- "| No such command or snippet id: /unknown\n" +
+ "| Invalid command: /unknown\n" +
"| Type /help for help."));
}
@@ -275,9 +276,25 @@
}
@Test
+ public void testDropRange() {
+ test(false, new String[]{"--no-startup"},
+ a -> assertVariable(a, "int", "a"),
+ a -> assertMethod(a, "int b() { return 0; }", "()int", "b"),
+ a -> assertClass(a, "class A {}", "class", "A"),
+ a -> assertImport(a, "import java.util.stream.*;", "", "java.util.stream.*"),
+ a -> assertCommand(a, "for (int i = 0; i < 10; ++i) {}", ""),
+ a -> assertCommand(a, "/drop 3-5 b 1",
+ "| dropped class A\n" +
+ "| dropped method b()\n" +
+ "| dropped variable a\n"),
+ a -> assertCommand(a, "/list", "")
+ );
+ }
+
+ @Test
public void testDropNegative() {
test(false, new String[]{"--no-startup"},
- a -> assertCommandOutputStartsWith(a, "/drop 0", "| No such snippet: 0"),
+ a -> assertCommandOutputStartsWith(a, "/drop 0", "| No snippet with id: 0"),
a -> assertCommandOutputStartsWith(a, "/drop a", "| No such snippet: a"),
a -> assertCommandCheckOutput(a, "/drop",
assertStartsWith("| In the /drop argument, please specify an import, variable, method, or class to drop.")),
@@ -292,27 +309,23 @@
@Test
public void testAmbiguousDrop() {
- Consumer<String> check = s -> {
- assertTrue(s.startsWith("| The argument references more than one import, variable, method, or class"), s);
- int lines = s.split("\n").length;
- assertEquals(lines, 5, "Expected 3 ambiguous keys, but found: " + (lines - 2) + "\n" + s);
- };
test(
a -> assertVariable(a, "int", "a"),
a -> assertMethod(a, "int a() { return 0; }", "()int", "a"),
a -> assertClass(a, "class a {}", "class", "a"),
- a -> assertCommandCheckOutput(a, "/drop a", check),
- a -> assertCommandCheckOutput(a, "/vars", assertVariables()),
- a -> assertCommandCheckOutput(a, "/methods", assertMethods()),
- a -> assertCommandCheckOutput(a, "/types", assertClasses()),
- a -> assertCommandCheckOutput(a, "/imports", assertImports())
+ a -> assertCommand(a, "/drop a",
+ "| dropped variable a\n" +
+ "| dropped method a()\n" +
+ "| dropped class a")
);
test(
a -> assertMethod(a, "int a() { return 0; }", "()int", "a"),
a -> assertMethod(a, "double a(int a) { return 0; }", "(int)double", "a"),
a -> assertMethod(a, "double a(double a) { return 0; }", "(double)double", "a"),
- a -> assertCommandCheckOutput(a, "/drop a", check),
- a -> assertCommandCheckOutput(a, "/methods", assertMethods())
+ a -> assertCommand(a, "/drop a",
+ "| dropped method a()\n" +
+ "| dropped method a(int)\n" +
+ "| dropped method a(double)\n")
);
}
@@ -402,12 +415,14 @@
String arg = "qqqq";
List<String> startVarList = new ArrayList<>(START_UP);
startVarList.add("int aardvark");
+ startVarList.add("int weevil");
test(
a -> assertCommandCheckOutput(a, "/list -all",
s -> checkLineToList(s, START_UP)),
a -> assertCommandOutputStartsWith(a, "/list " + arg,
"| No such snippet: " + arg),
a -> assertVariable(a, "int", "aardvark"),
+ a -> assertVariable(a, "int", "weevil"),
a -> assertCommandOutputContains(a, "/list aardvark", "aardvark"),
a -> assertCommandCheckOutput(a, "/list -start",
s -> checkLineToList(s, START_UP)),
@@ -415,6 +430,11 @@
s -> checkLineToList(s, startVarList)),
a -> assertCommandOutputStartsWith(a, "/list s3",
"s3 : import"),
+ a -> assertCommandCheckOutput(a, "/list 1-2 s3",
+ s -> {
+ assertTrue(Pattern.matches(".*aardvark.*\\R.*weevil.*\\R.*s3.*import.*", s.trim()),
+ "No match: " + s);
+ }),
a -> assertCommandOutputStartsWith(a, "/list " + arg,
"| No such snippet: " + arg)
);
@@ -439,6 +459,8 @@
s -> checkLineToList(s, startVarList)),
a -> assertCommandOutputStartsWith(a, "/vars -all",
"| int aardvark = 0\n| int a = "),
+ a -> assertCommandOutputStartsWith(a, "/vars 1-4",
+ "| int aardvark = 0\n| int a = "),
a -> assertCommandOutputStartsWith(a, "/vars f",
"| This command does not accept the snippet 'f'"),
a -> assertCommand(a, "/var " + arg,
--- a/langtools/test/tools/javac/T7008643/InlinedFinallyConfuseDebuggersTest.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/test/tools/javac/T7008643/InlinedFinallyConfuseDebuggersTest.java Thu May 25 09:15:55 2017 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2016, 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
@@ -72,6 +72,7 @@
{9, 21}, //System.out.println("finally");
{10, 29},
{9, 32}, //System.out.println("finally");
+ {10, 41}, //}
{11, 43},
};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T8180660/MissingLNTEntryForFinalizerTest.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,180 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8180141
+ * @summary Missing entry in LineNumberTable for break statement that jumps out of try-finally
+ * @modules jdk.jdeps/com.sun.tools.classfile
+ * jdk.compiler/com.sun.tools.javac.code
+ * jdk.compiler/com.sun.tools.javac.comp
+ * jdk.compiler/com.sun.tools.javac.file
+ * jdk.compiler/com.sun.tools.javac.main
+ * jdk.compiler/com.sun.tools.javac.tree
+ * jdk.compiler/com.sun.tools.javac.util
+ * @compile -g MissingLNTEntryForFinalizerTest.java
+ * @run main MissingLNTEntryForFinalizerTest
+ */
+
+import java.io.File;
+import java.net.URI;
+
+import javax.tools.JavaFileObject;
+import javax.tools.SimpleJavaFileObject;
+
+import com.sun.tools.classfile.*;
+import com.sun.tools.javac.comp.Attr;
+import com.sun.tools.javac.comp.AttrContext;
+import com.sun.tools.javac.comp.Env;
+import com.sun.tools.javac.comp.Modules;
+import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.main.JavaCompiler;
+import com.sun.tools.javac.tree.JCTree;
+import com.sun.tools.javac.tree.JCTree.*;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.List;
+
+import static com.sun.tools.javac.util.List.of;
+import static com.sun.tools.javac.tree.JCTree.Tag.*;
+
+public class MissingLNTEntryForFinalizerTest {
+ protected ReusableJavaCompiler tool;
+ Context context;
+
+ MissingLNTEntryForFinalizerTest() {
+ context = new Context();
+ JavacFileManager.preRegister(context);
+ MyAttr.preRegister(context);
+ tool = new ReusableJavaCompiler(context);
+ }
+
+ public static void main(String... args) throws Throwable {
+ new MissingLNTEntryForFinalizerTest().test();
+ }
+
+ void test() throws Throwable {
+ JavaSource source = new JavaSource("1");
+ tool.clear();
+ List<JavaFileObject> inputs = of(source);
+ try {
+ tool.compile(inputs);
+ } catch (Throwable ex) {
+ throw new AssertionError(ex);
+ }
+ File testClasses = new File(".");
+ File file = new File(testClasses, "Test1.class");
+ ClassFile classFile = ClassFile.read(file);
+ for (Method m : classFile.methods) {
+ if (classFile.constant_pool.getUTF8Value(m.name_index).equals("foo")) {
+ Code_attribute code = (Code_attribute)m.attributes.get(Attribute.Code);
+ LineNumberTable_attribute lnt = (LineNumberTable_attribute)code.attributes.get(Attribute.LineNumberTable);
+ checkLNT(lnt, MyAttr.lineNumber);
+ }
+ }
+ }
+
+ void checkLNT(LineNumberTable_attribute lnt, int lineToCheckFor) {
+ for (LineNumberTable_attribute.Entry e: lnt.line_number_table) {
+ if (e.line_number == lineToCheckFor) {
+ return;
+ }
+ }
+ throw new AssertionError("seek line number not found in the LNT for method foo()");
+ }
+
+ class JavaSource extends SimpleJavaFileObject {
+ String id;
+ String template =
+ "import java.util.*;\n" +
+ "class Test#Id {\n" +
+ " void foo() {\n" +
+ " List<String> l = null;\n" +
+ " String first = null;\n" +
+ " try {\n" +
+ " first = l.get(0);\n" +
+ " } finally {\n" +
+ " if (first != null) {\n" +
+ " System.out.println(\"finalizer\");\n" +
+ " }\n" +
+ " }\n" +
+ " }\n" +
+ "}";
+
+ JavaSource(String id) {
+ super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
+ this.id = id;
+ }
+
+ @Override
+ public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+ return template.replace("#Id", id);
+ }
+ }
+
+ /* this class has been set up to do not depend on a fixed line number, this Attr subclass will
+ * look for 'break' or 'continue' statements in order to find the actual line number they occupy.
+ * This way the test can find if that line number appears in the LNT generated for a given class.
+ */
+ static class MyAttr extends Attr {
+ static int lineNumber;
+
+ static void preRegister(Context context) {
+ context.put(attrKey, (com.sun.tools.javac.util.Context.Factory<Attr>) c -> new MyAttr(c));
+ }
+
+ MyAttr(Context context) {
+ super(context);
+ }
+
+ @Override
+ public com.sun.tools.javac.code.Type attribStat(JCTree tree, Env<AttrContext> env) {
+ com.sun.tools.javac.code.Type result = super.attribStat(tree, env);
+ if (tree.hasTag(TRY)) {
+ JCTry tryTree = (JCTry)tree;
+ lineNumber = env.toplevel.lineMap.getLineNumber(tryTree.finalizer.endpos);
+ }
+ return result;
+ }
+ }
+
+ static class ReusableJavaCompiler extends JavaCompiler {
+ ReusableJavaCompiler(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected void checkReusable() {
+ // do nothing
+ }
+
+ @Override
+ public void close() {
+ //do nothing
+ }
+
+ void clear() {
+ newRound();
+ Modules.instance(context).newRound();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/AddExportsWithRelease.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+// key: compiler.err.add.exports.with.release
+// options: --add-exports java.base/jdk.internal.misc=ALL-UNNAMED --release 9
+
+class AddExportsWithRelease {
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/AddReadsWithRelease.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+// key: compiler.err.add.reads.with.release
+// options: --add-reads java.base=java.compiler --release 9
+
+class AddReadsWithRelease {
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/PatchModuleWithRelease/PatchModuleWithRelease.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+// key: compiler.err.patch.module.with.release
+// options: --release 9
+
+class PatchModuleWithRelease {
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/PatchModuleWithRelease/patchmodule/java.base/java/lang/Test.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,27 @@
+/*
+ * 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 java.lang;
+
+class Test {
+}
--- a/langtools/test/tools/javac/linenumbers/FinallyLineNumberTest.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/test/tools/javac/linenumbers/FinallyLineNumberTest.java Thu May 25 09:15:55 2017 -0700
@@ -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
@@ -36,7 +36,6 @@
import com.sun.tools.classfile.LineNumberTable_attribute;
import com.sun.tools.classfile.LineNumberTable_attribute.Entry;
-import java.io.File;
import java.io.IOException;
public class FinallyLineNumberTest {
@@ -46,13 +45,13 @@
if (lines == null) {
throw new Exception("finally line number table could not be loaded");
}
- if (lines.length != 4) {
+ if (lines.length != 5) {
// Help debug
System.err.println("LineTable error, got lines:");
for (Entry e : lines) {
System.err.println(e.line_number);
}
- throw new Exception("finally line number table incorrect: length=" + lines.length + " expected length=4");
+ throw new Exception("finally line number table incorrect: length=" + lines.length + " expected length=5");
}
// return null line, for the load null operation
@@ -71,11 +70,17 @@
throw new Exception("finally line number table incorrect: got=" + current + " expected=" + first);
}
- // finally line, for when exception is thrown
+ // for when exception is thrown
current = lines[3].line_number;
if (current != first + 2) {
throw new Exception("finally line number table incorrect: got=" + current + " expected=" + (first + 2));
}
+
+ // the '}' closing the finally block
+ current = lines[4].line_number;
+ if (current != first + 3) {
+ throw new Exception("finally line number table incorrect: got=" + current + " expected=" + (first + 3));
+ }
}
static Entry[] findEntries() throws IOException, ConstantPoolException {
--- a/langtools/test/tools/javac/options/release/ReleaseOptionClashes.java Mon May 22 09:34:38 2017 -0700
+++ b/langtools/test/tools/javac/options/release/ReleaseOptionClashes.java Thu May 25 09:15:55 2017 -0700
@@ -44,17 +44,19 @@
}
void run() throws Exception {
- doRunTest("-bootclasspath", "any");
- doRunTest("-Xbootclasspath:any");
- doRunTest("-Xbootclasspath/a:any");
- doRunTest("-Xbootclasspath/p:any");
- doRunTest("-endorseddirs", "any");
- doRunTest("-extdirs", "any");
- doRunTest("-source", "8");
- doRunTest("-target", "8");
+ doRunTest("7", "-bootclasspath", "any");
+ doRunTest("7", "-Xbootclasspath:any");
+ doRunTest("7", "-Xbootclasspath/a:any");
+ doRunTest("7", "-Xbootclasspath/p:any");
+ doRunTest("7", "-endorseddirs", "any");
+ doRunTest("7", "-extdirs", "any");
+ doRunTest("7", "-source", "8");
+ doRunTest("7", "-target", "8");
+ doRunTest("9", "--system", "none");
+ doRunTest("9", "--upgrade-module-path", "any");
}
- void doRunTest(String... args) throws Exception {
+ void doRunTest(String release, String... args) throws Exception {
System.out.println("Testing clashes for arguments: " + Arrays.asList(args));
Class<?> log = Class.forName("com.sun.tools.javac.util.Log", true, cl);
Field useRawMessages = log.getDeclaredField("useRawMessages");
@@ -62,7 +64,7 @@
useRawMessages.setBoolean(null, true);
ByteArrayOutputStream out = new ByteArrayOutputStream();
List<String> options = new ArrayList<>();
- options.addAll(Arrays.asList("--release", "7"));
+ options.addAll(Arrays.asList("--release", release));
options.addAll(Arrays.asList(args));
options.add(System.getProperty("test.src") + File.separator + "ReleaseOptionClashes.java");
compiler.run(null, null, out, options.toArray(new String[0]));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/options/release/ReleaseOptionUnsupported.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,313 @@
+/*
+ * 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.
+ */
+
+/**
+ * @test
+ * @bug 8178152
+ * @summary Verify unsupported modules and module options handling.
+ * @library /tools/lib
+ * @modules jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.main
+ * jdk.compiler/com.sun.tools.javac.jvm
+ * jdk.jdeps/com.sun.tools.classfile
+ * jdk.jdeps/com.sun.tools.javap
+ * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask toolbox.JavapTask toolbox.TestRunner
+ * @run main ReleaseOptionUnsupported
+ */
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
+
+import com.sun.tools.javac.jvm.Target;
+import toolbox.JavacTask;
+import toolbox.Task;
+import toolbox.Task.Expect;
+import toolbox.TestRunner;
+import toolbox.ToolBox;
+
+public class ReleaseOptionUnsupported extends TestRunner {
+
+ private final ToolBox tb = new ToolBox();
+
+ public ReleaseOptionUnsupported() {
+ super(System.err);
+ }
+
+ public static void main(String... args) throws Exception {
+ new ReleaseOptionUnsupported().runTests();
+ }
+
+ @Test
+ public void testUnsafe(Path base) throws IOException {
+ Path src = base.resolve("src");
+ tb.writeJavaFiles(src,
+ "module m { requires jdk.unsupported; }",
+ "package test; public class Test { sun.misc.Unsafe unsafe; } ");
+ Path classes = base.resolve("classes");
+ tb.createDirectories(classes);
+
+ List<String> log;
+ List<String> expected = Arrays.asList(
+ "Test.java:1:43: compiler.warn.sun.proprietary: sun.misc.Unsafe",
+ "1 warning"
+ );
+
+ log = new JavacTask(tb)
+ .options("-XDrawDiagnostics")
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.SUCCESS)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+
+ if (!expected.equals(log)) {
+ throw new AssertionError("Unexpected output: " + log);
+ }
+
+ log = new JavacTask(tb)
+ .options("-XDrawDiagnostics",
+ "--release", Target.DEFAULT.multiReleaseValue())
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.SUCCESS)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+
+ if (!expected.equals(log)) {
+ throw new AssertionError("Unexpected output: " + log);
+ }
+ }
+
+ @Test
+ public void testUnsafeUnnamed(Path base) throws IOException {
+ Path src = base.resolve("src");
+ tb.writeJavaFiles(src,
+ "package test; public class Test { sun.misc.Unsafe unsafe; } ");
+ Path classes = base.resolve("classes");
+ tb.createDirectories(classes);
+
+ List<String> log;
+ List<String> expected = Arrays.asList(
+ "Test.java:1:43: compiler.warn.sun.proprietary: sun.misc.Unsafe",
+ "1 warning"
+ );
+
+ log = new JavacTask(tb)
+ .options("-XDrawDiagnostics")
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.SUCCESS)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+
+ if (!expected.equals(log)) {
+ throw new AssertionError("Unexpected output: " + log);
+ }
+
+ log = new JavacTask(tb)
+ .options("-XDrawDiagnostics",
+ "--release", Target.DEFAULT.multiReleaseValue())
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.SUCCESS)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+
+ if (!expected.equals(log)) {
+ throw new AssertionError("Unexpected output: " + log);
+ }
+ }
+
+ @Test
+ public void testAddExports(Path base) throws IOException {
+ Path src = base.resolve("src");
+ tb.writeJavaFiles(src,
+ "module m { }",
+ "package test; public class Test { jdk.internal.misc.Unsafe unsafe; } ");
+ Path classes = base.resolve("classes");
+ tb.createDirectories(classes);
+
+ new JavacTask(tb)
+ .options("-XDrawDiagnostics",
+ "--add-exports", "java.base/jdk.internal.misc=m")
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.SUCCESS)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+
+ List<String> log;
+ List<String> expected;
+
+ log = new JavacTask(tb)
+ .options("-XDrawDiagnostics",
+ "--add-exports", "java.base/jdk.internal.misc=m",
+ "--release", Target.DEFAULT.multiReleaseValue())
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.FAIL)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+
+ expected = Arrays.asList(
+ "- compiler.err.add.exports.with.release: java.base",
+ "1 error"
+ );
+
+ if (!expected.equals(log)) {
+ throw new AssertionError("Unexpected output: " + log);
+ }
+
+ //OK to add exports a package of a non-system module:
+ tb.writeJavaFiles(src,
+ "package test; public class Test { } ");
+ tb.createDirectories(classes);
+
+ new JavacTask(tb)
+ .options("-XDrawDiagnostics",
+ "--add-exports", "m/test=ALL-UNNAMED",
+ "--release", Target.DEFAULT.multiReleaseValue())
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.SUCCESS)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+ }
+
+ @Test
+ public void testAddReads(Path base) throws IOException {
+ Path src = base.resolve("src");
+ tb.writeJavaFiles(src,
+ "module m { }",
+ "package test; public class Test { } ");
+ Path classes = base.resolve("classes");
+ tb.createDirectories(classes);
+
+ new JavacTask(tb)
+ .options("-XDrawDiagnostics",
+ "--add-reads", "java.base=m")
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.SUCCESS)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+
+ List<String> log;
+ List<String> expected;
+
+ log = new JavacTask(tb)
+ .options("-XDrawDiagnostics",
+ "--add-reads", "java.base=m",
+ "--release", Target.DEFAULT.multiReleaseValue())
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.FAIL)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+
+ expected = Arrays.asList(
+ "- compiler.err.add.reads.with.release: java.base",
+ "1 error"
+ );
+
+ if (!expected.equals(log)) {
+ throw new AssertionError("Unexpected output: " + log);
+ }
+
+ //OK to add reads a package of a non-system module:
+ tb.createDirectories(classes);
+
+ new JavacTask(tb)
+ .options("-XDrawDiagnostics",
+ "--add-reads", "m=java.base",
+ "--release", Target.DEFAULT.multiReleaseValue())
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.SUCCESS)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+ }
+
+ @Test
+ public void testPatchModule(Path base) throws IOException {
+ Path src = base.resolve("src");
+ tb.writeJavaFiles(src,
+ "module m { }",
+ "package test; public class Test { } ");
+ Path classes = base.resolve("classes");
+ tb.createDirectories(classes);
+ Path patch = base.resolve("patch");
+ tb.createDirectories(patch);
+
+ new JavacTask(tb)
+ .options("-XDrawDiagnostics",
+ "--patch-module", "java.base=" + patch)
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.SUCCESS)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+
+ List<String> log;
+ List<String> expected;
+
+ log = new JavacTask(tb)
+ .options("-XDrawDiagnostics",
+ "--patch-module", "java.base=" + patch,
+ "--release", Target.DEFAULT.multiReleaseValue())
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.FAIL)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+
+ expected = Arrays.asList(
+ "- compiler.err.patch.module.with.release: java.base",
+ "1 error"
+ );
+
+ if (!expected.equals(log)) {
+ throw new AssertionError("Unexpected output: " + log);
+ }
+
+ //OK to patch a non-system module:
+ tb.createDirectories(classes);
+
+ new JavacTask(tb)
+ .options("-XDrawDiagnostics",
+ "--patch-module", "m=" + patch,
+ "--release", Target.DEFAULT.multiReleaseValue())
+ .outdir(classes)
+ .files(tb.findJavaFiles(src))
+ .run(Expect.SUCCESS)
+ .writeAll()
+ .getOutputLines(Task.OutputKind.DIRECT);
+ }
+
+ protected void runTests() throws Exception {
+ runTests(m -> new Object[] { Paths.get(m.getName()) });
+ }
+}
--- a/make/Bundles.gmk Mon May 22 09:34:38 2017 -0700
+++ b/make/Bundles.gmk Thu May 25 09:15:55 2017 -0700
@@ -183,6 +183,7 @@
$(JDK_SYMBOLS_EXCLUDE_PATTERN) \
$(JDK_EXTRA_EXCLUDES) \
$(SYMBOLS_EXCLUDE_PATTERN) \
+ $(JDK_IMAGE_HOMEDIR)/demo/% \
, \
$(ALL_JDK_FILES) \
)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/make/Docs.gmk Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,476 @@
+# 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
+# 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.
+#
+
+default: all
+
+include $(SPEC)
+include MakeBase.gmk
+include Modules.gmk
+include ProcessMarkdown.gmk
+include ZipArchive.gmk
+include $(JDK_TOPDIR)/make/Tools.gmk
+include $(JDK_TOPDIR)/make/ModuleTools.gmk
+
+# This is needed to properly setup DOCS_MODULES.
+$(eval $(call ReadImportMetaData))
+
+################################################################################
+
+# Hook to include the corresponding custom file, if present.
+$(eval $(call IncludeCustomExtension, , Docs.gmk))
+
+################################################################################
+# Javadoc settings
+
+# On top of the sources that was used to compile the JDK, we need some
+# extra java.rmi sources that are used just for javadoc.
+MODULES_SOURCE_PATH := $(call PathList, $(call GetModuleSrcPath) \
+ $(SUPPORT_OUTPUTDIR)/rmic/* $(JDK_TOPDIR)/src/*/share/doc/stub)
+
+# URLs
+JAVADOC_BASE_URL := http://www.oracle.com/pls/topic/lookup?ctx=javase9&id=homepage
+BUG_SUBMIT_URL := http://bugreport.java.com/bugreport/
+COPYRIGHT_URL := {@docroot}/../legal/cpyr.html
+LICENSE_URL := http://www.oracle.com/technetwork/java/javase/terms/license/java9speclicense.html
+REDISTRIBUTION_URL := http://www.oracle.com/technetwork/java/redist-137594.html
+
+
+# In order to get a specific ordering it's necessary to specify the total
+# ordering of tags as the tags are otherwise ordered in order of definition.
+JAVADOC_TAGS := \
+ -tag beaninfo:X \
+ -tag revised:X \
+ -tag since.unbundled:X \
+ -tag spec:X \
+ -tag specdefault:X \
+ -tag Note:X \
+ -tag ToDo:X \
+ -tag 'apiNote:a:API Note:' \
+ -tag 'implSpec:a:Implementation Requirements:' \
+ -tag 'implNote:a:Implementation Note:' \
+ -tag param \
+ -tag return \
+ -tag throws \
+ -taglet build.tools.taglet.ModuleGraph \
+ -tag since \
+ -tag version \
+ -tag serialData \
+ -tag factory \
+ -tag see \
+ -tag 'jvms:a:See <cite>The Java™ Virtual Machine Specification</cite>:' \
+ -tag 'jls:a:See <cite>The Java™ Language Specification</cite>:' \
+ -taglet build.tools.taglet.ExtLink \
+ -taglet build.tools.taglet.Incubating \
+ -tagletpath $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
+ $(CUSTOM_JAVADOC_TAGS) \
+ #
+
+# Which doclint checks to ignore
+JAVADOC_DISABLED_DOCLINT := accessibility html missing syntax reference
+
+# The initial set of options for javadoc
+JAVADOC_OPTIONS := -XDignore.symbol.file=true -use -keywords -notimestamp \
+ -serialwarn -encoding ISO-8859-1 -breakiterator -splitIndex --system none \
+ -html5 -javafx --expand-requires transitive
+
+# Should we add DRAFT stamps to the generated javadoc?
+ifeq ($(VERSION_IS_GA), true)
+ IS_DRAFT := false
+else
+ IS_DRAFT := true
+endif
+
+################################################################################
+# General text snippets
+
+FULL_COMPANY_NAME := Oracle and/or its affiliates
+COMPANY_ADDRESS := 500 Oracle Parkway<br>Redwood Shores, CA 94065 USA
+
+ifeq ($(IS_DRAFT), true)
+ DRAFT_MARKER_STR := <br><strong>DRAFT $(VERSION_STRING)</strong>
+ ifeq ($(VERSION_BUILD), 0)
+ DRAFT_MARKER_TITLE := [ad-hoc build]
+ else
+ DRAFT_MARKER_TITLE := [build $(VERSION_BUILD)]
+ endif
+endif
+
+JAVADOC_WINDOW_TITLE := Java Platform SE $(VERSION_SPECIFICATION) \
+ $(DRAFT_MARKER_TITLE)
+
+JAVADOC_HEADER_TITLE := $(subst $(SPACE), ,$(strip \
+ <strong>Java™ Platform<br>Standard Ed. \
+ $(VERSION_SPECIFICATION)</strong>$(DRAFT_MARKER_STR)))
+
+JAVADOC_BOTTOM := \
+ <span style="font-size:smaller"> \
+ <a href="$(BUG_SUBMIT_URL)">Submit a bug or feature</a><br> \
+ For further API reference and developer documentation, see \
+ <a href="$(JAVADOC_BASE_URL)" target="_blank">Java SE \
+ Documentation</a>. That documentation contains more detailed, \
+ developer-targeted descriptions, with conceptual overviews, definitions \
+ of terms, workarounds, and working code examples.<br> \
+ Java is a trademark or registered trademark of $(FULL_COMPANY_NAME) in \
+ the US and other countries.<br> \
+ <a href="$(COPYRIGHT_URL)">Copyright</a> \
+ © 1993, $(COPYRIGHT_YEAR), $(FULL_COMPANY_NAME). \
+ $(COMPANY_ADDRESS). All rights reserved. \
+ Use is subject to <a href="$(LICENSE_URL)">license terms</a>. Also see the \
+ <a href="$(REDISTRIBUTION_URL)">documentation redistribution policy</a>. \
+ $(DRAFT_MARKER_STR)</span>
+
+JAVADOC_TOP := \
+ <div style="background-color: $(HASH)EEEEEE"><div style="padding: 6px; \
+ margin-top: 2px; margin-bottom: 6px; margin-left: 6px; margin-right: \
+ 6px; text-align: justify; font-size: 80%; font-family: Helvetica, Arial, \
+ sans-serif; font-weight: normal;">Please note that the specifications \
+ and other information contained herein are not final and are subject to \
+ change. The information is being made available to you solely for \
+ purpose of evaluation.</div></div>
+
+################################################################################
+# JDK javadoc titles/text snippets
+
+JDK_JAVADOC_DOC_TITLE := Java™ Platform, Standard Edition Development Kit \
+ (JDK™) $(VERSION_SPECIFICATION)<br>API Specification
+
+################################################################################
+# Java SE javadoc titles/text snippets
+
+JAVASE_JAVADOC_DOC_TITLE := Java™ Platform, Standard Edition \
+ $(VERSION_SPECIFICATION)<br>API Specification
+
+################################################################################
+
+JDK_DOCS_INDEX_HTML_TITLE := Java™ Platform, Standard Edition Development Kit \
+ (JDK™) $(VERSION_SPECIFICATION) Specification<br>$(DRAFT_MARKER_TITLE)
+
+################################################################################
+# Functions
+
+# Helper function for creating a png file from a dot file generated by the
+# GenGraphs tool.
+# param 1: SetupJavadocGeneration namespace ($1)
+# param 2: module name
+#
+define setup_gengraph_dot_to_png
+ $1_$2_DOT_SRC := $$($1_GENGRAPHS_DIR)/$2.dot
+ $1_$2_PNG_TARGET := $$($1_TARGET_DIR)/$2-graph.png
+
+ # For each module needing a graph, create a png file from the dot file
+ # generated by the GenGraphs tool and store it in the target dir.
+ $$($1_$2_PNG_TARGET): $$($1_GENGRAPHS_MARKER)
+ $$(call MakeDir, $$(@D))
+ $$(call ExecuteWithLog, $$($1_$2_DOT_SRC), \
+ $$(DOT) -Tpng -o $$($1_$2_PNG_TARGET) $$($1_$2_DOT_SRC))
+
+ $1_MODULEGRAPH_TARGETS += $$($1_$2_PNG_TARGET)
+endef
+
+################################################################################
+# Setup make rules for creating the API documentation, using javadoc and other
+# tools if needed.
+#
+# Parameter 1 is the name of the rule. This name is used as variable prefix.
+# Targets generated are returned as $1_JAVADOC_TARGETS and
+# $1_MODULEGRAPH_TARGETS. Note that the index.html file will work as a "touch
+# file" for all the magnitude of files that are generated by javadoc.
+#
+# Remaining parameters are named arguments. These include:
+# MODULES - Modules to generate javadoc for
+# NAME - The name of the javadoc compilation, to be presented to the user
+# TARGET_DIR - Where to store the output
+# OVERVIEW - Path to an html overview file
+# DOC_TITLE - Title to use in -doctitle.
+# WINDOW_TITLE - Title to use in -windowtitle.
+# HEADER_TITLE - Title to use in -header.
+# BOTTOM_TEXT - Text to use in -bottom.
+# TOP_TEXT - Text to use in -top.
+#
+SetupApiDocsGeneration = $(NamedParamsMacroTemplate)
+define SetupApiDocsGenerationBody
+
+ # Figure out all modules, both specified and transitive, that will be processed
+ # by javadoc.
+ $1_TRANSITIVE_MODULES := $$(call FindTransitiveDepsForModules, $$($1_MODULES))
+ $1_ALL_MODULES := $$(sort $$($1_MODULES) $$($1_TRANSITIVE_MODULES))
+
+ ifeq ($$(ENABLE_FULL_DOCS), true)
+ # Tell the ModuleGraph taglet to generate html links to soon-to-be-created
+ # png files with module graphs.
+ $1_JAVA_ARGS += -DenableModuleGraph=true
+ endif
+
+ # Always include tags and basic options
+ $1_OPTIONS := $$(JAVADOC_TAGS) $$(JAVADOC_OPTIONS)
+
+ $1_OPTIONS += -overview $$($1_OVERVIEW)
+ $1_OPTIONS += --module-source-path $$(MODULES_SOURCE_PATH)
+ $1_OPTIONS += --module $$(call CommaList, $$($1_MODULES))
+
+ # Create a string like "-Xdoclint:all,-syntax,-html,..."
+ $1_OPTIONS += -Xdoclint:all,$$(call CommaList, $$(addprefix -, \
+ $$(JAVADOC_DISABLED_DOCLINT)))
+
+ $1_OPTIONS += -doctitle '$$($1_DOC_TITLE)'
+ $1_OPTIONS += -windowtitle '$$($1_WINDOW_TITLE)'
+ $1_OPTIONS += -header '$$($1_HEADER_TITLE)'
+ $1_OPTIONS += -bottom '$$($1_BOTTOM_TEXT)'
+ ifeq ($$(IS_DRAFT), true)
+ $1_OPTIONS += -top '$$($1_TOP_TEXT)'
+ endif
+
+ # Do not store debug level options in VARDEPS.
+ ifneq ($$(LOG_LEVEL), trace)
+ $1_LOG_OPTION += -quiet
+ else
+ $1_LOG_OPTION += -verbose
+ endif
+
+ $1_VARDEPS := $$($1_JAVA_ARGS) $$($1_OPTIONS) $$(MODULES_SOURCE_PATH) \
+ $$($1_ALL_MODULES)
+ $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \
+ $$(SUPPORT_OUTPUTDIR)/docs/$1.vardeps)
+
+ # Get a list of all files in all the source dirs for all included modules
+ $1_SOURCE_DEPS := $$(call CacheFind, $$(wildcard $$(foreach module, \
+ $$($1_ALL_MODULES), $$(call FindModuleSrcDirs, $$(module)))))
+
+ # Javadoc creates a lot of files but use index.html as a marker
+ $$($1_TARGET_DIR)/index.html: $$(BUILD_TOOLS_JDK) $$($1_VARDEPS_FILE) \
+ $$($1_SOURCE_DEPS) $$($1_OVERVIEW)
+ $$(call LogWarn, Generating $$($1_NAME) API javadoc for \
+ $$(words $$($1_ALL_MODULES)) modules)
+ $$(call LogInfo, Javadoc modules: $$($1_ALL_MODULES))
+ $$(call MakeDir, $$($1_TARGET_DIR))
+ $$(call ExecuteWithLog, $$(SUPPORT_OUTPUTDIR)/docs/$1, \
+ $$(JAVA) -Djava.awt.headless=true $$($1_JAVA_ARGS) \
+ $$(NEW_JAVADOC) -d $$($1_TARGET_DIR) \
+ $$(JAVADOC_TAGS) $$($1_OPTIONS) $$($1_LOG_OPTION))
+
+ $1_JAVADOC_TARGETS := $$($1_TARGET_DIR)/index.html
+
+ ifeq ($$(ENABLE_FULL_DOCS), true)
+ # We have asked ModuleGraph to generate links to png files. Now we must
+ # produce the png files.
+
+ # Locate which modules has the @moduleGraph tag in their module-info.java
+ $1_MODULES_NEEDING_GRAPH := $$(strip $$(foreach m, $$($1_ALL_MODULES), \
+ $$(if $$(shell $$(GREP) -e @moduleGraph \
+ $$(wildcard $$(addsuffix /module-info.java, \
+ $$(call FindModuleSrcDirs, $$m)))), \
+ $$m) \
+ ))
+
+ # First we run the GenGraph tool. It will query the module structure of the
+ # running JVM and output .dot files for all existing modules.
+ GENGRAPHS_PROPS := \
+ $$(JDK_TOPDIR)/make/src/classes/build/tools/jigsaw/javadoc-graphs.properties
+
+ $1_GENGRAPHS_DIR := $$(SUPPORT_OUTPUTDIR)/docs/$1-gengraphs
+ $1_GENGRAPHS_MARKER := $$($1_GENGRAPHS_DIR)/_gengraphs_run.marker
+
+ $$($1_GENGRAPHS_MARKER): $$(BUILD_JIGSAW_TOOLS) $$(GENGRAPHS_PROPS)
+ $$(call LogInfo, Running gengraphs for $$($1_NAME) API documentation)
+ $$(call MakeDir, $$($1_GENGRAPHS_DIR))
+ $$(call ExecuteWithLog, $$($1_GENGRAPHS_DIR)/gengraphs, \
+ $$(TOOL_GENGRAPHS) --spec --output $$($1_GENGRAPHS_DIR) \
+ --dot-attributes $$(GENGRAPHS_PROPS) && \
+ $$(TOUCH) $$($1_GENGRAPHS_MARKER))
+
+ # For each module needing a graph, create a png file from the dot file
+ # generated by the GenGraphs tool and store it in the target dir.
+ # They will depend on $1_GENGRAPHS_MARKER, and will be added to $1.
+ $$(foreach m, $$($1_MODULES_NEEDING_GRAPH), \
+ $$(eval $$(call setup_gengraph_dot_to_png,$1,$$m)) \
+ )
+ endif
+endef
+
+################################################################################
+# Setup generation of the JDK API documentation (javadoc + modulegraph)
+
+# All modules to have docs generated by docs-jdk-api target
+JDK_JAVADOC_MODULES := $(sort $(DOCS_MODULES))
+
+JDK_JAVADOC_OVERVIEW := $(JDK_TOPDIR)/src/java.base/share/classes/overview-core.html
+
+$(eval $(call SetupApiDocsGeneration, JDK_API, \
+ MODULES := $(JDK_JAVADOC_MODULES), \
+ NAME := JDK, \
+ TARGET_DIR := $(DOCS_OUTPUTDIR)/api, \
+ OVERVIEW := $(JDK_JAVADOC_OVERVIEW), \
+ DOC_TITLE := $(JDK_JAVADOC_DOC_TITLE), \
+ WINDOW_TITLE := $(JAVADOC_WINDOW_TITLE), \
+ HEADER_TITLE := $(JAVADOC_HEADER_TITLE), \
+ BOTTOM_TEXT := $(JAVADOC_BOTTOM), \
+ TOP_TEXT := $(JAVADOC_TOP), \
+))
+
+# Targets generated are returned in JDK_API_JAVADOC_TARGETS and
+# JDK_API_MODULEGRAPH_TARGETS.
+
+################################################################################
+# Setup generation of the Java SE API documentation (javadoc + modulegraph)
+
+# The Java SE module scope is just java.se.ee and it's transitive modules.
+JAVASE_JAVADOC_MODULES := java.se.ee
+
+JAVASE_JAVADOC_OVERVIEW := $(JDK_TOPDIR)/src/java.base/share/classes/overview-core.html
+
+$(eval $(call SetupApiDocsGeneration, JAVASE_API, \
+ MODULES := $(JAVASE_JAVADOC_MODULES), \
+ NAME := Java SE, \
+ TARGET_DIR := $(IMAGES_OUTPUTDIR)/javase-docs/api, \
+ OVERVIEW := $(JAVASE_JAVADOC_OVERVIEW), \
+ DOC_TITLE := $(JAVASE_JAVADOC_DOC_TITLE), \
+ WINDOW_TITLE := $(JAVADOC_WINDOW_TITLE), \
+ HEADER_TITLE := $(JAVADOC_HEADER_TITLE), \
+ BOTTOM_TEXT := $(JAVADOC_BOTTOM), \
+ TOP_TEXT := $(JAVADOC_TOP), \
+))
+
+# Targets generated are returned in JAVASE_API_JAVADOC_TARGETS and
+# JAVASE_API_MODULEGRAPH_TARGETS.
+
+################################################################################
+
+JDK_DOCS_INDEX_HTML := $(DOCS_OUTPUTDIR)/index.html
+
+$(JDK_DOCS_INDEX_HTML): $(BUILD_JIGSAW_TOOLS)
+ $(call LogInfo, Generating docs bundle index page)
+ $(MKDIR) -p $(@D)
+ $(TOOL_GEN_DOCS_BUNDLE_PAGE) --title '$(JDK_DOCS_INDEX_HTML_TITLE)' \
+ --output $@
+
+JDK_DOCS_INDEX_HTML_TARGETS := $(JDK_DOCS_INDEX_HTML)
+
+################################################################################
+# Copy JDK specs files
+
+# For all html documentation in $module/share/specs directories, copy it
+# unmodified
+
+ALL_MODULES := $(call FindAllModules)
+COPY_SPEC_FILTER := %.html %.gif %.jpg %.mib %.css
+
+$(foreach m, $(ALL_MODULES), \
+ $(eval SPECS_$m := $(call FindModuleSpecsDirs, $m)) \
+ $(foreach d, $(SPECS_$m), \
+ $(if $(filter $(COPY_SPEC_FILTER), $(call CacheFind, $d)), \
+ $(eval $(call SetupCopyFiles, COPY_$m, \
+ SRC := $d, \
+ FILES := $(filter $(COPY_SPEC_FILTER), $(call CacheFind, $d)), \
+ DEST := $(DOCS_OUTPUTDIR)/specs/, \
+ )) \
+ $(eval JDK_SPECS_TARGETS += $(COPY_$m)) \
+ ) \
+ ) \
+)
+
+# Copy the global resources
+GLOBAL_SPECS_RESOURCES_DIR := $(JDK_TOPDIR)/make/data/docs-resources/specs
+$(eval $(call SetupCopyFiles, COPY_GLOBAL_RESOURCES, \
+ SRC := $(GLOBAL_SPECS_RESOURCES_DIR), \
+ FILES := $(call CacheFind, $(GLOBAL_SPECS_RESOURCES_DIR)), \
+ DEST := $(DOCS_OUTPUTDIR)/specs/, \
+))
+JDK_SPECS_TARGETS += $(COPY_GLOBAL_RESOURCES)
+
+ifeq ($(ENABLE_FULL_DOCS), true)
+ # For all markdown files in $module/share/specs directories, convert them to
+ # html.
+
+ GLOBAL_SPECS_DEFAULT_CSS_FILE := $(DOCS_OUTPUTDIR)/specs/resources/jdk-default.css
+
+ $(foreach m, $(ALL_MODULES), \
+ $(eval SPECS_$m := $(call FindModuleSpecsDirs, $m)) \
+ $(foreach d, $(SPECS_$m), \
+ $(if $(filter %.md, $(call CacheFind, $d)), \
+ $(eval $(call SetupProcessMarkdown, CONVERT_MARKDOWN_$m_$(patsubst $(TOPDIR)/%,%,$d), \
+ SRC := $d, \
+ FILES := $(filter %.md, $(call CacheFind, $d)), \
+ DEST := $(DOCS_OUTPUTDIR)/specs/, \
+ CSS := $(GLOBAL_SPECS_DEFAULT_CSS_FILE), \
+ )) \
+ ) \
+ $(eval JDK_SPECS_TARGETS += $(CONVERT_MARKDOWN_$m_$(patsubst $(TOPDIR)/%,%,$d))) \
+ ) \
+ )
+endif
+
+# Special treatment for generated documentation
+
+JDWP_PROTOCOL := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/jdwp-protocol.html
+$(eval $(call SetupCopyFiles, COPY_JDWP_PROTOCOL, \
+ FILES := $(JDWP_PROTOCOL), \
+ DEST := $(DOCS_OUTPUTDIR)/specs/jdwp, \
+))
+JDK_SPECS_TARGETS += $(COPY_JDWP_PROTOCOL)
+
+# Get jvmti.html from the main jvm variant (all variants' jvmti.html are identical).
+JVMTI_HTML := $(HOTSPOT_OUTPUTDIR)/variant-$(JVM_VARIANT_MAIN)/gensrc/jvmtifiles/jvmti.html
+$(eval $(call SetupCopyFiles, COPY_JVMTI_HTML, \
+ FILES := $(JVMTI_HTML), \
+ DEST := $(DOCS_OUTPUTDIR)/specs, \
+))
+JDK_SPECS_TARGETS += $(COPY_JVMTI_HTML)
+
+################################################################################
+# Optional target which bundles all generated javadocs into a zip archive.
+
+JAVADOC_ZIP_NAME := jdk-$(VERSION_STRING)-docs.zip
+JAVADOC_ZIP_FILE := $(OUTPUT_ROOT)/bundles/$(JAVADOC_ZIP_NAME)
+
+$(eval $(call SetupZipArchive, BUILD_JAVADOC_ZIP, \
+ SRC := $(DOCS_OUTPUTDIR), \
+ ZIP := $(JAVADOC_ZIP_FILE), \
+ EXTRA_DEPS := $(JDK_API_JAVADOC_TARGETS) $(JDK_API_MODULEGRAPH_TARGETS) \
+ $(JDK_SPECS_TARGETS), \
+))
+
+ZIP_TARGETS += $(BUILD_JAVADOC_ZIP)
+
+################################################################################
+
+docs-jdk-api-javadoc: $(JDK_API_JAVADOC_TARGETS) $(JDK_API_CUSTOM_TARGETS)
+
+docs-jdk-api-modulegraph: $(JDK_API_MODULEGRAPH_TARGETS)
+
+docs-javase-api-javadoc: $(JAVASE_API_JAVADOC_TARGETS) $(JAVASE_API_CUSTOM_TARGETS)
+
+docs-javase-api-modulegraph: $(JAVASE_API_MODULEGRAPH_TARGETS)
+
+docs-jdk-specs: $(JDK_SPECS_TARGETS)
+
+docs-jdk-index: $(JDK_DOCS_INDEX_HTML_TARGETS)
+
+docs-zip: $(ZIP_TARGETS)
+
+all: docs-jdk-api-javadoc docs-jdk-api-modulegraph docs-javase-api-javadoc \
+ docs-javase-api-modulegraph docs-jdk-specs docs-jdk-index docs-zip
+
+.PHONY: default all docs-jdk-api-javadoc docs-jdk-api-modulegraph \
+ docs-javase-api-javadoc docs-javase-api-modulegraph docs-jdk-specs \
+ docs-jdk-index docs-zip
--- a/make/Javadoc.gmk Mon May 22 09:34:38 2017 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,461 +0,0 @@
-# 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
-# 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.
-#
-
-default: all
-
-include $(SPEC)
-include MakeBase.gmk
-include Modules.gmk
-include ProcessMarkdown.gmk
-include ZipArchive.gmk
-include $(JDK_TOPDIR)/make/Tools.gmk
-include $(JDK_TOPDIR)/make/ModuleTools.gmk
-
-# This is needed to properly setup DOCS_MODULES.
-$(eval $(call ReadImportMetaData))
-
-################################################################################
-
-# Hook to include the corresponding custom file, if present.
-$(eval $(call IncludeCustomExtension, , Javadoc.gmk))
-
-################################################################################
-# Javadoc settings
-
-# On top of the sources that was used to compile the JDK, we need some
-# extra java.rmi sources that are used just for javadoc.
-MODULES_SOURCE_PATH := $(call PathList, $(call GetModuleSrcPath) \
- $(SUPPORT_OUTPUTDIR)/rmic/* $(JDK_TOPDIR)/src/*/share/doc/stub)
-
-# Should we use -Xdocrootparent? Allow custom to overwrite.
-DOCROOTPARENT_FLAG ?= TRUE
-
-# URLs
-JAVADOC_BASE_URL := http://www.oracle.com/pls/topic/lookup?ctx=javase9&id=homepage
-BUG_SUBMIT_URL := http://bugreport.java.com/bugreport/
-COPYRIGHT_URL := {@docroot}/../legal/cpyr.html
-LICENSE_URL := http://www.oracle.com/technetwork/java/javase/terms/license/java9speclicense.html
-REDISTRIBUTION_URL := http://www.oracle.com/technetwork/java/redist-137594.html
-
-
-# In order to get a specific ordering it's necessary to specify the total
-# ordering of tags as the tags are otherwise ordered in order of definition.
-JAVADOC_TAGS := \
- -tag beaninfo:X \
- -tag revised:X \
- -tag since.unbundled:X \
- -tag spec:X \
- -tag specdefault:X \
- -tag Note:X \
- -tag ToDo:X \
- -tag 'apiNote:a:API Note:' \
- -tag 'implSpec:a:Implementation Requirements:' \
- -tag 'implNote:a:Implementation Note:' \
- -tag param \
- -tag return \
- -tag throws \
- -taglet build.tools.taglet.ModuleGraph \
- -tag since \
- -tag version \
- -tag serialData \
- -tag factory \
- -tag see \
- -tag 'jvms:a:See <cite>The Java™ Virtual Machine Specification</cite>:' \
- -tag 'jls:a:See <cite>The Java™ Language Specification</cite>:' \
- -taglet build.tools.taglet.ExtLink \
- -taglet build.tools.taglet.Incubating \
- -tagletpath $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
- $(CUSTOM_JAVADOC_TAGS) \
- #
-
-# Which doclint checks to ignore
-JAVADOC_DISABLED_DOCLINT := accessibility html missing syntax reference
-
-# The initial set of options for javadoc
-JAVADOC_OPTIONS := -XDignore.symbol.file=true -use -keywords -notimestamp \
- -serialwarn -encoding ISO-8859-1 -breakiterator -splitIndex --system none \
- -html5 -javafx --expand-requires transitive
-
-# Should we add DRAFT stamps to the generated javadoc?
-ifeq ($(VERSION_IS_GA), true)
- IS_DRAFT := false
-else
- IS_DRAFT := true
-endif
-
-################################################################################
-# General text snippets
-
-FULL_COMPANY_NAME := Oracle and/or its affiliates
-COMPANY_ADDRESS := 500 Oracle Parkway<br>Redwood Shores, CA 94065 USA
-
-ifeq ($(IS_DRAFT), true)
- DRAFT_MARKER_STR := <br><strong>DRAFT $(VERSION_STRING)</strong>
- ifeq ($(VERSION_BUILD), 0)
- DRAFT_MARKER_TITLE := [ad-hoc build]
- else
- DRAFT_MARKER_TITLE := [build $(VERSION_BUILD)]
- endif
-endif
-
-JAVADOC_WINDOW_TITLE := Java Platform SE $(VERSION_SPECIFICATION) \
- $(DRAFT_MARKER_TITLE)
-
-JAVADOC_HEADER_TITLE := $(subst $(SPACE), ,$(strip \
- <strong>Java™ Platform<br>Standard Ed. \
- $(VERSION_SPECIFICATION)</strong>$(DRAFT_MARKER_STR)))
-
-JAVADOC_BOTTOM := \
- <span style="font-size:smaller"> \
- <a href="$(BUG_SUBMIT_URL)">Submit a bug or feature</a><br> \
- For further API reference and developer documentation, see \
- <a href="$(JAVADOC_BASE_URL)/index.html" target="_blank">Java SE \
- Documentation</a>. That documentation contains more detailed, \
- developer-targeted descriptions, with conceptual overviews, definitions \
- of terms, workarounds, and working code examples.<br> \
- Java is a trademark or registered trademark of $(FULL_COMPANY_NAME) in \
- the US and other countries.<br> \
- <a href="$(COPYRIGHT_URL)">Copyright</a> \
- © 1993, $(COPYRIGHT_YEAR), $(FULL_COMPANY_NAME). \
- $(COMPANY_ADDRESS). All rights reserved. \
- Use is subject to <a href="$(LICENSE_URL)">license terms</a>. Also see the \
- <a href="$(REDISTRIBUTION_URL)">documentation redistribution policy</a>. \
- $(DRAFT_MARKER_STR)</span>
-
-JAVADOC_TOP := \
- <div style="background-color: $(HASH)EEEEEE"><div style="padding: 6px; \
- margin-top: 2px; margin-bottom: 6px; margin-left: 6px; margin-right: \
- 6px; text-align: justify; font-size: 80%; font-family: Helvetica, Arial, \
- sans-serif; font-weight: normal;">Please note that the specifications \
- and other information contained herein are not final and are subject to \
- change. The information is being made available to you solely for \
- purpose of evaluation.</div></div>
-
-################################################################################
-# JDK javadoc titles/text snippets
-
-JDK_JAVADOC_DOC_TITLE := Java™ Platform, Standard Edition Development Kit \
- (JDK™) $(VERSION_SPECIFICATION)<br>API Specification
-
-################################################################################
-# Java SE javadoc titles/text snippets
-
-JAVASE_JAVADOC_DOC_TITLE := Java™ Platform, Standard Edition \
- $(VERSION_SPECIFICATION)<br>API Specification
-
-################################################################################
-# Functions
-
-# Helper function for creating a png file from a dot file generated by the
-# GenGraphs tool.
-# param 1: SetupJavadocGeneration namespace ($1)
-# param 2: module name
-#
-define setup_gengraph_dot_to_png
- $1_$2_DOT_SRC := $$($1_GENGRAPHS_DIR)/$2.dot
- $1_$2_PNG_TARGET := $$($1_TARGET_DIR)/$2-graph.png
-
- # For each module needing a graph, create a png file from the dot file
- # generated by the GenGraphs tool and store it in the target dir.
- $$($1_$2_PNG_TARGET): $$($1_GENGRAPHS_MARKER)
- $$(call MakeDir, $$(@D))
- $$(call ExecuteWithLog, $$($1_$2_DOT_SRC), \
- $$(DOT) -Tpng -o $$($1_$2_PNG_TARGET) $$($1_$2_DOT_SRC))
-
- $1_MODULEGRAPH_TARGETS += $$($1_$2_PNG_TARGET)
-endef
-
-################################################################################
-# Setup make rules for creating the API documentation, using javadoc and other
-# tools if needed.
-#
-# Parameter 1 is the name of the rule. This name is used as variable prefix.
-# Targets generated are returned as $1_JAVADOC_TARGETS and
-# $1_MODULEGRAPH_TARGETS. Note that the index.html file will work as a "touch
-# file" for all the magnitude of files that are generated by javadoc.
-#
-# Remaining parameters are named arguments. These include:
-# MODULES - Modules to generate javadoc for
-# NAME - The name of the javadoc compilation, to be presented to the user
-# TARGET_DIR - Where to store the output
-# OVERVIEW - Path to an html overview file
-# DOC_TITLE - Title to use in -doctitle.
-# WINDOW_TITLE - Title to use in -windowtitle.
-# HEADER_TITLE - Title to use in -header.
-# BOTTOM_TEXT - Text to use in -bottom.
-# TOP_TEXT - Text to use in -top.
-#
-SetupApiDocsGeneration = $(NamedParamsMacroTemplate)
-define SetupApiDocsGenerationBody
-
- # Figure out all modules, both specified and transitive, that will be processed
- # by javadoc.
- $1_TRANSITIVE_MODULES := $$(call FindTransitiveDepsForModules, $$($1_MODULES))
- $1_ALL_MODULES := $$(sort $$($1_MODULES) $$($1_TRANSITIVE_MODULES))
-
- ifeq ($$(ENABLE_FULL_DOCS), true)
- # Tell the ModuleGraph taglet to generate html links to soon-to-be-created
- # png files with module graphs.
- $1_JAVA_ARGS += -DenableModuleGraph=true
- endif
-
- # Always include tags and basic options
- $1_OPTIONS := $$(JAVADOC_TAGS) $$(JAVADOC_OPTIONS)
-
- $1_OPTIONS += -overview $$($1_OVERVIEW)
- $1_OPTIONS += --module-source-path $$(MODULES_SOURCE_PATH)
- $1_OPTIONS += --module $$(call CommaList, $$($1_MODULES))
-
- # Create a string like "-Xdoclint:all,-syntax,-html,..."
- $1_OPTIONS += -Xdoclint:all,$$(call CommaList, $$(addprefix -, \
- $$(JAVADOC_DISABLED_DOCLINT)))
-
- ifeq ($$($$DOCROOTPARENT_FLAG), TRUE)
- $1_OPTIONS += -Xdocrootparent $$(JAVADOC_BASE_URL)
- endif
-
- $1_OPTIONS += -doctitle '$$($1_DOC_TITLE)'
- $1_OPTIONS += -windowtitle '$$($1_WINDOW_TITLE)'
- $1_OPTIONS += -header '$$($1_HEADER_TITLE)'
- $1_OPTIONS += -bottom '$$($1_BOTTOM_TEXT)'
- ifeq ($$(IS_DRAFT), true)
- $1_OPTIONS += -top '$$($1_TOP_TEXT)'
- endif
-
- # Do not store debug level options in VARDEPS.
- ifneq ($$(LOG_LEVEL), trace)
- $1_LOG_OPTION += -quiet
- else
- $1_LOG_OPTION += -verbose
- endif
-
- $1_VARDEPS := $$($1_JAVA_ARGS) $$($1_OPTIONS) $$(MODULES_SOURCE_PATH) \
- $$($1_ALL_MODULES)
- $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \
- $$(SUPPORT_OUTPUTDIR)/docs/$1.vardeps)
-
- # Get a list of all files in all the source dirs for all included modules
- $1_SOURCE_DEPS := $$(call CacheFind, $$(wildcard $$(foreach module, \
- $$($1_ALL_MODULES), $$(call FindModuleSrcDirs, $$(module)))))
-
- # Javadoc creates a lot of files but use index.html as a marker
- $$($1_TARGET_DIR)/index.html: $$(BUILD_TOOLS_JDK) $$($1_VARDEPS_FILE) \
- $$($1_SOURCE_DEPS) $$($1_OVERVIEW)
- $$(call LogWarn, Generating $$($1_NAME) API javadoc for \
- $$(words $$($1_ALL_MODULES)) modules)
- $$(call LogInfo, Javadoc modules: $$($1_ALL_MODULES))
- $$(call MakeDir, $$($1_TARGET_DIR))
- $$(call ExecuteWithLog, $$(SUPPORT_OUTPUTDIR)/docs/$1, \
- $$(JAVA) -Djava.awt.headless=true $$($1_JAVA_ARGS) \
- $$(NEW_JAVADOC) -d $$($1_TARGET_DIR) \
- $$(JAVADOC_TAGS) $$($1_OPTIONS) $$($1_LOG_OPTION))
-
- $1_JAVADOC_TARGETS := $$($1_TARGET_DIR)/index.html
-
- ifeq ($$(ENABLE_FULL_DOCS), true)
- # We have asked ModuleGraph to generate links to png files. Now we must
- # produce the png files.
-
- # Locate which modules has the @moduleGraph tag in their module-info.java
- $1_MODULES_NEEDING_GRAPH := $$(strip $$(foreach m, $$($1_ALL_MODULES), \
- $$(if $$(shell $$(GREP) -e @moduleGraph \
- $$(wildcard $$(addsuffix /module-info.java, \
- $$(call FindModuleSrcDirs, $$m)))), \
- $$m) \
- ))
-
- # First we run the GenGraph tool. It will query the module structure of the
- # running JVM and output .dot files for all existing modules.
- GENGRAPHS_PROPS := \
- $$(JDK_TOPDIR)/make/src/classes/build/tools/jigsaw/javadoc-graphs.properties
-
- $1_GENGRAPHS_DIR := $$(SUPPORT_OUTPUTDIR)/docs/$1-gengraphs
- $1_GENGRAPHS_MARKER := $$($1_GENGRAPHS_DIR)/_gengraphs_run.marker
-
- $$($1_GENGRAPHS_MARKER): $$(BUILD_JIGSAW_TOOLS) $$(GENGRAPHS_PROPS)
- $$(call LogInfo, Running gengraphs for $$($1_NAME) API documentation)
- $$(call MakeDir, $$($1_GENGRAPHS_DIR))
- $$(call ExecuteWithLog, $$($1_GENGRAPHS_DIR)/gengraphs, \
- $$(TOOL_GENGRAPHS) --spec --output $$($1_GENGRAPHS_DIR) \
- --dot-attributes $$(GENGRAPHS_PROPS) && \
- $$(TOUCH) $$($1_GENGRAPHS_MARKER))
-
- # For each module needing a graph, create a png file from the dot file
- # generated by the GenGraphs tool and store it in the target dir.
- # They will depend on $1_GENGRAPHS_MARKER, and will be added to $1.
- $$(foreach m, $$($1_MODULES_NEEDING_GRAPH), \
- $$(eval $$(call setup_gengraph_dot_to_png,$1,$$m)) \
- )
- endif
-endef
-
-################################################################################
-# Setup generation of the JDK API documentation (javadoc + modulegraph)
-
-# All modules to have docs generated by docs-jdk-api target
-JDK_JAVADOC_MODULES := $(sort $(DOCS_MODULES))
-
-JDK_JAVADOC_OVERVIEW := $(JDK_TOPDIR)/src/java.base/share/classes/overview-core.html
-
-$(eval $(call SetupApiDocsGeneration, JDK_API, \
- MODULES := $(JDK_JAVADOC_MODULES), \
- NAME := JDK, \
- TARGET_DIR := $(JAVADOC_OUTPUTDIR)/api, \
- OVERVIEW := $(JDK_JAVADOC_OVERVIEW), \
- DOC_TITLE := $(JDK_JAVADOC_DOC_TITLE), \
- WINDOW_TITLE := $(JAVADOC_WINDOW_TITLE), \
- HEADER_TITLE := $(JAVADOC_HEADER_TITLE), \
- BOTTOM_TEXT := $(JAVADOC_BOTTOM), \
- TOP_TEXT := $(JAVADOC_TOP), \
-))
-
-# Targets generated are returned in JDK_API_JAVADOC_TARGETS and
-# JDK_API_MODULEGRAPH_TARGETS.
-
-################################################################################
-# Setup generation of the Java SE API documentation (javadoc + modulegraph)
-
-# The Java SE module scope is just java.se.ee and it's transitive modules.
-JAVASE_JAVADOC_MODULES := java.se.ee
-
-JAVASE_JAVADOC_OVERVIEW := $(JDK_TOPDIR)/src/java.base/share/classes/overview-core.html
-
-$(eval $(call SetupApiDocsGeneration, JAVASE_API, \
- MODULES := $(JAVASE_JAVADOC_MODULES), \
- NAME := Java SE, \
- TARGET_DIR := $(IMAGES_OUTPUTDIR)/javase-docs/api, \
- OVERVIEW := $(JAVASE_JAVADOC_OVERVIEW), \
- DOC_TITLE := $(JAVASE_JAVADOC_DOC_TITLE), \
- WINDOW_TITLE := $(JAVADOC_WINDOW_TITLE), \
- HEADER_TITLE := $(JAVADOC_HEADER_TITLE), \
- BOTTOM_TEXT := $(JAVADOC_BOTTOM), \
- TOP_TEXT := $(JAVADOC_TOP), \
-))
-
-# Targets generated are returned in JAVASE_API_JAVADOC_TARGETS and
-# JAVASE_API_MODULEGRAPH_TARGETS.
-
-################################################################################
-# Copy JDK specs files
-
-# For all html documentation in $module/share/specs directories, copy it
-# unmodified
-
-ALL_MODULES := $(call FindAllModules)
-COPY_SPEC_FILTER := %.html %.gif %.jpg %.mib %.css
-
-$(foreach m, $(ALL_MODULES), \
- $(eval SPECS_$m := $(call FindModuleSpecsDirs, $m)) \
- $(if $(SPECS_$m), \
- $(eval $(call SetupCopyFiles, COPY_$m, \
- SRC := $(SPECS_$m), \
- FILES := $(filter $(COPY_SPEC_FILTER), $(call CacheFind, $(SPECS_$m))), \
- DEST := $(JAVADOC_OUTPUTDIR)/specs/, \
- )) \
- $(eval JDK_SPECS_TARGETS += $(COPY_$m)) \
- ) \
-)
-
-# Copy the global resources
-GLOBAL_SPECS_RESOURCES_DIR := $(JDK_TOPDIR)/make/data/docs-resources/specs
-$(eval $(call SetupCopyFiles, COPY_GLOBAL_RESOURCES, \
- SRC := $(GLOBAL_SPECS_RESOURCES_DIR), \
- FILES := $(call CacheFind, $(GLOBAL_SPECS_RESOURCES_DIR)), \
- DEST := $(JAVADOC_OUTPUTDIR)/specs/, \
-))
-JDK_SPECS_TARGETS += $(COPY_GLOBAL_RESOURCES)
-
-ifeq ($(ENABLE_FULL_DOCS), true)
- # For all markdown files in $module/share/specs directories, convert them to
- # html.
-
- GLOBAL_SPECS_DEFAULT_CSS_FILE := $(JAVADOC_OUTPUTDIR)/specs/resources/jdk-default.css
-
- $(foreach m, $(ALL_MODULES), \
- $(eval SPECS_$m := $(call FindModuleSpecsDirs, $m)) \
- $(foreach d, $(SPECS_$m), \
- $(if $(filter %.md, $(call CacheFind, $d)), \
- $(eval $(call SetupProcessMarkdown, CONVERT_MARKDOWN_$m_$(patsubst $(TOPDIR)/%,%,$d), \
- SRC := $d, \
- FILES := $(filter %.md, $(call CacheFind, $d)), \
- DEST := $(JAVADOC_OUTPUTDIR)/specs/, \
- CSS := $(GLOBAL_SPECS_DEFAULT_CSS_FILE), \
- )) \
- ) \
- $(eval JDK_SPECS_TARGETS += $(CONVERT_MARKDOWN_$m_$(patsubst $(TOPDIR)/%,%,$d))) \
- ) \
- )
-endif
-
-# Special treatment for generated documentation
-
-JDWP_PROTOCOL := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/jdwp-protocol.html
-$(eval $(call SetupCopyFiles, COPY_JDWP_PROTOCOL, \
- FILES := $(JDWP_PROTOCOL), \
- DEST := $(JAVADOC_OUTPUTDIR)/specs/jdwp, \
-))
-JDK_SPECS_TARGETS += $(COPY_JDWP_PROTOCOL)
-
-# Get jvmti.html from the main jvm variant (all variants' jvmti.html are identical).
-JVMTI_HTML := $(HOTSPOT_OUTPUTDIR)/variant-$(JVM_VARIANT_MAIN)/gensrc/jvmtifiles/jvmti.html
-$(eval $(call SetupCopyFiles, COPY_JVMTI_HTML, \
- FILES := $(JVMTI_HTML), \
- DEST := $(JAVADOC_OUTPUTDIR)/specs, \
-))
-JDK_SPECS_TARGETS += $(COPY_JVMTI_HTML)
-
-################################################################################
-# Optional target which bundles all generated javadocs into a zip archive.
-
-JAVADOC_ZIP_NAME := jdk-$(VERSION_STRING)-docs.zip
-JAVADOC_ZIP_FILE := $(OUTPUT_ROOT)/bundles/$(JAVADOC_ZIP_NAME)
-
-$(eval $(call SetupZipArchive, BUILD_JAVADOC_ZIP, \
- SRC := $(JAVADOC_OUTPUTDIR), \
- ZIP := $(JAVADOC_ZIP_FILE), \
- EXTRA_DEPS := $(JDK_API_JAVADOC_TARGETS) $(JDK_API_MODULEGRAPH_TARGETS) \
- $(JDK_SPECS_TARGETS), \
-))
-
-ZIP_TARGETS += $(BUILD_JAVADOC_ZIP)
-
-################################################################################
-
-docs-jdk-api-javadoc: $(JDK_API_JAVADOC_TARGETS)
-
-docs-jdk-api-modulegraph: $(JDK_API_MODULEGRAPH_TARGETS)
-
-docs-javase-api-javadoc: $(JAVASE_API_JAVADOC_TARGETS)
-
-docs-javase-api-modulegraph: $(JAVASE_API_MODULEGRAPH_TARGETS)
-
-docs-jdk-specs: $(JDK_SPECS_TARGETS)
-
-docs-zip: $(ZIP_TARGETS)
-
-all: docs-jdk-api-javadoc docs-jdk-api-modulegraph docs-javase-api-javadoc \
- docs-javase-api-modulegraph docs-jdk-specs docs-zip
-
-.PHONY: default all docs-jdk-api-javadoc docs-jdk-api-modulegraph \
- docs-javase-api-javadoc docs-javase-api-modulegraph docs-jdk-specs docs-zip
--- a/make/Main.gmk Mon May 22 09:34:38 2017 -0700
+++ b/make/Main.gmk Thu May 25 09:15:55 2017 -0700
@@ -277,7 +277,10 @@
demos-jdk:
+($(CD) $(JDK_TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f CompileDemos.gmk)
-ALL_TARGETS += demos-jdk
+test-image-demos-jdk:
+ +($(CD) $(JDK_TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f CompileDemos.gmk images)
+
+ALL_TARGETS += demos-jdk test-image-demos-jdk
################################################################################
# Jigsaw specific data and analysis targets.
@@ -363,29 +366,32 @@
# If building full docs, to complete docs-*-api we need both the javadoc and
# modulegraph targets.
docs-jdk-api-javadoc:
- +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-jdk-api-javadoc)
+ +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-jdk-api-javadoc)
docs-jdk-api-modulegraph:
- +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-jdk-api-modulegraph)
+ +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-jdk-api-modulegraph)
docs-javase-api-javadoc:
- +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-javase-api-javadoc)
+ +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-javase-api-javadoc)
docs-javase-api-modulegraph:
- +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-javase-api-modulegraph)
+ +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-javase-api-modulegraph)
docs-jdk-specs:
- +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-jdk-specs)
+ +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-jdk-specs)
+
+docs-jdk-index:
+ +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-jdk-index)
docs-zip:
- +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-zip)
+ +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-zip)
update-build-docs:
+($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f UpdateBuildDocs.gmk)
ALL_TARGETS += docs-jdk-api-javadoc docs-jdk-api-modulegraph \
docs-javase-api-javadoc docs-javase-api-modulegraph docs-jdk-specs \
- docs-zip update-build-docs
+ docs-jdk-index docs-zip update-build-docs
################################################################################
# Cross compilation support
@@ -631,6 +637,7 @@
# jdk libs, even though they don't need to. To avoid warnings, make sure they
# aren't built until after libjava and libjvm are available to link to.
demos-jdk: java.base-libs exploded-image-optimize
+ test-image-demos-jdk: demos-jdk
# Declare dependency from <module>-java to <module>-gensrc
$(foreach m, $(GENSRC_MODULES), $(eval $m-java: $m-gensrc))
@@ -793,6 +800,8 @@
# The gensrc steps for hotspot and jdk.jdi create html spec files.
docs-jdk-specs: hotspot-$(JVM_VARIANT_MAIN)-gensrc jdk.jdi-gensrc
+ docs-jdk-index: exploded-image buildtools-modules
+
docs-zip: docs-jdk
test: jdk-image test-image
@@ -922,7 +931,7 @@
docs-javase-api: docs-javase-api-modulegraph
endif
-docs-jdk: docs-jdk-api docs-jdk-specs
+docs-jdk: docs-jdk-api docs-jdk-specs docs-jdk-index
docs-javase: docs-javase-api
# alias for backwards compatibility
@@ -963,7 +972,8 @@
# This target builds the test image
test-image: prepare-test-image test-image-hotspot-jtreg-native \
- test-image-jdk-jtreg-native test-image-failure-handler test-image-hotspot-gtest
+ test-image-jdk-jtreg-native test-image-failure-handler test-image-hotspot-gtest \
+ test-image-demos-jdk
# all-images builds all our deliverables as images.
all-images: product-images test-image docs-image
--- a/make/RunTests.gmk Mon May 22 09:34:38 2017 -0700
+++ b/make/RunTests.gmk Thu May 25 09:15:55 2017 -0700
@@ -299,6 +299,12 @@
$1_TEST_NAME := $$(strip $$(patsubst jtreg:%, %, $$($1_TEST)))
$1_COMPONENT := $$(firstword $$(subst /, $$(SPACE), $$($1_TEST_NAME)))
+ ifeq ($$(JT_HOME), )
+ $$(info Error: jtreg framework is not found.)
+ $$(info Please run configure using --with-jtreg.)
+ $$(error Cannot continue)
+ endif
+
# Unfortunately, we need different defaults for some JTREG values,
# depending on what component we're running.
--- a/make/common/Modules.gmk Mon May 22 09:34:38 2017 -0700
+++ b/make/common/Modules.gmk Thu May 25 09:15:55 2017 -0700
@@ -391,7 +391,10 @@
else ifeq ($$(classloader), ext)
PLATFORM_MODULES += $1
endif
- DOCS_MODULES += $1
+ ifneq ($$(include_in_docs), false)
+ # defaults to true if unspecified
+ DOCS_MODULES += $1
+ endif
else
# Default to include in all
JRE_MODULES += $1
--- a/nashorn/.hgtags Mon May 22 09:34:38 2017 -0700
+++ b/nashorn/.hgtags Thu May 25 09:15:55 2017 -0700
@@ -410,3 +410,6 @@
e118c818dbf84d15191414c453b77c089116fdc0 jdk-9+167
0f81cde5a1f75786f381dbfb59b9afbab70174c7 jdk-9+168
131e250080158e57ce45130560f5f987b92642b5 jdk-9+169
+550bfc15779f8f339610793867fdc251125811b5 jdk-9+170
+7e9cb37e6d6edbe56fdf4d510e5110f797823f09 jdk-10+7
+edb825e2dfb140c8e57a61b5d45de19edebccccf jdk-10+8
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ForOfLoopTree.java Mon May 22 09:34:38 2017 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ForOfLoopTree.java Thu May 25 09:15:55 2017 -0700
@@ -38,7 +38,7 @@
*/
public interface ForOfLoopTree extends LoopTree {
/**
- * The for..in left hand side expression.
+ * The for..of left hand side expression.
*
* @return the left hand side expression
*/
@@ -52,7 +52,7 @@
ExpressionTree getExpression();
/**
- * The statement contained in this for..in statement.
+ * The statement contained in this for..of statement.
*
* @return the statement
*/
--- a/test/lib/RedefineClassHelper.java Mon May 22 09:34:38 2017 -0700
+++ b/test/lib/RedefineClassHelper.java Thu May 25 09:15:55 2017 -0700
@@ -23,7 +23,7 @@
import java.io.PrintWriter;
import java.lang.instrument.*;
-import jdk.test.lib.InMemoryJavaCompiler;
+import jdk.test.lib.compiler.InMemoryJavaCompiler;
/*
* Helper class to write tests that redefine classes.
--- a/test/lib/jdk/test/lib/DynamicVMOption.java Mon May 22 09:34:38 2017 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2014, 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 jdk.test.lib;
-
-import com.sun.management.HotSpotDiagnosticMXBean;
-import java.lang.management.ManagementFactory;
-
-/**
- * A utility class to work with VM options which could be altered during
- * execution.
- *
- * This class is a wrapper around {@code com.sun.management.VMOption}.
- * It provides more convenient interface to read/write the values.
- *
- */
-public class DynamicVMOption {
-
- private final HotSpotDiagnosticMXBean mxBean;
-
- /**
- * VM option name, like "MinHeapFreeRatio".
- */
- public final String name;
-
- /**
- * Creates an instance of DynamicVMOption.
- *
- * @param name the VM option name
- */
- public DynamicVMOption(String name) {
- this.name = name;
- mxBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
- }
-
- /**
- * Sets a new value for the option.
- * Trying to set not applicable value will cause IllegalArgumentException.
- * Behavior with null is undefined, most likely NPE will be thrown.
- *
- * @param newValue the value to be set
- * @see #getValue()
- * @throws IllegalArgumentException if newValue is not applicable to the option
- */
- public final void setValue(String newValue) {
- mxBean.setVMOption(name, newValue);
- }
-
- /**
- * Returns the value of option.
- *
- * @return the current option value
- * @see #setValue(java.lang.String)
- */
- public final String getValue() {
- return mxBean.getVMOption(name).getValue();
- }
-
- /**
- * Returns true, if option is writable, false otherwise.
- *
- * @return true, if option is writable, false otherwise
- */
- public final boolean isWriteable() {
- return mxBean.getVMOption(name).isWriteable();
- }
-
- /**
- * Checks if the given value is applicable for the option.
- *
- * This method tries to set the option to the new value. If no exception
- * has been thrown the value is treated as valid.
- *
- * Calling this method will not change the option value. After an attempt
- * to set a new value, the option will be restored to its previous value.
- *
- * @param value the value to verify
- * @return true if option could be set to the given value
- */
- public boolean isValidValue(String value) {
- boolean isValid = true;
- String oldValue = getValue();
- try {
- setValue(value);
- } catch (NullPointerException e) {
- if (value == null) {
- isValid = false;
- }
- } catch (IllegalArgumentException e) {
- isValid = false;
- } finally {
- setValue(oldValue);
- }
- return isValid;
- }
-
- /**
- * Returns the value of the given VM option as String.
- *
- * This is a simple shortcut for {@code new DynamicVMOption(name).getValue()}
- *
- * @param name the name of VM option
- * @return value as a string
- * @see #getValue()
- */
- public static String getString(String name) {
- return new DynamicVMOption(name).getValue();
- }
-
- /**
- * Returns the value of the given option as int.
- *
- * @param name the name of VM option
- * @return value parsed as integer
- * @see #getString(java.lang.String)
- *
- */
- public static int getInt(String name) {
- return Integer.parseInt(getString(name));
- }
-
- /**
- * Sets the VM option to a new value.
- *
- * This is a simple shortcut for {@code new DynamicVMOption(name).setValue(value)}
- *
- * @param name the name of VM option
- * @param value the value to be set
- * @see #setValue(java.lang.String)
- */
- public static void setString(String name, String value) {
- new DynamicVMOption(name).setValue(value);
- }
-
- /**
- * Sets the VM option value to a new integer value.
- *
- * @param name the name of VM option
- * @param value the integer value to be set
- * @see #setString(java.lang.String, java.lang.String)
- */
- public static void setInt(String name, int value) {
- new DynamicVMOption(name).setValue(Integer.toString(value));
- }
-
-}
--- a/test/lib/jdk/test/lib/InMemoryJavaCompiler.java Mon May 22 09:34:38 2017 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,200 +0,0 @@
-/*
- * Copyright (c) 2013, 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 jdk.test.lib;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.tools.ForwardingJavaFileManager;
-import javax.tools.FileObject;
-import javax.tools.JavaCompiler;
-import javax.tools.JavaCompiler.CompilationTask;
-import javax.tools.JavaFileObject;
-import javax.tools.JavaFileObject.Kind;
-import javax.tools.SimpleJavaFileObject;
-import javax.tools.StandardLocation;
-import javax.tools.ToolProvider;
-
-/**
- * {@code InMemoryJavaCompiler} can be used for compiling a {@link
- * CharSequence} to a {@code byte[]}.
- *
- * The compiler will not use the file system at all, instead using a {@link
- * ByteArrayOutputStream} for storing the byte code. For the source code, any
- * kind of {@link CharSequence} can be used, e.g. {@link String}, {@link
- * StringBuffer} or {@link StringBuilder}.
- *
- * The {@code InMemoryCompiler} can easily be used together with a {@code
- * ByteClassLoader} to easily compile and load source code in a {@link String}:
- *
- * <pre>
- * {@code
- * import jdk.test.lib.InMemoryJavaCompiler;
- * import jdk.test.lib.ByteClassLoader;
- *
- * class Example {
- * public static void main(String[] args) {
- * String className = "Foo";
- * String sourceCode = "public class " + className + " {" +
- * " public void bar() {" +
- * " System.out.println("Hello from bar!");" +
- * " }" +
- * "}";
- * byte[] byteCode = InMemoryJavaCompiler.compile(className, sourceCode);
- * Class fooClass = ByteClassLoader.load(className, byteCode);
- * }
- * }
- * }
- * </pre>
- */
-public class InMemoryJavaCompiler {
- private static class MemoryJavaFileObject extends SimpleJavaFileObject {
- private final String className;
- private final CharSequence sourceCode;
- private final ByteArrayOutputStream byteCode;
-
- public MemoryJavaFileObject(String className, CharSequence sourceCode) {
- super(URI.create("string:///" + className.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
- this.className = className;
- this.sourceCode = sourceCode;
- this.byteCode = new ByteArrayOutputStream();
- }
-
- @Override
- public CharSequence getCharContent(boolean ignoreEncodingErrors) {
- return sourceCode;
- }
-
- @Override
- public OutputStream openOutputStream() throws IOException {
- return byteCode;
- }
-
- public byte[] getByteCode() {
- return byteCode.toByteArray();
- }
-
- public String getClassName() {
- return className;
- }
- }
-
- private static class FileManagerWrapper extends ForwardingJavaFileManager {
- private static final Location PATCH_LOCATION = new Location() {
- @Override
- public String getName() {
- return "patch module location";
- }
-
- @Override
- public boolean isOutputLocation() {
- return false;
- }
- };
- private final MemoryJavaFileObject file;
- private final String moduleOverride;
-
- public FileManagerWrapper(MemoryJavaFileObject file, String moduleOverride) {
- super(getCompiler().getStandardFileManager(null, null, null));
- this.file = file;
- this.moduleOverride = moduleOverride;
- }
-
- @Override
- public JavaFileObject getJavaFileForOutput(Location location, String className,
- Kind kind, FileObject sibling)
- throws IOException {
- if (!file.getClassName().equals(className)) {
- throw new IOException("Expected class with name " + file.getClassName() +
- ", but got " + className);
- }
- return file;
- }
-
- @Override
- public Location getLocationForModule(Location location, JavaFileObject fo) throws IOException {
- if (fo == file && moduleOverride != null) {
- return PATCH_LOCATION;
- }
- return super.getLocationForModule(location, fo);
- }
-
- @Override
- public String inferModuleName(Location location) throws IOException {
- if (location == PATCH_LOCATION) {
- return moduleOverride;
- }
- return super.inferModuleName(location);
- }
-
- @Override
- public boolean hasLocation(Location location) {
- return super.hasLocation(location) || location == StandardLocation.PATCH_MODULE_PATH;
- }
-
- }
-
- /**
- * Compiles the class with the given name and source code.
- *
- * @param className The name of the class
- * @param sourceCode The source code for the class with name {@code className}
- * @param options additional command line options
- * @throws RuntimeException if the compilation did not succeed
- * @return The resulting byte code from the compilation
- */
- public static byte[] compile(String className, CharSequence sourceCode, String... options) {
- MemoryJavaFileObject file = new MemoryJavaFileObject(className, sourceCode);
- CompilationTask task = getCompilationTask(file, options);
-
- if(!task.call()) {
- throw new RuntimeException("Could not compile " + className + " with source code " + sourceCode);
- }
-
- return file.getByteCode();
- }
-
- private static JavaCompiler getCompiler() {
- return ToolProvider.getSystemJavaCompiler();
- }
-
- private static CompilationTask getCompilationTask(MemoryJavaFileObject file, String... options) {
- List<String> opts = new ArrayList<>();
- String moduleOverride = null;
- for (String opt : options) {
- if (opt.startsWith("-Xmodule:")) {
- moduleOverride = opt.substring("-Xmodule:".length());
- } else {
- opts.add(opt);
- }
- }
- return getCompiler().getTask(null, new FileManagerWrapper(file, moduleOverride), null, opts, null, Arrays.asList(file));
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/jdk/test/lib/LockFreeLogger.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,84 @@
+/*
+ * 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
+ * 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 jdk.test.lib;
+
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * A logger designed specifically to allow collecting ordered log messages
+ * in a multi-threaded environment without involving any kind of locking.
+ * <p>
+ * It is particularly useful in situations when one needs to assert various
+ * details about the tested thread state or the locks it hold while also wanting
+ * to produce diagnostic log messages.
+ * <p>
+ * The logger does not provide any guarantees about the completness of the
+ * logs written from different threads - it is up to the caller to make sure
+ * {@code toString()} method is called only when all the activity has ceased
+ * and the per-thread logs contain all the necessary data.
+ *
+ * @author Jaroslav Bachorik
+ **/
+public class LockFreeLogger {
+ private final AtomicInteger logCntr = new AtomicInteger(0);
+ private final Collection<Map<Integer, String>> allRecords = new ConcurrentLinkedQueue<>();
+ private final ThreadLocal<Map<Integer, String>> records = ThreadLocal.withInitial(ConcurrentHashMap::new);
+
+ public LockFreeLogger() {
+ allRecords.add(records.get());
+ }
+
+ /**
+ * Log a message
+ * @param format Message format
+ * @param params Message parameters
+ */
+ public void log(String format, Object ... params) {
+ int id = logCntr.getAndIncrement();
+ records.get().put(id, String.format(format, params));
+ }
+
+ /**
+ * Will generate an aggregated log of chronologically ordered messages.
+ * <p>
+ * Make sure that you call this method only when all the related threads
+ * have finished; otherwise you might get incomplete data.
+ *
+ * @return An aggregated log of chronologically ordered messages
+ */
+ @Override
+ public String toString() {
+ return allRecords.stream()
+ .flatMap(m -> m.entrySet().stream())
+ .sorted(Comparator.comparing(Map.Entry::getKey))
+ .map(Map.Entry::getValue)
+ .collect(Collectors.joining());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/jdk/test/lib/NetworkConfiguration.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,272 @@
+/*
+ * 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 jdk.test.lib;
+
+import java.io.PrintStream;
+import java.io.UncheckedIOException;
+import java.io.IOException;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import static java.net.NetworkInterface.getNetworkInterfaces;
+import static java.util.Collections.list;
+
+/**
+ * Helper class for retrieving network interfaces and local addresses
+ * suitable for testing.
+ */
+public class NetworkConfiguration {
+
+ private Map<NetworkInterface,List<Inet4Address>> ip4Interfaces;
+ private Map<NetworkInterface,List<Inet6Address>> ip6Interfaces;
+
+ private NetworkConfiguration(
+ Map<NetworkInterface,List<Inet4Address>> ip4Interfaces,
+ Map<NetworkInterface,List<Inet6Address>> ip6Interfaces) {
+ this.ip4Interfaces = ip4Interfaces;
+ this.ip6Interfaces = ip6Interfaces;
+ }
+
+ /**
+ * Returns a stream of interfaces suitable for functional tests.
+ */
+ public Stream<NetworkInterface> interfaces() {
+ return Stream.concat(ip4Interfaces(), ip6Interfaces())
+ .distinct();
+ }
+
+ /**
+ * Returns a stream of interfaces suitable for IPv4 functional tests.
+ */
+ public Stream<NetworkInterface> ip4Interfaces() {
+ return ip4Interfaces.keySet()
+ .stream()
+ .filter(NetworkConfiguration::isNotExcludedInterface)
+ .filter(hasIp4Addresses);
+ }
+
+ /**
+ * Returns a stream of interfaces suitable for IPv6 functional tests.
+ */
+ public Stream<NetworkInterface> ip6Interfaces() {
+ return ip6Interfaces.keySet()
+ .stream()
+ .filter(NetworkConfiguration::isNotExcludedInterface)
+ .filter(hasIp6Addresses);
+ }
+
+ private static boolean isNotExcludedInterface(NetworkInterface nif) {
+ if (Platform.isOSX() && nif.getName().contains("awdl")) {
+ return false;
+ }
+ String dName = nif.getDisplayName();
+ if (Platform.isWindows() && dName != null && dName.contains("Teredo")) {
+ return false;
+ }
+ return true;
+ }
+
+ private final Predicate<NetworkInterface> hasIp4Addresses = nif ->
+ ip4Interfaces.get(nif).stream().anyMatch(a -> !a.isAnyLocalAddress());
+
+ private final Predicate<NetworkInterface> hasIp6Addresses = nif ->
+ ip6Interfaces.get(nif).stream().anyMatch(a -> !a.isAnyLocalAddress());
+
+
+ /**
+ * Returns a stream of interfaces suitable for IPv4 multicast tests.
+ */
+ public Stream<NetworkInterface> ip4MulticastInterfaces() {
+ return ip4Interfaces().filter(supportsIp4Multicast);
+ }
+
+ /**
+ * Returns a stream of interfaces suitable for IPv6 multicast tests.
+ */
+ public Stream<NetworkInterface> ip6MulticastInterfaces() {
+ return ip6Interfaces().filter(supportsIp6Multicast);
+ }
+
+ private final Predicate<NetworkInterface> supportsIp4Multicast = nif -> {
+ try {
+ if (!nif.supportsMulticast() || nif.isLoopback()) {
+ return false;
+ }
+ return hasIp4Addresses.test(nif);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ };
+
+ private final Predicate<NetworkInterface> supportsIp6Multicast = nif -> {
+ try {
+ if (!nif.supportsMulticast() || nif.isLoopback()) {
+ return false;
+ }
+
+ return hasIp6Addresses.test(nif);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ };
+
+ /**
+ * Returns all addresses on all "functional" interfaces.
+ */
+ public Stream<InetAddress> addresses(NetworkInterface nif) {
+ return Stream.concat(ip4Interfaces.get(nif).stream(),
+ ip6Interfaces.get(nif).stream());
+ }
+
+ /**
+ * Returns all IPv4 addresses on all "functional" interfaces.
+ */
+ public Stream<Inet4Address> ip4Addresses() {
+ return ip4Interfaces().flatMap(this::ip4Addresses);
+ }
+
+ /**
+ * Returns all IPv6 addresses on all "functional" interfaces.
+ */
+ public Stream<Inet6Address> ip6Addresses() {
+ return ip6Interfaces().flatMap(this::ip6Addresses);
+ }
+
+ /**
+ * Returns all IPv4 addresses the given interface.
+ */
+ public Stream<Inet4Address> ip4Addresses(NetworkInterface nif) {
+ return ip4Interfaces.get(nif).stream();
+ }
+
+ /**
+ * Returns all IPv6 addresses for the given interface.
+ */
+ public Stream<Inet6Address> ip6Addresses(NetworkInterface nif) {
+ return ip6Interfaces.get(nif).stream();
+ }
+
+ /**
+ * Return a NetworkConfiguration instance.
+ */
+ public static NetworkConfiguration probe() throws IOException {
+ Map<NetworkInterface, List<Inet4Address>> ip4Interfaces = new HashMap<>();
+ Map<NetworkInterface, List<Inet6Address>> ip6Interfaces = new HashMap<>();
+
+ List<NetworkInterface> nifs = list(getNetworkInterfaces());
+ for (NetworkInterface nif : nifs) {
+ // ignore interfaces that are down
+ if (!nif.isUp() || nif.isPointToPoint()) {
+ continue;
+ }
+
+ List<Inet4Address> ip4Addresses = new LinkedList<>();
+ List<Inet6Address> ip6Addresses = new LinkedList<>();
+ ip4Interfaces.put(nif, ip4Addresses);
+ ip6Interfaces.put(nif, ip6Addresses);
+ for (InetAddress addr : list(nif.getInetAddresses())) {
+ if (addr instanceof Inet4Address) {
+ ip4Addresses.add((Inet4Address) addr);
+ } else if (addr instanceof Inet6Address) {
+ ip6Addresses.add((Inet6Address) addr);
+ }
+ }
+ }
+ return new NetworkConfiguration(ip4Interfaces, ip6Interfaces);
+ }
+
+ @Override
+ public String toString() {
+ return interfaces().map(NetworkConfiguration::interfaceInformation)
+ .collect(Collectors.joining());
+ }
+
+ /** Returns detailed information for the given interface. */
+ public static String interfaceInformation(NetworkInterface nif) {
+ StringBuilder sb = new StringBuilder();
+ try {
+ sb.append("Display name: ")
+ .append(nif.getDisplayName())
+ .append("\n");
+ sb.append("Name: ")
+ .append(nif.getName())
+ .append("\n");
+ for (InetAddress inetAddress : list(nif.getInetAddresses())) {
+ sb.append("InetAddress: ")
+ .append(inetAddress)
+ .append("\n");
+ }
+ sb.append("Up? ")
+ .append(nif.isUp())
+ .append("\n");
+ sb.append("Loopback? ")
+ .append(nif.isLoopback())
+ .append("\n");
+ sb.append("PointToPoint? ")
+ .append(nif.isPointToPoint())
+ .append("\n");
+ sb.append("Supports multicast? ")
+ .append(nif.supportsMulticast())
+ .append("\n");
+ sb.append("Virtual? ")
+ .append(nif.isVirtual())
+ .append("\n");
+ sb.append("Hardware address: ")
+ .append(Arrays.toString(nif.getHardwareAddress()))
+ .append("\n");
+ sb.append("MTU: ")
+ .append(nif.getMTU())
+ .append("\n");
+ sb.append("Index: ")
+ .append(nif.getIndex())
+ .append("\n");
+ sb.append("\n");
+ return sb.toString();
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+
+ /** Prints all the system interface information to the give stream. */
+ public static void printSystemConfiguration(PrintStream out) {
+ try {
+ out.println("*** all system network interface configuration ***");
+ for (NetworkInterface nif : list(getNetworkInterfaces())) {
+ out.print(interfaceInformation(nif));
+ }
+ out.println("*** end ***");
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/jdk/test/lib/classloader/FilterClassLoader.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,50 @@
+/*
+ * 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
+ * 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 jdk.test.lib.classloader;
+
+import java.util.function.Predicate;
+/**
+ * A classloader, which using target classloader in case provided condition
+ * for class name is met, and using parent otherwise
+ */
+public class FilterClassLoader extends ClassLoader {
+
+ private final ClassLoader target;
+ private final Predicate<String> condition;
+
+ public FilterClassLoader(ClassLoader target, ClassLoader parent,
+ Predicate<String> condition) {
+ super(parent);
+ this.condition = condition;
+ this.target = target;
+ }
+
+ @Override
+ public Class<?> loadClass(String name) throws ClassNotFoundException {
+ if (condition.test(name)) {
+ return target.loadClass(name);
+ }
+ return super.loadClass(name);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/jdk/test/lib/classloader/ParentLastURLClassLoader.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,51 @@
+/*
+ * 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
+ * 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 jdk.test.lib.classloader;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+
+/**
+ * An url classloader, which trying to load class from provided URL[] first,
+ * and using parent classloader in case it failed
+ */
+public class ParentLastURLClassLoader extends URLClassLoader {
+
+ public ParentLastURLClassLoader(URL urls[], ClassLoader parent) {
+ super(urls, parent);
+ }
+
+ @Override
+ public Class<?> loadClass(String name) throws ClassNotFoundException {
+ try {
+ Class<?> c = findClass(name);
+ if (c != null) {
+ return c;
+ }
+ } catch (ClassNotFoundException e) {
+ // ignore
+ }
+ return super.loadClass(name);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/jdk/test/lib/compiler/InMemoryJavaCompiler.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2013, 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 jdk.test.lib.compiler;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.tools.ForwardingJavaFileManager;
+import javax.tools.FileObject;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaCompiler.CompilationTask;
+import javax.tools.JavaFileObject;
+import javax.tools.JavaFileObject.Kind;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.StandardLocation;
+import javax.tools.ToolProvider;
+
+/**
+ * {@code InMemoryJavaCompiler} can be used for compiling a {@link
+ * CharSequence} to a {@code byte[]}.
+ *
+ * The compiler will not use the file system at all, instead using a {@link
+ * ByteArrayOutputStream} for storing the byte code. For the source code, any
+ * kind of {@link CharSequence} can be used, e.g. {@link String}, {@link
+ * StringBuffer} or {@link StringBuilder}.
+ *
+ * The {@code InMemoryCompiler} can easily be used together with a {@code
+ * ByteClassLoader} to easily compile and load source code in a {@link String}:
+ *
+ * <pre>
+ * {@code
+ * import jdk.test.lib.compiler.InMemoryJavaCompiler;
+ * import jdk.test.lib.ByteClassLoader;
+ *
+ * class Example {
+ * public static void main(String[] args) {
+ * String className = "Foo";
+ * String sourceCode = "public class " + className + " {" +
+ * " public void bar() {" +
+ * " System.out.println("Hello from bar!");" +
+ * " }" +
+ * "}";
+ * byte[] byteCode = InMemoryJavaCompiler.compile(className, sourceCode);
+ * Class fooClass = ByteClassLoader.load(className, byteCode);
+ * }
+ * }
+ * }
+ * </pre>
+ */
+public class InMemoryJavaCompiler {
+ private static class MemoryJavaFileObject extends SimpleJavaFileObject {
+ private final String className;
+ private final CharSequence sourceCode;
+ private final ByteArrayOutputStream byteCode;
+
+ public MemoryJavaFileObject(String className, CharSequence sourceCode) {
+ super(URI.create("string:///" + className.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
+ this.className = className;
+ this.sourceCode = sourceCode;
+ this.byteCode = new ByteArrayOutputStream();
+ }
+
+ @Override
+ public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+ return sourceCode;
+ }
+
+ @Override
+ public OutputStream openOutputStream() throws IOException {
+ return byteCode;
+ }
+
+ public byte[] getByteCode() {
+ return byteCode.toByteArray();
+ }
+
+ public String getClassName() {
+ return className;
+ }
+ }
+
+ private static class FileManagerWrapper extends ForwardingJavaFileManager {
+ private static final Location PATCH_LOCATION = new Location() {
+ @Override
+ public String getName() {
+ return "patch module location";
+ }
+
+ @Override
+ public boolean isOutputLocation() {
+ return false;
+ }
+ };
+ private final MemoryJavaFileObject file;
+ private final String moduleOverride;
+
+ public FileManagerWrapper(MemoryJavaFileObject file, String moduleOverride) {
+ super(getCompiler().getStandardFileManager(null, null, null));
+ this.file = file;
+ this.moduleOverride = moduleOverride;
+ }
+
+ @Override
+ public JavaFileObject getJavaFileForOutput(Location location, String className,
+ Kind kind, FileObject sibling)
+ throws IOException {
+ if (!file.getClassName().equals(className)) {
+ throw new IOException("Expected class with name " + file.getClassName() +
+ ", but got " + className);
+ }
+ return file;
+ }
+
+ @Override
+ public Location getLocationForModule(Location location, JavaFileObject fo) throws IOException {
+ if (fo == file && moduleOverride != null) {
+ return PATCH_LOCATION;
+ }
+ return super.getLocationForModule(location, fo);
+ }
+
+ @Override
+ public String inferModuleName(Location location) throws IOException {
+ if (location == PATCH_LOCATION) {
+ return moduleOverride;
+ }
+ return super.inferModuleName(location);
+ }
+
+ @Override
+ public boolean hasLocation(Location location) {
+ return super.hasLocation(location) || location == StandardLocation.PATCH_MODULE_PATH;
+ }
+
+ }
+
+ /**
+ * Compiles the class with the given name and source code.
+ *
+ * @param className The name of the class
+ * @param sourceCode The source code for the class with name {@code className}
+ * @param options additional command line options
+ * @throws RuntimeException if the compilation did not succeed
+ * @return The resulting byte code from the compilation
+ */
+ public static byte[] compile(String className, CharSequence sourceCode, String... options) {
+ MemoryJavaFileObject file = new MemoryJavaFileObject(className, sourceCode);
+ CompilationTask task = getCompilationTask(file, options);
+
+ if(!task.call()) {
+ throw new RuntimeException("Could not compile " + className + " with source code " + sourceCode);
+ }
+
+ return file.getByteCode();
+ }
+
+ private static JavaCompiler getCompiler() {
+ return ToolProvider.getSystemJavaCompiler();
+ }
+
+ private static CompilationTask getCompilationTask(MemoryJavaFileObject file, String... options) {
+ List<String> opts = new ArrayList<>();
+ String moduleOverride = null;
+ for (String opt : options) {
+ if (opt.startsWith("-Xmodule:")) {
+ moduleOverride = opt.substring("-Xmodule:".length());
+ } else {
+ opts.add(opt);
+ }
+ }
+ return getCompiler().getTask(null, new FileManagerWrapper(file, moduleOverride), null, opts, null, Arrays.asList(file));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/jdk/test/lib/compiler/ModuleInfoMaker.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,129 @@
+/*
+ * 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 jdk.test.lib.compiler;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+/**
+ * Utility class for creating test modules.
+ */
+public class ModuleInfoMaker {
+ private static final String MODULE_INFO_JAVA = "module-info.java";
+ private static final Pattern MODULE_PATTERN =
+ Pattern.compile("module\\s+((?:\\w+\\.)*)");
+ private static final Pattern PACKAGE_PATTERN =
+ Pattern.compile("package\\s+(((?:\\w+\\.)*)(?:\\w+))");
+ private static final Pattern CLASS_PATTERN =
+ Pattern.compile("(?:public\\s+)?(?:class|enum|interface)\\s+(\\w+)");
+
+ private final Path dir;
+
+ public ModuleInfoMaker(Path dir) {
+ this.dir = dir;
+ }
+
+ /**
+ * Create java source files of the given module
+ */
+ public void writeJavaFiles(String module, String moduleInfoJava, String... contents)
+ throws IOException
+ {
+ Path msrc = dir.resolve(module);
+ new JavaSource(moduleInfoJava).write(msrc);
+ for (String c : contents) {
+ new JavaSource(c).write(msrc);
+ }
+ }
+
+ /**
+ * Compile the module to the given destination.
+ */
+ public void compile(String module, Path dest, String... options)
+ throws IOException
+ {
+ Path msrc = dir.resolve(module);
+ String[] args =
+ Stream.concat(Arrays.stream(options),
+ Stream.of("--module-source-path",
+ dir.toString())).toArray(String[]::new);
+ if (!CompilerUtils.compile(msrc, dest, args)) {
+ throw new Error("Fail to compile " + module);
+ }
+ }
+
+ static class JavaSource {
+ final String source;
+ JavaSource(String source) {
+ this.source = source;
+ }
+
+ /**
+ * Writes the source code to a file in a specified directory.
+ * @param dir the directory
+ * @throws IOException if there is a problem writing the file
+ */
+ public void write(Path dir) throws IOException {
+ Path file = dir.resolve(getJavaFileNameFromSource(source));
+ Files.createDirectories(file.getParent());
+ try (BufferedWriter out = Files.newBufferedWriter(file)) {
+ out.write(source.replace("\n", System.lineSeparator()));
+ }
+ }
+
+ /**
+ * Extracts the Java file name from the class declaration.
+ * This method is intended for simple files and uses regular expressions,
+ * so comments matching the pattern can make the method fail.
+ */
+ static String getJavaFileNameFromSource(String source) {
+ String packageName = null;
+
+ Matcher matcher = MODULE_PATTERN.matcher(source);
+ if (matcher.find())
+ return MODULE_INFO_JAVA;
+
+ matcher = PACKAGE_PATTERN.matcher(source);
+ if (matcher.find())
+ packageName = matcher.group(1).replace(".", "/");
+
+ matcher = CLASS_PATTERN.matcher(source);
+ if (matcher.find()) {
+ String className = matcher.group(1) + ".java";
+ return (packageName == null) ? className : packageName + "/" + className;
+ } else if (packageName != null) {
+ return packageName + "/package-info.java";
+ } else {
+ throw new Error("Could not extract the java class " +
+ "name from the provided source");
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/jdk/test/lib/management/DynamicVMOption.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2014, 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 jdk.test.lib.management;
+
+import com.sun.management.HotSpotDiagnosticMXBean;
+import java.lang.management.ManagementFactory;
+
+/**
+ * A utility class to work with VM options which could be altered during
+ * execution.
+ *
+ * This class is a wrapper around {@code com.sun.management.VMOption}.
+ * It provides more convenient interface to read/write the values.
+ *
+ */
+public class DynamicVMOption {
+
+ private final HotSpotDiagnosticMXBean mxBean;
+
+ /**
+ * VM option name, like "MinHeapFreeRatio".
+ */
+ public final String name;
+
+ /**
+ * Creates an instance of DynamicVMOption.
+ *
+ * @param name the VM option name
+ */
+ public DynamicVMOption(String name) {
+ this.name = name;
+ mxBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
+ }
+
+ /**
+ * Sets a new value for the option.
+ * Trying to set not applicable value will cause IllegalArgumentException.
+ * Behavior with null is undefined, most likely NPE will be thrown.
+ *
+ * @param newValue the value to be set
+ * @see #getValue()
+ * @throws IllegalArgumentException if newValue is not applicable to the option
+ */
+ public final void setValue(String newValue) {
+ mxBean.setVMOption(name, newValue);
+ }
+
+ /**
+ * Returns the value of option.
+ *
+ * @return the current option value
+ * @see #setValue(java.lang.String)
+ */
+ public final String getValue() {
+ return mxBean.getVMOption(name).getValue();
+ }
+
+ /**
+ * Returns true, if option is writable, false otherwise.
+ *
+ * @return true, if option is writable, false otherwise
+ */
+ public final boolean isWriteable() {
+ return mxBean.getVMOption(name).isWriteable();
+ }
+
+ /**
+ * Checks if the given value is applicable for the option.
+ *
+ * This method tries to set the option to the new value. If no exception
+ * has been thrown the value is treated as valid.
+ *
+ * Calling this method will not change the option value. After an attempt
+ * to set a new value, the option will be restored to its previous value.
+ *
+ * @param value the value to verify
+ * @return true if option could be set to the given value
+ */
+ public boolean isValidValue(String value) {
+ boolean isValid = true;
+ String oldValue = getValue();
+ try {
+ setValue(value);
+ } catch (NullPointerException e) {
+ if (value == null) {
+ isValid = false;
+ }
+ } catch (IllegalArgumentException e) {
+ isValid = false;
+ } finally {
+ setValue(oldValue);
+ }
+ return isValid;
+ }
+
+ /**
+ * Returns the value of the given VM option as String.
+ *
+ * This is a simple shortcut for {@code new DynamicVMOption(name).getValue()}
+ *
+ * @param name the name of VM option
+ * @return value as a string
+ * @see #getValue()
+ */
+ public static String getString(String name) {
+ return new DynamicVMOption(name).getValue();
+ }
+
+ /**
+ * Returns the value of the given option as int.
+ *
+ * @param name the name of VM option
+ * @return value parsed as integer
+ * @see #getString(java.lang.String)
+ *
+ */
+ public static int getInt(String name) {
+ return Integer.parseInt(getString(name));
+ }
+
+ /**
+ * Sets the VM option to a new value.
+ *
+ * This is a simple shortcut for {@code new DynamicVMOption(name).setValue(value)}
+ *
+ * @param name the name of VM option
+ * @param value the value to be set
+ * @see #setValue(java.lang.String)
+ */
+ public static void setString(String name, String value) {
+ new DynamicVMOption(name).setValue(value);
+ }
+
+ /**
+ * Sets the VM option value to a new integer value.
+ *
+ * @param name the name of VM option
+ * @param value the integer value to be set
+ * @see #setString(java.lang.String, java.lang.String)
+ */
+ public static void setInt(String name, int value) {
+ new DynamicVMOption(name).setValue(Integer.toString(value));
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/jdk/test/lib/management/ThreadMXBeanTool.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,71 @@
+/*
+ * 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 jdk.test.lib.management;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+
+/**
+ * A few utility methods to use ThreadMXBean.
+ */
+public final class ThreadMXBeanTool {
+
+ /**
+ * Waits until {@link Thread} is in the certain {@link Thread.State}
+ * and blocking on {@code object}.
+ *
+ * @param state The thread state
+ * @param object The object to block on
+ */
+ public static void waitUntilBlockingOnObject(Thread thread, Thread.State state, Object object)
+ throws InterruptedException {
+ String want = object == null ? null : object.getClass().getName() + '@'
+ + Integer.toHexString(System.identityHashCode(object));
+ ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
+ while (thread.isAlive()) {
+ ThreadInfo ti = tmx.getThreadInfo(thread.getId());
+ if (ti.getThreadState() == state
+ && (want == null || want.equals(ti.getLockName()))) {
+ return;
+ }
+ Thread.sleep(1);
+ }
+ }
+
+ /**
+ * Waits until {@link Thread} is in native.
+ */
+ public static void waitUntilInNative(Thread thread) throws InterruptedException {
+ ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
+ while (thread.isAlive()) {
+ ThreadInfo ti = tmx.getThreadInfo(thread.getId());
+ if (ti.isInNative()) {
+ return;
+ }
+ Thread.sleep(1);
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/jdk/test/lib/util/SerializationUtils.java Thu May 25 09:15:55 2017 -0700
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2015, 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 jdk.test.lib.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+/**
+ * Common library for various test serialization utility functions.
+ */
+public final class SerializationUtils {
+ /**
+ * Serialize an object into byte array.
+ */
+ public static byte[] serialize(Object obj) throws IOException {
+ ByteArrayOutputStream bs = new ByteArrayOutputStream();
+ try (ObjectOutputStream out = new ObjectOutputStream(bs)) {
+ out.writeObject(obj);
+ }
+ return bs.toByteArray();
+ }
+
+ /**
+ * Deserialize an object from byte array.
+ */
+ public static Object deserialize(byte[] ba) throws IOException, ClassNotFoundException {
+ try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(ba))) {
+ return in.readObject();
+ }
+ }
+ private SerializationUtils() {}
+}