OpenJDK / jdk / hs
changeset 42138:a64d6162f64d
Merge
author | prr |
---|---|
date | Tue, 22 Nov 2016 10:48:24 -0800 |
parents | f6e23798622f f872c8278074 |
children | 7694194761a4 772febeeeede |
files | jdk/src/java.base/unix/native/libjli/ergo.c jdk/src/java.base/unix/native/libjli/ergo.h jdk/src/java.base/unix/native/libjli/ergo_i586.c jdk/test/sun/net/www/http/HttpClient/RetryPost.sh jdk/test/sun/security/tools/keytool/readjar.sh langtools/test/jdk/javadoc/doclet/testOrdering/order/MethodOrder.java make/common/CORE_PKGS.gmk make/common/NON_CORE_PKGS.gmk |
diffstat | 187 files changed, 5115 insertions(+), 3500 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgtags Mon Nov 14 10:00:15 2016 -0800 +++ b/.hgtags Tue Nov 22 10:48:24 2016 -0800 @@ -386,3 +386,4 @@ 9aadd2163b568d76f8969ad2fb404a63733da359 jdk-9+141 df0e03e3ca0ed1307793017dfc1a054c8726131c jdk-9+142 d62173b931bf5b6bffc6e80a9060bb2e8b8efc75 jdk-9+143 +31f5023200d42185b70c4c00ba5672391e4642d0 jdk-9+144
--- a/.hgtags-top-repo Mon Nov 14 10:00:15 2016 -0800 +++ b/.hgtags-top-repo Tue Nov 22 10:48:24 2016 -0800 @@ -387,3 +387,4 @@ 2b3e5caafe3594ea507c37675c4d3086f415dc64 jdk-9+142 1fc62b1c629fb80fdaa639d3b59452a184f0d705 jdk-9+143 8d337fd6333e28c48aa87880144b840aad82baaf jdk-9+144 +ff98aa9ec9fae991e426ce5926fc9036d25f5562 jdk-9+145
--- a/common/autoconf/basics.m4 Mon Nov 14 10:00:15 2016 -0800 +++ b/common/autoconf/basics.m4 Tue Nov 22 10:48:24 2016 -0800 @@ -1048,7 +1048,9 @@ # These tools might not be installed by default, # need hint on how to install them. BASIC_REQUIRE_PROGS(UNZIP, unzip) - BASIC_REQUIRE_PROGS(ZIP, zip) + # Since zip uses "ZIP" as a environment variable for passing options, we need + # to name our variable differently, hence ZIPEXE. + BASIC_REQUIRE_PROGS(ZIPEXE, zip) # Non-required basic tools
--- a/common/autoconf/generated-configure.sh Mon Nov 14 10:00:15 2016 -0800 +++ b/common/autoconf/generated-configure.sh Tue Nov 22 10:48:24 2016 -0800 @@ -945,7 +945,7 @@ READELF OTOOL LDD -ZIP +ZIPEXE UNZIP TAR_SUPPORTS_TRANSFORM TAR_INCLUDE_PARAM @@ -1292,7 +1292,7 @@ NICE MAKE UNZIP -ZIP +ZIPEXE LDD OTOOL READELF @@ -2236,7 +2236,7 @@ NICE Override default value for NICE MAKE Override default value for MAKE UNZIP Override default value for UNZIP - ZIP Override default value for ZIP + ZIPEXE Override default value for ZIPEXE LDD Override default value for LDD OTOOL Override default value for OTOOL READELF Override default value for READELF @@ -5093,7 +5093,7 @@ #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1479120453 +DATE_WHEN_GENERATED=1479822431 ############################################################################### # @@ -21373,13 +21373,15 @@ fi - - - - # Publish this variable in the help. - - - if [ -z "${ZIP+x}" ]; then + # Since zip uses "ZIP" as a environment variable for passing options, we need + # to name our variable differently, hence ZIPEXE. + + + + # Publish this variable in the help. + + + if [ -z "${ZIPEXE+x}" ]; then # The variable is not set by user, try to locate tool using the code snippet for ac_prog in zip do @@ -21387,56 +21389,56 @@ set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ZIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ZIP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ZIP=$ac_cv_path_ZIP -if test -n "$ZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5 -$as_echo "$ZIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ZIP" && break -done - - else - # The variable is set, but is it from the command line or the environment? - - # Try to remove the string !ZIP! from our list. - try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!ZIP!/} - if test "x$try_remove_var" = "x$CONFIGURE_OVERRIDDEN_VARIABLES"; then - # If it failed, the variable was not from the command line. Ignore it, - # but warn the user (except for BASH, which is always set by the calling BASH). - if test "xZIP" != xBASH; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of ZIP from the environment. Use command line variables instead." >&5 -$as_echo "$as_me: WARNING: Ignoring value of ZIP from the environment. Use command line variables instead." >&2;} +if ${ac_cv_path_ZIPEXE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ZIPEXE in + [\\/]* | ?:[\\/]*) + ac_cv_path_ZIPEXE="$ZIPEXE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ZIPEXE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ZIPEXE=$ac_cv_path_ZIPEXE +if test -n "$ZIPEXE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIPEXE" >&5 +$as_echo "$ZIPEXE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ZIPEXE" && break +done + + else + # The variable is set, but is it from the command line or the environment? + + # Try to remove the string !ZIPEXE! from our list. + try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!ZIPEXE!/} + if test "x$try_remove_var" = "x$CONFIGURE_OVERRIDDEN_VARIABLES"; then + # If it failed, the variable was not from the command line. Ignore it, + # but warn the user (except for BASH, which is always set by the calling BASH). + if test "xZIPEXE" != xBASH; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of ZIPEXE from the environment. Use command line variables instead." >&5 +$as_echo "$as_me: WARNING: Ignoring value of ZIPEXE from the environment. Use command line variables instead." >&2;} fi # Try to locate tool using the code snippet for ac_prog in zip @@ -21445,135 +21447,135 @@ set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ZIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ZIP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ZIP=$ac_cv_path_ZIP -if test -n "$ZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5 -$as_echo "$ZIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ZIP" && break -done - - else - # If it succeeded, then it was overridden by the user. We will use it - # for the tool. - - # First remove it from the list of overridden variables, so we can test - # for unknown variables in the end. - CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var" - - # Check if we try to supply an empty value - if test "x$ZIP" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Setting user supplied tool ZIP= (no value)" >&5 -$as_echo "$as_me: Setting user supplied tool ZIP= (no value)" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZIP" >&5 -$as_echo_n "checking for ZIP... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 -$as_echo "disabled" >&6; } - else - # Check if the provided tool contains a complete path. - tool_specified="$ZIP" - tool_basename="${tool_specified##*/}" - if test "x$tool_basename" = "x$tool_specified"; then - # A command without a complete path is provided, search $PATH. - { $as_echo "$as_me:${as_lineno-$LINENO}: Will search for user supplied tool ZIP=$tool_basename" >&5 -$as_echo "$as_me: Will search for user supplied tool ZIP=$tool_basename" >&6;} - # Extract the first word of "$tool_basename", so it can be a program name with args. -set dummy $tool_basename; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ZIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ZIP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ZIP=$ac_cv_path_ZIP -if test -n "$ZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5 -$as_echo "$ZIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test "x$ZIP" = x; then - as_fn_error $? "User supplied tool $tool_basename could not be found" "$LINENO" 5 - fi - else - # Otherwise we believe it is a complete path. Use it as it is. - { $as_echo "$as_me:${as_lineno-$LINENO}: Will use user supplied tool ZIP=$tool_specified" >&5 -$as_echo "$as_me: Will use user supplied tool ZIP=$tool_specified" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZIP" >&5 -$as_echo_n "checking for ZIP... " >&6; } - if test ! -x "$tool_specified"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 -$as_echo "not found" >&6; } - as_fn_error $? "User supplied tool ZIP=$tool_specified does not exist or is not executable" "$LINENO" 5 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tool_specified" >&5 -$as_echo "$tool_specified" >&6; } - fi - fi - fi - - fi - - - - if test "x$ZIP" = x; then - as_fn_error $? "Could not find required tool for ZIP" "$LINENO" 5 +if ${ac_cv_path_ZIPEXE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ZIPEXE in + [\\/]* | ?:[\\/]*) + ac_cv_path_ZIPEXE="$ZIPEXE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ZIPEXE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ZIPEXE=$ac_cv_path_ZIPEXE +if test -n "$ZIPEXE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIPEXE" >&5 +$as_echo "$ZIPEXE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ZIPEXE" && break +done + + else + # If it succeeded, then it was overridden by the user. We will use it + # for the tool. + + # First remove it from the list of overridden variables, so we can test + # for unknown variables in the end. + CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var" + + # Check if we try to supply an empty value + if test "x$ZIPEXE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Setting user supplied tool ZIPEXE= (no value)" >&5 +$as_echo "$as_me: Setting user supplied tool ZIPEXE= (no value)" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZIPEXE" >&5 +$as_echo_n "checking for ZIPEXE... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 +$as_echo "disabled" >&6; } + else + # Check if the provided tool contains a complete path. + tool_specified="$ZIPEXE" + tool_basename="${tool_specified##*/}" + if test "x$tool_basename" = "x$tool_specified"; then + # A command without a complete path is provided, search $PATH. + { $as_echo "$as_me:${as_lineno-$LINENO}: Will search for user supplied tool ZIPEXE=$tool_basename" >&5 +$as_echo "$as_me: Will search for user supplied tool ZIPEXE=$tool_basename" >&6;} + # Extract the first word of "$tool_basename", so it can be a program name with args. +set dummy $tool_basename; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ZIPEXE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ZIPEXE in + [\\/]* | ?:[\\/]*) + ac_cv_path_ZIPEXE="$ZIPEXE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ZIPEXE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ZIPEXE=$ac_cv_path_ZIPEXE +if test -n "$ZIPEXE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIPEXE" >&5 +$as_echo "$ZIPEXE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$ZIPEXE" = x; then + as_fn_error $? "User supplied tool $tool_basename could not be found" "$LINENO" 5 + fi + else + # Otherwise we believe it is a complete path. Use it as it is. + { $as_echo "$as_me:${as_lineno-$LINENO}: Will use user supplied tool ZIPEXE=$tool_specified" >&5 +$as_echo "$as_me: Will use user supplied tool ZIPEXE=$tool_specified" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZIPEXE" >&5 +$as_echo_n "checking for ZIPEXE... " >&6; } + if test ! -x "$tool_specified"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } + as_fn_error $? "User supplied tool ZIPEXE=$tool_specified does not exist or is not executable" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tool_specified" >&5 +$as_echo "$tool_specified" >&6; } + fi + fi + fi + + fi + + + + if test "x$ZIPEXE" = x; then + as_fn_error $? "Could not find required tool for ZIPEXE" "$LINENO" 5 fi
--- a/common/autoconf/spec.gmk.in Mon Nov 14 10:00:15 2016 -0800 +++ b/common/autoconf/spec.gmk.in Tue Nov 22 10:48:24 2016 -0800 @@ -657,8 +657,7 @@ UNIQ:=@UNIQ@ WC:=@WC@ XARGS:=@XARGS@ -ZIPEXE:=@ZIP@ -ZIP:=@ZIP@ +ZIPEXE:=@ZIPEXE@ UNZIP:=@UNZIP@ MT:=@FIXPATH@ @MT@ RC:=@FIXPATH@ @RC@
--- a/common/bin/compare.sh Mon Nov 14 10:00:15 2016 -0800 +++ b/common/bin/compare.sh Tue Nov 22 10:48:24 2016 -0800 @@ -372,7 +372,7 @@ $CAT $OTHER_DIR/$f | eval "$HTML_FILTER" > $OTHER_FILE & $CAT $THIS_DIR/$f | eval "$HTML_FILTER" > $THIS_FILE & wait - elif [ "$f" = "./lib/classlist" ]; then + elif [[ "$f" = *"/lib/classlist" ]]; then # The classlist files may have some lines in random order OTHER_FILE=$WORK_DIR/$f.other THIS_FILE=$WORK_DIR/$f.this @@ -642,69 +642,18 @@ if [ "$OPENJDK_TARGET_OS" = "windows" ]; then unset _NT_SYMBOL_PATH - # On windows we need to unzip the debug symbols, if present - OTHER_FILE_BASE=${OTHER_FILE/.dll/} - OTHER_FILE_BASE=${OTHER_FILE_BASE/.exe/} - OTHER_FILE_BASE=${OTHER_FILE_BASE/.cpl/} - DIZ_NAME=$(basename $OTHER_FILE_BASE).diz - # Some .exe files have the same name as a .dll file. Make sure the exe - # files get the right debug symbols. - if [ "$NAME" = "java.exe" ] \ - && [ -f "$OTHER/support/native/java.base/java_objs/java.diz" ]; then - OTHER_DIZ_FILE="$OTHER/support/native/java.base/java_objs/java.diz" - elif [ "$NAME" = "jimage.exe" ] \ - && [ -f "$OTHER/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then - OTHER_DIZ_FILE="$OTHER/support/modules_cmds/jdk.jlink/jimage.diz" - elif [ "$NAME" = "javacpl.exe" ] \ - && [ -f "$OTHER/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then - OTHER_DIZ_FILE="$OTHER/support/modules_cmds/jdk.deploy.controlpanel/javacpl.diz" - elif [ -f "${OTHER_FILE_BASE}.diz" ]; then - OTHER_DIZ_FILE=${OTHER_FILE_BASE}.diz - else - # Some files, jli.dll, appears twice in the image but only one of - # them has a diz file next to it. - OTHER_DIZ_FILE="$($FIND $OTHER_DIR -name $DIZ_NAME | $SED 1q)" - if [ ! -f "$OTHER_DIZ_FILE" ]; then - # As a last resort, look for diz file in the whole build output - # dir. - OTHER_DIZ_FILE="$($FIND $OTHER -name $DIZ_NAME | $SED 1q)" - fi + if [ "$(uname -o)" = "Cygwin" ]; then + THIS=$(cygpath -msa $THIS) + OTHER=$(cygpath -msa $OTHER) fi - if [ -n "$OTHER_DIZ_FILE" ]; then - $MKDIR -p $FILE_WORK_DIR/other - (cd $FILE_WORK_DIR/other ; $UNARCHIVE -o $OTHER_DIZ_FILE) - export _NT_SYMBOL_PATH="$FILE_WORK_DIR/other" - fi - - THIS_FILE_BASE=${THIS_FILE/.dll/} - THIS_FILE_BASE=${THIS_FILE_BASE/.exe/} - THIS_FILE_BASE=${THIS_FILE_BASE/.cpl/} - # Some .exe files have the same name as a .dll file. Make sure the exe - # files get the right debug symbols. - if [ "$NAME" = "java.exe" ] \ - && [ -f "$THIS/support/native/java.base/java_objs/java.diz" ]; then - THIS_DIZ_FILE="$THIS/support/native/java.base/java_objs/java.diz" - elif [ "$NAME" = "jimage.exe" ] \ - && [ -f "$THIS/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then - THIS_DIZ_FILE="$THIS/support/modules_cmds/jdk.jlink/jimage.diz" - elif [ "$NAME" = "javacpl.exe" ] \ - && [ -f "$THIS/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then - THIS_DIZ_FILE="$THIS/support/modules_cmds/jdk.deploy.controlpanel/javacpl.diz" - elif [ -f "${THIS_FILE_BASE}.diz" ]; then - THIS_DIZ_FILE=${THIS_FILE/.dll/}.diz - else - THIS_DIZ_FILE="$($FIND $THIS_DIR -name $DIZ_NAME | $SED 1q)" - if [ ! -f "$THIS_DIZ_FILE" ]; then - # As a last resort, look for diz file in the whole build output - # dir. - THIS_DIZ_FILE="$($FIND $THIS -name $DIZ_NAME | $SED 1q)" - fi - fi - if [ -n "$THIS_DIZ_FILE" ]; then - $MKDIR -p $FILE_WORK_DIR/this - (cd $FILE_WORK_DIR/this ; $UNARCHIVE -o $THIS_DIZ_FILE) - export _NT_SYMBOL_PATH="$_NT_SYMBOL_PATH;$FILE_WORK_DIR/this" - fi + # Build an _NT_SYMBOL_PATH that contains all known locations for + # pdb files. + PDB_DIRS="$(ls -d \ + {$OTHER,$THIS}/support/modules_{cmds,libs}/{*,*/*} \ + {$OTHER,$THIS}/support/demos/image/jvmti/*/lib \ + {$OTHER,$THIS}/support/native/java.base/java_objs \ + )" + export _NT_SYMBOL_PATH="$(echo $PDB_DIRS | tr ' ' ';')" fi if [ -z "$SKIP_BIN_DIFF" ]; then
--- a/common/bin/compare_exceptions.sh.incl Mon Nov 14 10:00:15 2016 -0800 +++ b/common/bin/compare_exceptions.sh.incl Tue Nov 22 10:48:24 2016 -0800 @@ -431,6 +431,8 @@ ACCEPTED_JARZIP_CONTENTS=" /modules_libs/java.security.jgss/w2k_lsa_auth.diz + /modules_libs/java.security.jgss/w2k_lsa_auth.pdb + /modules_libs/java.security.jgss/w2k_lsa_auth.map /modules_libs/java.security.jgss/w2k_lsa_auth.dll "
--- a/corba/.hgtags Mon Nov 14 10:00:15 2016 -0800 +++ b/corba/.hgtags Tue Nov 22 10:48:24 2016 -0800 @@ -386,3 +386,4 @@ b32f998da32b488ec7c4e9dbb3c750841b48e74d jdk-9+141 408c9c621938ca028e20bced0459f815de47eba8 jdk-9+142 6211236ef15ec796806357608b1dd1b70c258ece jdk-9+143 +d4f1dae174098e799c48948e866054c52e11a186 jdk-9+144
--- a/hotspot/.hgtags Mon Nov 14 10:00:15 2016 -0800 +++ b/hotspot/.hgtags Tue Nov 22 10:48:24 2016 -0800 @@ -546,3 +546,4 @@ 160a00bc6ed0af1fdf8418fc65e6bddbbc0c536d jdk-9+141 7b48d63dfd6b8e2657288de3d7b1f153dee02d7e jdk-9+142 d87d5d430c42342f0320ca7f5cbe0cbd1f9d62ba jdk-9+143 +6187b582d02aee38341dc8ce4011906e9b364e9f jdk-9+144
--- a/jaxp/.hgtags Mon Nov 14 10:00:15 2016 -0800 +++ b/jaxp/.hgtags Tue Nov 22 10:48:24 2016 -0800 @@ -386,3 +386,4 @@ 037c095ba0c345edbeaaab52fda913a76c3930c0 jdk-9+141 bdafa0cc34a97a2f8db4847a4efd34b407943591 jdk-9+142 ce81d03ad7320dca3d673374c1a33bc0efd9136a jdk-9+143 +99be33734ff62b75116b1202d49a4d4e1bda4226 jdk-9+144
--- a/jaxws/.hgtags Mon Nov 14 10:00:15 2016 -0800 +++ b/jaxws/.hgtags Tue Nov 22 10:48:24 2016 -0800 @@ -389,3 +389,4 @@ b2c18f755228d1d19a86cd7d5fa1abb6b1495dfb jdk-9+141 59101416d90160cfcb4f45dfbccaec15e2c27a29 jdk-9+142 1c988e708a06257119d54d8a57e99e3b0f37ff18 jdk-9+143 +92523c51d6a48b0a83912ba3cc43bc57b8159c2a jdk-9+144
--- a/jdk/.hgtags Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/.hgtags Tue Nov 22 10:48:24 2016 -0800 @@ -386,3 +386,4 @@ 8d752af5f61d41f226adf2cda72a20faa9ad620a jdk-9+141 6ce43dd8e954b452f330dd7a412df5107f7e1923 jdk-9+142 8dbc8594f9d5149bf1c22221272284609408227a jdk-9+143 +efa71dc820eb8bd5a6c9f2f66f39c383ac3ee99d jdk-9+144
--- a/jdk/make/data/tzdata/VERSION Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/data/tzdata/VERSION Tue Nov 22 10:48:24 2016 -0800 @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2016h +tzdata2016i
--- a/jdk/make/data/tzdata/antarctica Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/data/tzdata/antarctica Tue Nov 22 10:48:24 2016 -0800 @@ -87,13 +87,18 @@ # Background: # http://www.timeanddate.com/news/time/antartica-time-changes-2010.html +# From Steffen Thorsen (2016-10-28): +# Australian Antarctica Division informed us that Casey changed time +# zone to UTC+11 in "the morning of 22nd October 2016". + # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Antarctica/Casey 0 - -00 1969 8:00 - +08 2009 Oct 18 2:00 11:00 - +11 2010 Mar 5 2:00 8:00 - +08 2011 Oct 28 2:00 11:00 - +11 2012 Feb 21 17:00u - 8:00 - +08 + 8:00 - +08 2016 Oct 22 + 11:00 - +11 Zone Antarctica/Davis 0 - -00 1957 Jan 13 7:00 - +07 1964 Nov 0 - -00 1969 Feb
--- a/jdk/make/data/tzdata/asia Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/data/tzdata/asia Tue Nov 22 10:48:24 2016 -0800 @@ -794,9 +794,19 @@ ############################################################################### # Cyprus + +# Milne says the Eastern Telegraph Company used 2:14:00. Stick with LMT. +# IATA SSIM (1998-09) has Cyprus using EU rules for the first time. + +# From Paul Eggert (2016-09-09): +# Yesterday's Cyprus Mail reports that Northern Cyprus followed Turkey's +# lead and switched from +02/+03 to +03 year-round. +# http://cyprus-mail.com/2016/09/08/two-time-zones-cyprus-turkey-will-not-turn-clocks-back-next-month/ # -# Milne says the Eastern Telegraph Company used 2:14:00. Stick with LMT. -# +# From Even Scharning (2016-10-31): +# Looks like the time zone split in Cyprus went through last night. +# http://cyprus-mail.com/2016/10/30/cyprus-new-division-two-time-zones-now-reality/ + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Cyprus 1975 only - Apr 13 0:00 1:00 S Rule Cyprus 1975 only - Oct 12 0:00 0 - @@ -811,7 +821,10 @@ Zone Asia/Nicosia 2:13:28 - LMT 1921 Nov 14 2:00 Cyprus EE%sT 1998 Sep 2:00 EUAsia EE%sT -# IATA SSIM (1998-09) has Cyprus using EU rules for the first time. +Zone Asia/Famagusta 2:15:48 - LMT 1921 Nov 14 + 2:00 Cyprus EE%sT 1998 Sep + 2:00 EUAsia EE%sT 2016 Sep 8 + 3:00 - +03 # Classically, Cyprus belongs to Asia; e.g. see Herodotus, Histories, I.72. # However, for various reasons many users expect to find it under Europe.
--- a/jdk/make/data/tzdata/australasia Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/data/tzdata/australasia Tue Nov 22 10:48:24 2016 -0800 @@ -725,11 +725,13 @@ Rule Tonga 2000 only - Mar 19 2:00s 0 - Rule Tonga 2000 2001 - Nov Sun>=1 2:00 1:00 S Rule Tonga 2001 2002 - Jan lastSun 2:00 0 - +Rule Tonga 2016 max - Nov Sun>=1 2:00 1:00 S +Rule Tonga 2017 max - Jan Sun>=15 3:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Pacific/Tongatapu 12:19:20 - LMT 1901 - 12:20 - TOT 1941 # Tonga Time - 13:00 - TOT 1999 - 13:00 Tonga TO%sT + 12:20 - +1220 1941 + 13:00 - +13 1999 + 13:00 Tonga +13/+14 # Tuvalu # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -1735,9 +1737,17 @@ # of January the standard time in the Kingdom shall be moved backward by one # hour to 1:00am. -# From Pulu 'Anau (2002-11-05): +# From Pulu ʻAnau (2002-11-05): # The law was for 3 years, supposedly to get renewed. It wasn't. +# From Pulu ʻAnau (2016-10-27): +# http://mic.gov.to/news-today/press-releases/6375-daylight-saving-set-to-run-from-6-november-2016-to-15-january-2017 +# Cannot find anyone who knows the rules, has seen the duration or has seen +# the cabinet decision, but it appears we are following Fiji's rule set. +# +# From Tim Parenti (2016-10-26): +# Assume Tonga will observe DST from the first Sunday in November at 02:00 +# through the third Sunday in January at 03:00, like Fiji, for now. # Wake
--- a/jdk/make/data/tzdata/europe Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/data/tzdata/europe Tue Nov 22 10:48:24 2016 -0800 @@ -1523,73 +1523,84 @@ # But these events all occurred before the 1970 cutoff, # so record only the time in Rome. # -# From Paul Eggert (2006-03-22): -# For Italian DST we have three sources: Shanks & Pottenger, Whitman, and -# F. Pollastri -# Day-light Saving Time in Italy (2006-02-03) -# http://toi.iriti.cnr.it/uk/ienitlt.html -# ('FP' below), taken from an Italian National Electrotechnical Institute -# publication. When the three sources disagree, guess who's right, as follows: +# From Michael Deckers (2016-10-24): +# http://www.ac-ilsestante.it/MERIDIANE/ora_legale quotes a law of 1893-08-10 +# ... [translated as] "The preceding dispositions will enter into +# force at the instant at which, according to the time specified in +# the 1st article, the 1st of November 1893 will begin...." # -# year FP Shanks&P. (S) Whitman (W) Go with: -# 1916 06-03 06-03 24:00 06-03 00:00 FP & W -# 09-30 09-30 24:00 09-30 01:00 FP; guess 24:00s -# 1917 04-01 03-31 24:00 03-31 00:00 FP & S -# 09-30 09-29 24:00 09-30 01:00 FP & W -# 1918 03-09 03-09 24:00 03-09 00:00 FP & S -# 10-06 10-05 24:00 10-06 01:00 FP & W -# 1919 03-01 03-01 24:00 03-01 00:00 FP & S -# 10-04 10-04 24:00 10-04 01:00 FP; guess 24:00s -# 1920 03-20 03-20 24:00 03-20 00:00 FP & S -# 09-18 09-18 24:00 10-01 01:00 FP; guess 24:00s -# 1944 04-02 04-03 02:00 S (see C-Eur) -# 09-16 10-02 03:00 FP; guess 24:00s -# 1945 09-14 09-16 24:00 FP; guess 24:00s -# 1970 05-21 05-31 00:00 S -# 09-20 09-27 00:00 S +# From Pierpaolo Bernardi (2016-10-20): +# The authoritative source for time in Italy is the national metrological +# institute, which has a summary page of historical DST data at +# http://www.inrim.it/res/tf/ora_legale_i.shtml +# (2016-10-24): +# http://www.renzobaldini.it/le-ore-legali-in-italia/ +# has still different data for 1944. It divides Italy in two, as +# there were effectively two governments at the time, north of Gothic +# Line German controlled territory, official government RSI, and south +# of the Gothic Line, controlled by allied armies. +# +# From Brian Inglis (2016-10-23): +# Viceregal LEGISLATIVE DECREE. 14 September 1944, no. 219. +# Restoration of Standard Time. (044U0219) (OJ 62 of 30.9.1944) ... +# Given the R. law decreed on 1944-03-29, no. 92, by which standard time is +# advanced to sixty minutes later starting at hour two on 1944-04-02; ... +# Starting at hour three on the date 1944-09-17 standard time will be resumed. +# +# From Paul Eggert (2016-10-27): +# Go with INRiM for DST rules, except as corrected by Inglis for 1944 +# for the Kingdom of Italy. This is consistent with Renzo Baldini. +# Model Rome's occupation by using using C-Eur rules from 1943-09-10 +# to 1944-06-04; although Rome was an open city during this period, it +# was effectively controlled by Germany. # # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S -Rule Italy 1916 only - Jun 3 0:00s 1:00 S -Rule Italy 1916 only - Oct 1 0:00s 0 - -Rule Italy 1917 only - Apr 1 0:00s 1:00 S -Rule Italy 1917 only - Sep 30 0:00s 0 - -Rule Italy 1918 only - Mar 10 0:00s 1:00 S -Rule Italy 1918 1919 - Oct Sun>=1 0:00s 0 - -Rule Italy 1919 only - Mar 2 0:00s 1:00 S -Rule Italy 1920 only - Mar 21 0:00s 1:00 S -Rule Italy 1920 only - Sep 19 0:00s 0 - -Rule Italy 1940 only - Jun 15 0:00s 1:00 S -Rule Italy 1944 only - Sep 17 0:00s 0 - -Rule Italy 1945 only - Apr 2 2:00 1:00 S -Rule Italy 1945 only - Sep 15 0:00s 0 - -Rule Italy 1946 only - Mar 17 2:00s 1:00 S -Rule Italy 1946 only - Oct 6 2:00s 0 - -Rule Italy 1947 only - Mar 16 0:00s 1:00 S -Rule Italy 1947 only - Oct 5 0:00s 0 - -Rule Italy 1948 only - Feb 29 2:00s 1:00 S -Rule Italy 1948 only - Oct 3 2:00s 0 - -Rule Italy 1966 1968 - May Sun>=22 0:00 1:00 S -Rule Italy 1966 1969 - Sep Sun>=22 0:00 0 - -Rule Italy 1969 only - Jun 1 0:00 1:00 S -Rule Italy 1970 only - May 31 0:00 1:00 S -Rule Italy 1970 only - Sep lastSun 0:00 0 - -Rule Italy 1971 1972 - May Sun>=22 0:00 1:00 S -Rule Italy 1971 only - Sep lastSun 1:00 0 - -Rule Italy 1972 only - Oct 1 0:00 0 - -Rule Italy 1973 only - Jun 3 0:00 1:00 S -Rule Italy 1973 1974 - Sep lastSun 0:00 0 - -Rule Italy 1974 only - May 26 0:00 1:00 S -Rule Italy 1975 only - Jun 1 0:00s 1:00 S -Rule Italy 1975 1977 - Sep lastSun 0:00s 0 - -Rule Italy 1976 only - May 30 0:00s 1:00 S -Rule Italy 1977 1979 - May Sun>=22 0:00s 1:00 S -Rule Italy 1978 only - Oct 1 0:00s 0 - -Rule Italy 1979 only - Sep 30 0:00s 0 - +Rule Italy 1916 only - Jun 3 24:00 1:00 S +Rule Italy 1916 1917 - Sep 30 24:00 0 - +Rule Italy 1917 only - Mar 31 24:00 1:00 S +Rule Italy 1918 only - Mar 9 24:00 1:00 S +Rule Italy 1918 only - Oct 6 24:00 0 - +Rule Italy 1919 only - Mar 1 24:00 1:00 S +Rule Italy 1919 only - Oct 4 24:00 0 - +Rule Italy 1920 only - Mar 20 24:00 1:00 S +Rule Italy 1920 only - Sep 18 24:00 0 - +Rule Italy 1940 only - Jun 14 24:00 1:00 S +Rule Italy 1942 only - Nov 2 2:00s 0 - +Rule Italy 1943 only - Mar 29 2:00s 1:00 S +Rule Italy 1943 only - Oct 4 2:00s 0 - +Rule Italy 1944 only - Apr 2 2:00s 1:00 S +Rule Italy 1944 only - Sep 17 2:00s 0 - +Rule Italy 1945 only - Apr 2 2:00 1:00 S +Rule Italy 1945 only - Sep 15 1:00 0 - +Rule Italy 1946 only - Mar 17 2:00s 1:00 S +Rule Italy 1946 only - Oct 6 2:00s 0 - +Rule Italy 1947 only - Mar 16 0:00s 1:00 S +Rule Italy 1947 only - Oct 5 0:00s 0 - +Rule Italy 1948 only - Feb 29 2:00s 1:00 S +Rule Italy 1948 only - Oct 3 2:00s 0 - +Rule Italy 1966 1968 - May Sun>=22 0:00s 1:00 S +Rule Italy 1966 only - Sep 24 24:00 0 - +Rule Italy 1967 1969 - Sep Sun>=22 0:00s 0 - +Rule Italy 1969 only - Jun 1 0:00s 1:00 S +Rule Italy 1970 only - May 31 0:00s 1:00 S +Rule Italy 1970 only - Sep lastSun 0:00s 0 - +Rule Italy 1971 1972 - May Sun>=22 0:00s 1:00 S +Rule Italy 1971 only - Sep lastSun 0:00s 0 - +Rule Italy 1972 only - Oct 1 0:00s 0 - +Rule Italy 1973 only - Jun 3 0:00s 1:00 S +Rule Italy 1973 1974 - Sep lastSun 0:00s 0 - +Rule Italy 1974 only - May 26 0:00s 1:00 S +Rule Italy 1975 only - Jun 1 0:00s 1:00 S +Rule Italy 1975 1977 - Sep lastSun 0:00s 0 - +Rule Italy 1976 only - May 30 0:00s 1:00 S +Rule Italy 1977 1979 - May Sun>=22 0:00s 1:00 S +Rule Italy 1978 only - Oct 1 0:00s 0 - +Rule Italy 1979 only - Sep 30 0:00s 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Rome 0:49:56 - LMT 1866 Sep 22 - 0:49:56 - RMT 1893 Nov 1 0:00s # Rome Mean - 1:00 Italy CE%sT 1942 Nov 2 2:00s - 1:00 C-Eur CE%sT 1944 Jul + 0:49:56 - RMT 1893 Oct 31 23:49:56 # Rome Mean + 1:00 Italy CE%sT 1943 Sep 10 + 1:00 C-Eur CE%sT 1944 Jun 4 1:00 Italy CE%sT 1980 1:00 EU CE%sT @@ -1788,6 +1799,10 @@ # See Europe/Belgrade. # Malta +# +# From Paul Eggert (2016-10-21): +# Assume 1900-1972 was like Rome, overriding Shanks. +# # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Malta 1973 only - Mar 31 0:00s 1:00 S Rule Malta 1973 only - Sep 29 0:00s 0 - @@ -1798,8 +1813,6 @@ Rule Malta 1980 only - Mar 31 2:00 1:00 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Malta 0:58:04 - LMT 1893 Nov 2 0:00s # Valletta - 1:00 Italy CE%sT 1942 Nov 2 2:00s - 1:00 C-Eur CE%sT 1945 Apr 2 2:00s 1:00 Italy CE%sT 1973 Mar 31 1:00 Malta CE%sT 1981 1:00 EU CE%sT @@ -1931,7 +1944,7 @@ # Amsterdam mean time. # The data entries before 1945 are taken from -# http://www.staff.science.uu.nl/~gent0113/idl/idl.htm +# http://www.staff.science.uu.nl/~gent0113/wettijd/wettijd.htm # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Neth 1916 only - May 1 0:00 1:00 NST # Netherlands Summer Time
--- a/jdk/make/data/tzdata/zone.tab Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/data/tzdata/zone.tab Tue Nov 22 10:48:24 2016 -0800 @@ -175,7 +175,8 @@ CV +1455-02331 Atlantic/Cape_Verde CW +1211-06900 America/Curacao CX -1025+10543 Indian/Christmas -CY +3510+03322 Asia/Nicosia +CY +3510+03322 Asia/Nicosia Cyprus (most areas) +CY +3507+03357 Asia/Famagusta Northern Cyprus CZ +5005+01426 Europe/Prague DE +5230+01322 Europe/Berlin Germany (most areas) DE +4742+00841 Europe/Busingen Busingen
--- a/jdk/make/launcher/Launcher-jdk.compiler.gmk Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/launcher/Launcher-jdk.compiler.gmk Tue Nov 22 10:48:24 2016 -0800 @@ -28,14 +28,12 @@ $(eval $(call SetupBuildLauncher, javac, \ MAIN_CLASS := com.sun.tools.javac.Main, \ JAVA_ARGS := --add-modules ALL-DEFAULT, \ - CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ + CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \ )) $(eval $(call SetupBuildLauncher, javah, \ MAIN_CLASS := com.sun.tools.javah.Main, \ - CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ + CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \ )) $(eval $(call SetupBuildLauncher, serialver, \ @@ -48,8 +46,7 @@ # into any real images $(eval $(call SetupBuildLauncher, sjavac, \ MAIN_CLASS := com.sun.tools.sjavac.Main, \ - CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ + CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \ OUTPUT_DIR := $(JDK_OUTPUTDIR)/bin, \ )) endif
--- a/jdk/make/launcher/Launcher-jdk.javadoc.gmk Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/launcher/Launcher-jdk.javadoc.gmk Tue Nov 22 10:48:24 2016 -0800 @@ -28,6 +28,5 @@ $(eval $(call SetupBuildLauncher, javadoc, \ MAIN_CLASS := jdk.javadoc.internal.tool.Main, \ JAVA_ARGS := --add-modules ALL-DEFAULT, \ - CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ + CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \ ))
--- a/jdk/make/launcher/Launcher-jdk.jdeps.gmk Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/launcher/Launcher-jdk.jdeps.gmk Tue Nov 22 10:48:24 2016 -0800 @@ -27,18 +27,15 @@ $(eval $(call SetupBuildLauncher, javap, \ MAIN_CLASS := com.sun.tools.javap.Main, \ - CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ + CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \ )) $(eval $(call SetupBuildLauncher, jdeps, \ MAIN_CLASS := com.sun.tools.jdeps.Main, \ - CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ + CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \ )) $(eval $(call SetupBuildLauncher, jdeprscan, \ MAIN_CLASS := com.sun.tools.jdeprscan.Main, \ - CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ + CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \ ))
--- a/jdk/make/launcher/Launcher-jdk.jlink.gmk Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/launcher/Launcher-jdk.jlink.gmk Tue Nov 22 10:48:24 2016 -0800 @@ -34,13 +34,11 @@ MAIN_CLASS := jdk.tools.jlink.internal.Main, \ JAVA_ARGS := --add-modules ALL-DEFAULT, \ CFLAGS := -DENABLE_ARG_FILES \ - -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ + -DEXPAND_CLASSPATH_WILDCARDS, \ )) $(eval $(call SetupBuildLauncher, jmod,\ MAIN_CLASS := jdk.tools.jmod.Main, \ CFLAGS := -DENABLE_ARG_FILES \ - -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ + -DEXPAND_CLASSPATH_WILDCARDS, \ ))
--- a/jdk/make/launcher/Launcher-jdk.jshell.gmk Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/launcher/Launcher-jdk.jshell.gmk Tue Nov 22 10:48:24 2016 -0800 @@ -27,6 +27,5 @@ $(eval $(call SetupBuildLauncher, jshell, \ MAIN_CLASS := jdk.internal.jshell.tool.JShellTool, \ - CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ - -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ + CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \ ))
--- a/jdk/make/mapfiles/libjava/mapfile-vers Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/mapfiles/libjava/mapfile-vers Tue Nov 22 10:48:24 2016 -0800 @@ -77,13 +77,13 @@ Java_java_io_FileDescriptor_initIDs; Java_java_io_FileDescriptor_sync; Java_java_io_FileDescriptor_getAppend; - Java_java_io_FileInputStream_available; + Java_java_io_FileInputStream_available0; Java_java_io_FileInputStream_close0; Java_java_io_FileInputStream_initIDs; Java_java_io_FileInputStream_open0; Java_java_io_FileInputStream_read0; Java_java_io_FileInputStream_readBytes; - Java_java_io_FileInputStream_skip; + Java_java_io_FileInputStream_skip0; Java_java_io_FileOutputStream_close0; Java_java_io_FileOutputStream_initIDs; Java_java_io_FileOutputStream_open0;
--- a/jdk/make/mapfiles/libjava/reorder-sparc Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/mapfiles/libjava/reorder-sparc Tue Nov 22 10:48:24 2016 -0800 @@ -44,7 +44,7 @@ text: .text%fileOpen; text: .text%Java_java_io_FileInputStream_readBytes; text: .text%readBytes; -text: .text%Java_java_io_FileInputStream_available; +text: .text%Java_java_io_FileInputStream_available0; text: .text%Java_java_io_FileInputStream_close0; text: .text%Java_java_lang_System_mapLibraryName; text: .text%Java_java_io_UnixFileSystem_getBooleanAttributes0;
--- a/jdk/make/mapfiles/libjava/reorder-sparcv9 Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/mapfiles/libjava/reorder-sparcv9 Tue Nov 22 10:48:24 2016 -0800 @@ -48,7 +48,7 @@ text: .text%fileOpen; text: .text%Java_java_io_FileInputStream_readBytes; text: .text%readBytes; -text: .text%Java_java_io_FileInputStream_available; +text: .text%Java_java_io_FileInputStream_available0; text: .text%Java_java_io_FileInputStream_close0; text: .text%Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedExceptionAction_2; text: .text%Java_java_io_UnixFileSystem_list;
--- a/jdk/make/mapfiles/libjava/reorder-x86 Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/make/mapfiles/libjava/reorder-x86 Tue Nov 22 10:48:24 2016 -0800 @@ -76,7 +76,7 @@ text: .text%JNU_GetEnv; text: .text%Java_java_io_UnixFileSystem_checkAccess; text: .text%Java_sun_reflect_NativeMethodAccessorImpl_invoke0; -text: .text%Java_java_io_FileInputStream_available; +text: .text%Java_java_io_FileInputStream_available0; text: .text%Java_java_lang_reflect_Array_newArray; text: .text%Java_java_lang_StackTraceElement_initStackTraceElements; text: .text%Java_java_lang_System_identityHashCode;
--- a/jdk/src/java.base/linux/classes/sun/nio/ch/EPollArrayWrapper.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/linux/classes/sun/nio/ch/EPollArrayWrapper.java Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -118,7 +118,7 @@ // file descriptors higher than MAX_UPDATE_ARRAY_SIZE (unlimited case at // least) then the update is stored in a map. private final byte[] eventsLow = new byte[MAX_UPDATE_ARRAY_SIZE]; - private Map<Integer,Byte> eventsHigh; + private final Map<Integer,Byte> eventsHigh = new HashMap<>(); // Used by release and updateRegistrations to track whether a file // descriptor is registered with epoll. @@ -133,10 +133,6 @@ int allocationSize = NUM_EPOLLEVENTS * SIZE_EPOLLEVENT; pollArray = new AllocatedNativeObject(allocationSize, true); pollArrayAddress = pollArray.address(); - - // eventHigh needed when using file descriptors > 64k - if (OPEN_MAX > MAX_UPDATE_ARRAY_SIZE) - eventsHigh = new HashMap<>(); } void initInterrupt(int fd0, int fd1) {
--- a/jdk/src/java.base/macosx/conf/x86_64/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/macosx/conf/x86_64/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -23,7 +23,7 @@ # # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -922,11 +922,6 @@ /* Linux only */ } -jboolean -ServerClassMachine(void) { - return JNI_TRUE; -} - static JavaVM* jvmInstance = NULL; static jboolean sameThread = JNI_FALSE; /* start VM in current thread */
--- a/jdk/src/java.base/share/classes/java/io/FileInputStream.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/java/io/FileInputStream.java Tue Nov 22 10:48:24 2016 -0800 @@ -280,7 +280,11 @@ * @exception IOException if n is negative, if the stream does not * support seek, or if an I/O error occurs. */ - public native long skip(long n) throws IOException; + public long skip(long n) throws IOException { + return skip0(n); + } + + private native long skip0(long n) throws IOException; /** * Returns an estimate of the number of remaining bytes that can be read (or @@ -299,7 +303,11 @@ * @exception IOException if this file input stream has been closed by calling * {@code close} or an I/O error occurs. */ - public native int available() throws IOException; + public int available() throws IOException { + return available0(); + } + + private native int available0() throws IOException; /** * Closes this file input stream and releases any system resources
--- a/jdk/src/java.base/share/classes/java/net/NetworkInterface.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/java/net/NetworkInterface.java Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 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 @@ -335,15 +335,19 @@ * {@link #getInetAddresses()} to obtain all IP addresses for this node * * @return an Enumeration of NetworkInterfaces found on this machine - * @exception SocketException if an I/O error occurs. + * @exception SocketException if an I/O error occurs, + * or if the platform does not have at least one configured + * network interface. * @see #networkInterfaces() */ public static Enumeration<NetworkInterface> getNetworkInterfaces() throws SocketException { NetworkInterface[] netifs = getAll(); - assert netifs != null && netifs.length > 0; - - return enumerationFromArray(netifs); + if (netifs != null && netifs.length > 0) { + return enumerationFromArray(netifs); + } else { + throw new SocketException("No network interfaces configured"); + } } /** @@ -361,15 +365,19 @@ * }</pre> * * @return a Stream of NetworkInterfaces found on this machine - * @exception SocketException if an I/O error occurs. + * @exception SocketException if an I/O error occurs, + * or if the platform does not have at least one configured + * network interface. * @since 9 */ public static Stream<NetworkInterface> networkInterfaces() throws SocketException { NetworkInterface[] netifs = getAll(); - assert netifs != null && netifs.length > 0; - - return streamFromArray(netifs); + if (netifs != null && netifs.length > 0) { + return streamFromArray(netifs); + } else { + throw new SocketException("No network interfaces configured"); + } } private static <T> Enumeration<T> enumerationFromArray(T[] a) {
--- a/jdk/src/java.base/share/classes/java/util/Optional.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/java/util/Optional.java Tue Nov 22 10:48:24 2016 -0800 @@ -214,20 +214,20 @@ * @apiNote * This method supports post-processing on {@code Optional} values, without * the need to explicitly check for a return status. For example, the - * following code traverses a stream of file names, selects one that has not - * yet been processed, and then opens that file, returning an - * {@code Optional<FileInputStream>}: + * following code traverses a stream of URIs, selects one that has not + * yet been processed, and creates a path from that URI, returning + * an {@code Optional<Path>}: * * <pre>{@code - * Optional<FileInputStream> fis = - * names.stream().filter(name -> !isProcessedYet(name)) + * Optional<Path> p = + * uris.stream().filter(uri -> !isProcessedYet(uri)) * .findFirst() - * .map(name -> new FileInputStream(name)); + * .map(Paths::get); * }</pre> * - * Here, {@code findFirst} returns an {@code Optional<String>}, and then - * {@code map} returns an {@code Optional<FileInputStream>} for the desired - * file if one exists. + * Here, {@code findFirst} returns an {@code Optional<URI>}, and then + * {@code map} returns an {@code Optional<Path>} for the desired + * URI if one exists. * * @param mapper the mapping function to apply to a value, if present * @param <U> The type of the value returned from the mapping function
--- a/jdk/src/java.base/share/classes/java/util/jar/JarFile.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/java/util/jar/JarFile.java Tue Nov 22 10:48:24 2016 -0800 @@ -192,9 +192,10 @@ public static final String MANIFEST_NAME = META_INF + "MANIFEST.MF"; /** - * The version that represents the unversioned configuration of a multi-release jar file. + * Returns the version that represents the unversioned configuration of a + * multi-release jar file. * - * @return Runtime.Version that represents the unversioned configuration + * @return the version that represents the unversioned configuration * * @since 9 */ @@ -203,13 +204,16 @@ } /** - * The version that represents the effective runtime versioned configuration of a - * multi-release jar file. In most cases, {@code runtimeVersion()} is equal to - * {@code Runtime.version()}. However, if the {@code jdk.util.jar.version} property is set, - * {@code runtimeVersion()} is derived from that property and may not be equal to - * {@code Runtime.version()}. + * Returns the version that represents the effective runtime versioned + * configuration of a multi-release jar file. + * <p> + * By default the major version number of the returned {@code Version} will + * be equal to the major version number of {@code Runtime.version()}. + * However, if the {@code jdk.util.jar.version} property is set, the + * returned {@code Version} is derived from that property and major version + * numbers may not be equal. * - * @return Runtime.Version that represents the runtime versioned configuration + * @return the version that represents the runtime versioned configuration * * @since 9 */ @@ -335,6 +339,10 @@ /** * Returns the maximum version used when searching for versioned entries. + * <p> + * If this {@code JarFile} is not a multi-release jar file or is not + * configured to be processed as such, then the version returned will be the + * same as that returned from {@link #baseVersion()}. * * @return the maximum version * @since 9
--- a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -139,8 +139,7 @@ * line entirely. */ static void showSettings(boolean printToStderr, String optionFlag, - long initialHeapSize, long maxHeapSize, long stackSize, - boolean isServer) { + long initialHeapSize, long maxHeapSize, long stackSize) { initOutput(printToStderr); String opts[] = optionFlag.split(":"); @@ -149,8 +148,7 @@ : "all"; switch (optStr) { case "vm": - printVmSettings(initialHeapSize, maxHeapSize, - stackSize, isServer); + printVmSettings(initialHeapSize, maxHeapSize, stackSize); break; case "properties": printProperties(); @@ -159,8 +157,7 @@ printLocale(); break; default: - printVmSettings(initialHeapSize, maxHeapSize, stackSize, - isServer); + printVmSettings(initialHeapSize, maxHeapSize, stackSize); printProperties(); printLocale(); break; @@ -172,7 +169,7 @@ */ private static void printVmSettings( long initialHeapSize, long maxHeapSize, - long stackSize, boolean isServer) { + long stackSize) { ostream.println(VM_SETTINGS); if (stackSize != 0L) { @@ -190,8 +187,6 @@ ostream.println(INDENT + "Max. Heap Size (Estimated): " + SizePrefix.scaleValue(Runtime.getRuntime().maxMemory())); } - ostream.println(INDENT + "Ergonomics Machine Class: " - + ((isServer) ? "server" : "client")); ostream.println(INDENT + "Using VM: " + System.getProperty("java.vm.name")); ostream.println(); @@ -379,18 +374,6 @@ } /** - * Appends the vm Ergo message to the header, already created. - * initHelpSystem must be called before using this method. - */ - static void appendVmErgoMessage(boolean isServerClass, String vm) { - outBuf = outBuf.append(getLocalizedMessage("java.launcher.ergo.message1", - vm)); - outBuf = (isServerClass) ? outBuf.append(",\n") - .append(getLocalizedMessage("java.launcher.ergo.message2")) - .append("\n\n") : outBuf.append(".\n\n"); - } - - /** * Appends the last invariant part to the previously created messages, * and finishes up the printing to the desired output stream. * initHelpSystem must be called before using this method.
--- a/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties Tue Nov 22 10:48:24 2016 -0800 @@ -35,9 +35,6 @@ java.launcher.opt.vmselect =\ {0}\t to select the "{1}" VM\n java.launcher.opt.hotspot =\ {0}\t is a synonym for the "{1}" VM [deprecated]\n -java.launcher.ergo.message1 =\ The default VM is {0} -java.launcher.ergo.message2 =\ because you are running on a server-class machine.\n - # Translators please note do not translate the options themselves java.launcher.opt.footer =\ -cp <class search path of directories and zip/jar files>\n\ \ -classpath <class search path of directories and zip/jar files>\n\
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java Tue Nov 22 10:48:24 2016 -0800 @@ -740,7 +740,7 @@ } response = OCSP.check(Collections.singletonList(certId), - responderURI, issuerInfo, responderCert, params.date(), + responderURI, issuerInfo, responderCert, null, ocspExtensions); } } catch (IOException e) {
--- a/jdk/src/java.base/share/classes/sun/security/ssl/RSAClientKeyExchange.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/sun/security/ssl/RSAClientKeyExchange.java Tue Nov 22 10:48:24 2016 -0800 @@ -257,7 +257,13 @@ @Override void print(PrintStream s) throws IOException { - s.println("*** ClientKeyExchange, RSA PreMasterSecret, " + - protocolVersion); + String version = "version not available/extractable"; + + byte[] ba = preMaster.getEncoded(); + if (ba != null && ba.length >= 2) { + version = ProtocolVersion.valueOf(ba[0], ba[1]).name; + } + + s.println("*** ClientKeyExchange, RSA PreMasterSecret, " + version); } }
--- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -84,8 +84,10 @@ import sun.security.x509.*; import static java.security.KeyStore.*; +import java.security.Security; import static sun.security.tools.keytool.Main.Command.*; import static sun.security.tools.keytool.Main.Option.*; +import sun.security.util.DisabledAlgorithmConstraints; /** * This tool manages keystores. @@ -2428,6 +2430,10 @@ private void doPrintCert(final PrintStream out) throws Exception { if (jarfile != null) { + // reset "jdk.certpath.disabledAlgorithms" security property + // to be able to read jars which were signed with weak algorithms + Security.setProperty(DisabledAlgorithmConstraints.PROPERTY_JAR_DISABLED_ALGS, ""); + JarFile jf = new JarFile(jarfile, true); Enumeration<JarEntry> entries = jf.entries(); Set<CodeSigner> ss = new HashSet<>();
--- a/jdk/src/java.base/share/classes/sun/security/util/AbstractAlgorithmConstraints.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/sun/security/util/AbstractAlgorithmConstraints.java Tue Nov 22 10:48:24 2016 -0800 @@ -46,8 +46,12 @@ // Get algorithm constraints from the specified security property. static String[] getAlgorithms(String propertyName) { String property = AccessController.doPrivileged( - (PrivilegedAction<String>) () -> Security.getProperty( - propertyName)); + new PrivilegedAction<String>() { + @Override + public String run() { + return Security.getProperty(propertyName); + } + }); String[] algorithmsInProperty = null; if (property != null && !property.isEmpty()) {
--- a/jdk/src/java.base/share/classes/sun/security/util/AlgorithmDecomposer.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/sun/security/util/AlgorithmDecomposer.java Tue Nov 22 10:48:24 2016 -0800 @@ -34,20 +34,18 @@ */ public class AlgorithmDecomposer { - private static final Pattern transPattern = Pattern.compile("/"); - // '(?<!padd)in': match 'in' but not preceded with 'padd'. - private static final Pattern pattern = + private static final Pattern PATTERN = Pattern.compile("with|and|(?<!padd)in", Pattern.CASE_INSENSITIVE); private static Set<String> decomposeImpl(String algorithm) { + Set<String> elements = new HashSet<>(); // algorithm/mode/padding - String[] transTockens = transPattern.split(algorithm); + String[] transTokens = algorithm.split("/"); - Set<String> elements = new HashSet<>(); - for (String transTocken : transTockens) { - if (transTocken == null || transTocken.length() == 0) { + for (String transToken : transTokens) { + if (transToken == null || transToken.isEmpty()) { continue; } @@ -57,10 +55,10 @@ // <digest>with<encryption> // <digest>with<encryption>and<mgf> // <digest>with<encryption>in<format> - String[] tokens = pattern.split(transTocken); + String[] tokens = PATTERN.split(transToken); for (String token : tokens) { - if (token == null || token.length() == 0) { + if (token == null || token.isEmpty()) { continue; }
--- a/jdk/src/java.base/share/classes/sun/security/util/AnchorCertificates.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/sun/security/util/AnchorCertificates.java Tue Nov 22 10:48:24 2016 -0800 @@ -58,7 +58,7 @@ try { cacerts = KeyStore.getInstance("JKS"); try (FileInputStream fis = new FileInputStream(f)) { - cacerts.load(fis, "changeit".toCharArray()); + cacerts.load(fis, null); certs = new HashSet<>(); Enumeration<String> list = cacerts.aliases(); String alias;
--- a/jdk/src/java.base/share/classes/sun/security/util/DisabledAlgorithmConstraints.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/sun/security/util/DisabledAlgorithmConstraints.java Tue Nov 22 10:48:24 2016 -0800 @@ -39,6 +39,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.StringTokenizer; import java.util.TimeZone; import java.util.regex.Pattern; import java.util.regex.Matcher; @@ -240,10 +241,11 @@ private static class Constraints { private Map<String, Set<Constraint>> constraintsMap = new HashMap<>(); - private static final Pattern keySizePattern = Pattern.compile( - "keySize\\s*(<=|<|==|!=|>|>=)\\s*(\\d+)"); - private static final Pattern denyAfterPattern = Pattern.compile( - "denyAfter\\s+(\\d{4})-(\\d{2})-(\\d{2})"); + + private static class Holder { + private static final Pattern DENY_AFTER_PATTERN = Pattern.compile( + "denyAfter\\s+(\\d{4})-(\\d{2})-(\\d{2})"); + } public Constraints(String[] constraintArray) { for (String constraintEntry : constraintArray) { @@ -267,9 +269,11 @@ toUpperCase(Locale.ENGLISH)); policy = constraintEntry.substring(space + 1); } else { - constraintsMap.computeIfAbsent( - constraintEntry.toUpperCase(Locale.ENGLISH), - k -> new HashSet<>()); + algorithm = constraintEntry.toUpperCase(Locale.ENGLISH); + if (!constraintsMap.containsKey(algorithm)) { + constraintsMap.putIfAbsent(algorithm, + new HashSet<>()); + } continue; } @@ -283,15 +287,21 @@ for (String entry : policy.split("&")) { entry = entry.trim(); - Matcher matcher = keySizePattern.matcher(entry); - if (matcher.matches()) { + Matcher matcher; + if (entry.startsWith("keySize")) { if (debug != null) { debug.println("Constraints set to keySize: " + entry); } + StringTokenizer tokens = new StringTokenizer(entry); + if (!"keySize".equals(tokens.nextToken())) { + throw new IllegalArgumentException("Error in " + + "security property. Constraint unknown: " + + entry); + } c = new KeySizeConstraint(algorithm, - KeySizeConstraint.Operator.of(matcher.group(1)), - Integer.parseInt(matcher.group(2))); + KeySizeConstraint.Operator.of(tokens.nextToken()), + Integer.parseInt(tokens.nextToken())); } else if (entry.equalsIgnoreCase("jdkCA")) { if (debug != null) { @@ -305,7 +315,9 @@ c = new jdkCAConstraint(algorithm); jdkCALimit = true; - } else if(matcher.usePattern(denyAfterPattern).matches()) { + } else if(entry.startsWith("denyAfter") && + (matcher = Holder.DENY_AFTER_PATTERN.matcher(entry)) + .matches()) { if (debug != null) { debug.println("Constraints set to denyAfter"); }
--- a/jdk/src/java.base/share/classes/sun/util/locale/LocaleMatcher.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/classes/sun/util/locale/LocaleMatcher.java Tue Nov 22 10:48:24 2016 -0800 @@ -365,7 +365,7 @@ continue; } - String rangeForRegex = range.replaceAll("\\x2A", "\\\\p{Alnum}*"); + String rangeForRegex = range.replace("*", "\\p{Alnum}*"); while (rangeForRegex.length() > 0) { for (String tag : tags) { tag = tag.toLowerCase(Locale.ROOT); @@ -399,7 +399,7 @@ continue; } - String rangeForRegex = range.replaceAll("\\x2A", "\\\\p{Alnum}*"); + String rangeForRegex = range.replace("*", "\\p{Alnum}*"); while (rangeForRegex.length() > 0) { if (tag.matches(rangeForRegex)) { return true; @@ -447,7 +447,7 @@ } public static List<LanguageRange> parse(String ranges) { - ranges = ranges.replaceAll(" ", "").toLowerCase(Locale.ROOT); + ranges = ranges.replace(" ", "").toLowerCase(Locale.ROOT); if (ranges.startsWith("accept-language:")) { ranges = ranges.substring(16); // delete unnecessary prefix } @@ -536,6 +536,21 @@ return list; } + /** + * A faster alternative approach to String.replaceFirst(), if the given + * string is a literal String, not a regex. + */ + private static String replaceFirstSubStringMatch(String range, + String substr, String replacement) { + int pos = range.indexOf(substr); + if (pos == -1) { + return range; + } else { + return range.substring(0, pos) + replacement + + range.substring(pos + substr.length()); + } + } + private static String[] getEquivalentsForLanguage(String range) { String r = range; @@ -544,13 +559,16 @@ String equiv = LocaleEquivalentMaps.singleEquivMap.get(r); // Return immediately for performance if the first matching // subtag is found. - return new String[] {range.replaceFirst(r, equiv)}; + return new String[]{replaceFirstSubStringMatch(range, + r, equiv)}; } else if (LocaleEquivalentMaps.multiEquivsMap.containsKey(r)) { String[] equivs = LocaleEquivalentMaps.multiEquivsMap.get(r); + String[] result = new String[equivs.length]; for (int i = 0; i < equivs.length; i++) { - equivs[i] = range.replaceFirst(r, equivs[i]); + result[i] = replaceFirstSubStringMatch(range, + r, equivs[i]); } - return equivs; + return result; } // Truncate the last subtag simply. @@ -578,7 +596,9 @@ int len = index + subtag.length(); if (range.length() == len || range.charAt(len) == '-') { - return range.replaceFirst(subtag, LocaleEquivalentMaps.regionVariantEquivMap.get(subtag)); + return replaceFirstSubStringMatch(range, subtag, + LocaleEquivalentMaps.regionVariantEquivMap + .get(subtag)); } } }
--- a/jdk/src/java.base/share/lib/security/default.policy Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/lib/security/default.policy Tue Nov 22 10:48:24 2016 -0800 @@ -181,6 +181,6 @@ grant codeBase "jrt:/jdk.zipfs" { permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete"; permission java.lang.RuntimePermission "fileSystemProvider"; - permission java.util.PropertyPermission "*", "read"; + permission java.util.PropertyPermission "os.name", "read"; };
--- a/jdk/src/java.base/share/native/launcher/defines.h Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/native/launcher/defines.h Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -70,14 +70,6 @@ static const jboolean const_cpwildcard = JNI_FALSE; #endif /* EXPAND_CLASSPATH_WILDCARDS */ -#if defined(NEVER_ACT_AS_SERVER_CLASS_MACHINE) -static const jint const_ergo_class = NEVER_SERVER_CLASS; -#elif defined(ALWAYS_ACT_AS_SERVER_CLASS_MACHINE) -static const jint const_ergo_class = ALWAYS_SERVER_CLASS; -#else -static const jint const_ergo_class = DEFAULT_POLICY; -#endif /* NEVER_ACT_AS_SERVER_CLASS_MACHINE */ - #ifdef ENABLE_ARG_FILES static const jboolean const_disable_argfile = JNI_FALSE; #else
--- a/jdk/src/java.base/share/native/launcher/main.c Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/native/launcher/main.c Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 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 @@ -156,5 +156,5 @@ (const_progname != NULL) ? const_progname : *margv, (const_launcher != NULL) ? const_launcher : *margv, HAS_JAVA_ARGS, - const_cpwildcard, const_javaw, const_ergo_class); + const_cpwildcard, const_javaw, 0); }
--- a/jdk/src/java.base/share/native/libjava/FileInputStream.c Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/native/libjava/FileInputStream.c Tue Nov 22 10:48:24 2016 -0800 @@ -73,7 +73,7 @@ } JNIEXPORT jlong JNICALL -Java_java_io_FileInputStream_skip(JNIEnv *env, jobject this, jlong toSkip) { +Java_java_io_FileInputStream_skip0(JNIEnv *env, jobject this, jlong toSkip) { jlong cur = jlong_zero; jlong end = jlong_zero; FD fd = GET_FD(this, fis_fd); @@ -90,7 +90,7 @@ } JNIEXPORT jint JNICALL -Java_java_io_FileInputStream_available(JNIEnv *env, jobject this) { +Java_java_io_FileInputStream_available0(JNIEnv *env, jobject this) { jlong ret; FD fd = GET_FD(this, fis_fd); if (fd == -1) {
--- a/jdk/src/java.base/share/native/libjli/java.c Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/native/libjli/java.c Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 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 @@ -78,7 +78,6 @@ static jboolean _have_classpath = JNI_FALSE; static const char *_fVersion; static jboolean _wc_enabled = JNI_FALSE; -static jint _ergo_policy = DEFAULT_POLICY; /* * Entries for splash screen environment variables. @@ -218,7 +217,7 @@ jboolean javaargs, /* JAVA_ARGS */ jboolean cpwildcard, /* classpath wildcard*/ jboolean javaw, /* windows-only javaw */ - jint ergo /* ergonomics class policy */ + jint ergo /* unused */ ) { int mode = LM_UNKNOWN; @@ -236,7 +235,6 @@ _program_name = pname; _is_java_args = javaargs; _wc_enabled = cpwildcard; - _ergo_policy = ergo; InitLauncher(javaw); DumpState(); @@ -431,7 +429,7 @@ LEAVE(); } - FreeKnownVMs(); /* after last possible PrintUsage() */ + FreeKnownVMs(); /* after last possible PrintUsage */ if (JLI_IsTraceLauncher()) { end = CounterGet(); @@ -669,11 +667,6 @@ /* use the default VM type if not specified (no alias processing) */ if (jvmtype == NULL) { char* result = knownVMs[0].name+1; - /* Use a different VM type if we are on a server class machine? */ - if ((knownVMs[0].flag == VM_IF_SERVER_CLASS) && - (ServerClassMachine() == JNI_TRUE)) { - result = knownVMs[0].server_class+1; - } JLI_TraceLauncher("Default VM: %s\n", result); return result; } @@ -1777,15 +1770,14 @@ jclass cls = GetLauncherHelperClass(env); NULL_CHECK(cls); NULL_CHECK(showSettingsID = (*env)->GetStaticMethodID(env, cls, - "showSettings", "(ZLjava/lang/String;JJJZ)V")); + "showSettings", "(ZLjava/lang/String;JJJ)V")); NULL_CHECK(joptString = (*env)->NewStringUTF(env, optString)); (*env)->CallStaticVoidMethod(env, cls, showSettingsID, USE_STDERR, joptString, (jlong)initialHeapSize, (jlong)maxHeapSize, - (jlong)threadStackSize, - ServerClassMachine()); + (jlong)threadStackSize); } /** @@ -1812,7 +1804,7 @@ static void PrintUsage(JNIEnv* env, jboolean doXUsage) { - jmethodID initHelp, vmSelect, vmSynonym, vmErgo, printHelp, printXUsageMessage; + jmethodID initHelp, vmSelect, vmSynonym, printHelp, printXUsageMessage; jstring jprogname, vm1, vm2; int i; jclass cls = GetLauncherHelperClass(env); @@ -1831,8 +1823,6 @@ NULL_CHECK(vmSynonym = (*env)->GetStaticMethodID(env, cls, "appendVmSynonymMessage", "(Ljava/lang/String;Ljava/lang/String;)V")); - NULL_CHECK(vmErgo = (*env)->GetStaticMethodID(env, cls, - "appendVmErgoMessage", "(ZLjava/lang/String;)V")); NULL_CHECK(printHelp = (*env)->GetStaticMethodID(env, cls, "printHelpMessage", "(Z)V")); @@ -1845,13 +1835,6 @@ /* Assemble the other variant part of the usage */ - if ((knownVMs[0].flag == VM_KNOWN) || - (knownVMs[0].flag == VM_IF_SERVER_CLASS)) { - NULL_CHECK(vm1 = (*env)->NewStringUTF(env, knownVMs[0].name)); - NULL_CHECK(vm2 = (*env)->NewStringUTF(env, knownVMs[0].name+1)); - (*env)->CallStaticVoidMethod(env, cls, vmSelect, vm1, vm2); - CHECK_EXCEPTION_RETURN(); - } for (i=1; i<knownVMsCount; i++) { if (knownVMs[i].flag == VM_KNOWN) { NULL_CHECK(vm1 = (*env)->NewStringUTF(env, knownVMs[i].name)); @@ -1869,20 +1852,6 @@ } } - /* The first known VM is the default */ - { - jboolean isServerClassMachine = ServerClassMachine(); - - const char* defaultVM = knownVMs[0].name+1; - if ((knownVMs[0].flag == VM_IF_SERVER_CLASS) && isServerClassMachine) { - defaultVM = knownVMs[0].server_class+1; - } - - NULL_CHECK(vm1 = (*env)->NewStringUTF(env, defaultVM)); - (*env)->CallStaticVoidMethod(env, cls, vmErgo, isServerClassMachine, vm1); - CHECK_EXCEPTION_RETURN(); - } - /* Complete the usage message and print to stderr*/ (*env)->CallStaticVoidMethod(env, cls, printHelp, USE_STDERR); } @@ -2011,19 +1980,7 @@ } else if (!JLI_StrCCmp(tmpPtr, "ERROR")) { vmType = VM_ERROR; } else if (!JLI_StrCCmp(tmpPtr, "IF_SERVER_CLASS")) { - tmpPtr += JLI_StrCSpn(tmpPtr, whiteSpace); - if (*tmpPtr != 0) { - tmpPtr += JLI_StrSpn(tmpPtr, whiteSpace); - } - if (*tmpPtr == 0) { - JLI_ReportErrorMessage(CFG_WARN4, lineno, jvmCfgName); - } else { - /* Null terminate server class VM name */ - serverClassVMName = tmpPtr; - tmpPtr += JLI_StrCSpn(tmpPtr, whiteSpace); - *tmpPtr = 0; - vmType = VM_IF_SERVER_CLASS; - } + /* ignored */ } else { JLI_ReportErrorMessage(CFG_WARN5, lineno, &jvmCfgName[0]); vmType = VM_KNOWN; @@ -2043,11 +2000,6 @@ JLI_TraceLauncher(" name: %s vmType: %s alias: %s\n", knownVMs[cnt].name, "VM_ALIASED_TO", knownVMs[cnt].alias); break; - case VM_IF_SERVER_CLASS: - knownVMs[cnt].server_class = JLI_StringDup(serverClassVMName); - JLI_TraceLauncher(" name: %s vmType: %s server_class: %s\n", - knownVMs[cnt].name, "VM_IF_SERVER_CLASS", knownVMs[cnt].server_class); - break; } cnt++; } @@ -2197,12 +2149,6 @@ return _launcher_name; } -jint -GetErgoPolicy() -{ - return _ergo_policy; -} - jboolean IsJavaArgs() { @@ -2267,17 +2213,6 @@ printf("\tlauncher name:%s\n", GetLauncherName()); printf("\tjavaw:%s\n", (IsJavaw() == JNI_TRUE) ? "on" : "off"); printf("\tfullversion:%s\n", GetFullVersion()); - printf("\tergo_policy:"); - switch(GetErgoPolicy()) { - case NEVER_SERVER_CLASS: - printf("NEVER_ACT_AS_A_SERVER_CLASS_MACHINE\n"); - break; - case ALWAYS_SERVER_CLASS: - printf("ALWAYS_ACT_AS_A_SERVER_CLASS_MACHINE\n"); - break; - default: - printf("DEFAULT_ERGONOMICS_POLICY\n"); - } } /*
--- a/jdk/src/java.base/share/native/libjli/java.h Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/share/native/libjli/java.h Tue Nov 22 10:48:24 2016 -0800 @@ -166,19 +166,10 @@ void AddOption(char *str, void *info); jboolean IsWhiteSpaceOption(const char* name); -enum ergo_policy { - DEFAULT_POLICY = 0, - NEVER_SERVER_CLASS, - ALWAYS_SERVER_CLASS -}; - const char* GetProgramName(); const char* GetFullVersion(); jboolean IsJavaArgs(); jboolean IsJavaw(); -jint GetErgoPolicy(); - -jboolean ServerClassMachine(); int ContinueInNewThread(InvocationFunctions* ifn, jlong threadStackSize, int argc, char** argv,
--- a/jdk/src/java.base/unix/conf/aarch64/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/unix/conf/aarch64/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -21,10 +21,9 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -# # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/amd64/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/unix/conf/amd64/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -21,10 +21,9 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -# # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/i586/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/unix/conf/i586/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -23,13 +23,13 @@ # # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the # "-XXaltjvm=<jvm_dir>" option, but that too is unsupported # and may not be available in a future release. # --client IF_SERVER_CLASS -server -server KNOWN +-client KNOWN -minimal KNOWN
--- a/jdk/src/java.base/unix/conf/ia64/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/unix/conf/ia64/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -1,6 +1,3 @@ -# -# -# # Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # @@ -24,11 +21,9 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -# -# # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/ppc64/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/unix/conf/ppc64/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -23,7 +23,7 @@ # # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/ppc64le/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/unix/conf/ppc64le/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -23,7 +23,7 @@ # # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/s390x/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/unix/conf/s390x/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -23,7 +23,7 @@ # # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/sparc/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/unix/conf/sparc/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -1,4 +1,4 @@ -# Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2001, 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 @@ -23,13 +23,13 @@ # # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the # "-XXaltjvm=<jvm_dir>" option, but that too is unsupported # and may not be available in a future release. # --client IF_SERVER_CLASS -server -server KNOWN +-client KNOWN -minimal KNOWN
--- a/jdk/src/java.base/unix/conf/sparcv9/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/unix/conf/sparcv9/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -23,7 +23,7 @@ # # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/conf/zero/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/unix/conf/zero/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -21,10 +21,9 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -# # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/unix/native/libjli/ergo.c Mon Nov 14 10:00:15 2016 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ -/* - * Copyright (c) 1998, 2011, 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. - */ - -/* This file houses the common methods for VM ergonomics the platforms - * are split into ergo_sparc and ergo_x86, and they could be split more - * in the future if required. The following comments are not entirely - * true after bifurcation of the platform specific files. - */ - -/* - * The following methods (down to ServerClassMachine()) answer - * the question about whether a machine is a "server-class" - * machine. A server-class machine is loosely defined as one - * with 2 or more processors and 2 gigabytes or more physical - * memory. The definition of a processor is a physical package, - * not a hyperthreaded chip masquerading as a multi-processor. - * The definition of memory is also somewhat fuzzy, since x86 - * machines seem not to report all the memory in their DIMMs, we - * think because of memory mapping of graphics cards, etc. - * - * This code is somewhat more confused with #ifdef's than we'd - * like because this file is used by both Solaris and Linux - * platforms, and so needs to be parameterized for SPARC and - * i586 hardware. The other Linux platforms (amd64 and ia64) - * don't even ask this question, because they only come with - * server JVMs. - */ - -#include "ergo.h" - -/* Dispatch to the platform-specific definition of "server-class" */ -jboolean -ServerClassMachine(void) { - jboolean result; - switch(GetErgoPolicy()) { - case NEVER_SERVER_CLASS: - return JNI_FALSE; - case ALWAYS_SERVER_CLASS: - return JNI_TRUE; - default: - result = ServerClassMachineImpl(); - JLI_TraceLauncher("ServerClassMachine: returns default value of %s\n", - (result == JNI_TRUE ? "true" : "false")); - return result; - } -} - -#ifdef USE_GENERIC_ERGO -/* Ask the OS how many processors there are. */ -static unsigned long -physical_processors(void) { - const unsigned long sys_processors = sysconf(_SC_NPROCESSORS_CONF); - JLI_TraceLauncher("sysconf(_SC_NPROCESSORS_CONF): %lu\n", sys_processors); - return sys_processors; -} - -jboolean -ServerClassMachineImpl(void) { - jboolean result = JNI_FALSE; - /* How big is a server class machine? */ - const unsigned long server_processors = 2UL; - const uint64_t server_memory = 2UL * GB; - const uint64_t actual_memory = physical_memory(); - - /* Is this a server class machine? */ - if (actual_memory >= server_memory) { - const unsigned long actual_processors = physical_processors(); - if (actual_processors >= server_processors) { - result = JNI_TRUE; - } - } - JLI_TraceLauncher("unix_" LIBARCHNAME "_ServerClassMachine: %s\n", - (result == JNI_TRUE ? "JNI_TRUE" : "JNI_FALSE")); - return result; -} -#endif - -/* Compute physical memory by asking the OS */ -uint64_t -physical_memory(void) { - const uint64_t pages = (uint64_t) sysconf(_SC_PHYS_PAGES); - const uint64_t page_size = (uint64_t) sysconf(_SC_PAGESIZE); - const uint64_t result = pages * page_size; -# define UINT64_FORMAT "%" PRIu64 - - JLI_TraceLauncher("pages: " UINT64_FORMAT - " page_size: " UINT64_FORMAT - " physical memory: " UINT64_FORMAT " (%.3fGB)\n", - pages, page_size, result, result / (double) GB); - return result; -}
--- a/jdk/src/java.base/unix/native/libjli/ergo.h Mon Nov 14 10:00:15 2016 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/* - * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#ifndef _ERGO_H -#define _ERGO_H - -#include <inttypes.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <sys/stat.h> -#include <unistd.h> -#include <sys/types.h> - -#include "java.h" - -jboolean ServerClassMachineImpl(void); -uint64_t physical_memory(void); - -#endif /* _ERGO_H */
--- a/jdk/src/java.base/unix/native/libjli/ergo_i586.c Mon Nov 14 10:00:15 2016 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,323 +0,0 @@ -/* - * Copyright (c) 1998, 2007, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#include "ergo.h" - -static unsigned long physical_processors(void); - -#ifdef __solaris__ - -/* - * A utility method for asking the CPU about itself. - * There's a corresponding version of linux-i586 - * because the compilers are different. - */ -static void -get_cpuid(uint32_t arg, - uint32_t* eaxp, - uint32_t* ebxp, - uint32_t* ecxp, - uint32_t* edxp) { -#ifdef _LP64 - asm( - /* rbx is a callee-saved register */ - " movq %rbx, %r11 \n" - /* rdx and rcx are 3rd and 4th argument registers */ - " movq %rdx, %r10 \n" - " movq %rcx, %r9 \n" - " movl %edi, %eax \n" - " cpuid \n" - " movl %eax, (%rsi)\n" - " movl %ebx, (%r10)\n" - " movl %ecx, (%r9) \n" - " movl %edx, (%r8) \n" - /* Restore rbx */ - " movq %r11, %rbx"); -#else - /* EBX is a callee-saved register */ - asm(" pushl %ebx"); - /* Need ESI for storing through arguments */ - asm(" pushl %esi"); - asm(" movl 8(%ebp), %eax \n" - " cpuid \n" - " movl 12(%ebp), %esi \n" - " movl %eax, (%esi) \n" - " movl 16(%ebp), %esi \n" - " movl %ebx, (%esi) \n" - " movl 20(%ebp), %esi \n" - " movl %ecx, (%esi) \n" - " movl 24(%ebp), %esi \n" - " movl %edx, (%esi) "); - /* Restore ESI and EBX */ - asm(" popl %esi"); - /* Restore EBX */ - asm(" popl %ebx"); -#endif /* LP64 */ -} - -/* The definition of a server-class machine for solaris-i586/amd64 */ -jboolean -ServerClassMachineImpl(void) { - jboolean result = JNI_FALSE; - /* How big is a server class machine? */ - const unsigned long server_processors = 2UL; - const uint64_t server_memory = 2UL * GB; - /* - * We seem not to get our full complement of memory. - * We allow some part (1/8?) of the memory to be "missing", - * based on the sizes of DIMMs, and maybe graphics cards. - */ - const uint64_t missing_memory = 256UL * MB; - const uint64_t actual_memory = physical_memory(); - - /* Is this a server class machine? */ - if (actual_memory >= (server_memory - missing_memory)) { - const unsigned long actual_processors = physical_processors(); - if (actual_processors >= server_processors) { - result = JNI_TRUE; - } - } - JLI_TraceLauncher("solaris_" LIBARCHNAME "_ServerClassMachine: %s\n", - (result == JNI_TRUE ? "true" : "false")); - return result; -} - -#endif /* __solaris__ */ - -#ifdef __linux__ - -/* - * A utility method for asking the CPU about itself. - * There's a corresponding version of solaris-i586 - * because the compilers are different. - */ -static void -get_cpuid(uint32_t arg, - uint32_t* eaxp, - uint32_t* ebxp, - uint32_t* ecxp, - uint32_t* edxp) { -#ifdef _LP64 - __asm__ volatile (/* Instructions */ - " movl %4, %%eax \n" - " cpuid \n" - " movl %%eax, (%0)\n" - " movl %%ebx, (%1)\n" - " movl %%ecx, (%2)\n" - " movl %%edx, (%3)\n" - : /* Outputs */ - : /* Inputs */ - "r" (eaxp), - "r" (ebxp), - "r" (ecxp), - "r" (edxp), - "r" (arg) - : /* Clobbers */ - "%rax", "%rbx", "%rcx", "%rdx", "memory" - ); -#else /* _LP64 */ - uint32_t value_of_eax = 0; - uint32_t value_of_ebx = 0; - uint32_t value_of_ecx = 0; - uint32_t value_of_edx = 0; - __asm__ volatile (/* Instructions */ - /* ebx is callee-save, so push it */ - " pushl %%ebx \n" - " movl %4, %%eax \n" - " cpuid \n" - " movl %%eax, %0 \n" - " movl %%ebx, %1 \n" - " movl %%ecx, %2 \n" - " movl %%edx, %3 \n" - /* restore ebx */ - " popl %%ebx \n" - - : /* Outputs */ - "=m" (value_of_eax), - "=m" (value_of_ebx), - "=m" (value_of_ecx), - "=m" (value_of_edx) - : /* Inputs */ - "m" (arg) - : /* Clobbers */ - "%eax", "%ecx", "%edx" - ); - *eaxp = value_of_eax; - *ebxp = value_of_ebx; - *ecxp = value_of_ecx; - *edxp = value_of_edx; -#endif /* _LP64 */ -} - -/* The definition of a server-class machine for linux-i586 */ -jboolean -ServerClassMachineImpl(void) { - jboolean result = JNI_FALSE; - /* How big is a server class machine? */ - const unsigned long server_processors = 2UL; - const uint64_t server_memory = 2UL * GB; - /* - * We seem not to get our full complement of memory. - * We allow some part (1/8?) of the memory to be "missing", - * based on the sizes of DIMMs, and maybe graphics cards. - */ - const uint64_t missing_memory = 256UL * MB; - const uint64_t actual_memory = physical_memory(); - - /* Is this a server class machine? */ - if (actual_memory >= (server_memory - missing_memory)) { - const unsigned long actual_processors = physical_processors(); - if (actual_processors >= server_processors) { - result = JNI_TRUE; - } - } - JLI_TraceLauncher("linux_" LIBARCHNAME "_ServerClassMachine: %s\n", - (result == JNI_TRUE ? "true" : "false")); - return result; -} -#endif /* __linux__ */ - -/* - * Routines shared by solaris-i586 and linux-i586. - */ - -enum HyperThreadingSupport_enum { - hts_supported = 1, - hts_too_soon_to_tell = 0, - hts_not_supported = -1, - hts_not_pentium4 = -2, - hts_not_intel = -3 -}; -typedef enum HyperThreadingSupport_enum HyperThreadingSupport; - -/* Determine if hyperthreading is supported */ -static HyperThreadingSupport -hyperthreading_support(void) { - HyperThreadingSupport result = hts_too_soon_to_tell; - /* Bits 11 through 8 is family processor id */ -# define FAMILY_ID_SHIFT 8 -# define FAMILY_ID_MASK 0xf - /* Bits 23 through 20 is extended family processor id */ -# define EXT_FAMILY_ID_SHIFT 20 -# define EXT_FAMILY_ID_MASK 0xf - /* Pentium 4 family processor id */ -# define PENTIUM4_FAMILY_ID 0xf - /* Bit 28 indicates Hyper-Threading Technology support */ -# define HT_BIT_SHIFT 28 -# define HT_BIT_MASK 1 - uint32_t vendor_id[3] = { 0U, 0U, 0U }; - uint32_t value_of_eax = 0U; - uint32_t value_of_edx = 0U; - uint32_t dummy = 0U; - - /* Yes, this is supposed to be [0], [2], [1] */ - get_cpuid(0, &dummy, &vendor_id[0], &vendor_id[2], &vendor_id[1]); - JLI_TraceLauncher("vendor: %c %c %c %c %c %c %c %c %c %c %c %c \n", - ((vendor_id[0] >> 0) & 0xff), - ((vendor_id[0] >> 8) & 0xff), - ((vendor_id[0] >> 16) & 0xff), - ((vendor_id[0] >> 24) & 0xff), - ((vendor_id[1] >> 0) & 0xff), - ((vendor_id[1] >> 8) & 0xff), - ((vendor_id[1] >> 16) & 0xff), - ((vendor_id[1] >> 24) & 0xff), - ((vendor_id[2] >> 0) & 0xff), - ((vendor_id[2] >> 8) & 0xff), - ((vendor_id[2] >> 16) & 0xff), - ((vendor_id[2] >> 24) & 0xff)); - get_cpuid(1, &value_of_eax, &dummy, &dummy, &value_of_edx); - JLI_TraceLauncher("value_of_eax: 0x%x value_of_edx: 0x%x\n", - value_of_eax, value_of_edx); - if ((((value_of_eax >> FAMILY_ID_SHIFT) & FAMILY_ID_MASK) == PENTIUM4_FAMILY_ID) || - (((value_of_eax >> EXT_FAMILY_ID_SHIFT) & EXT_FAMILY_ID_MASK) != 0)) { - if ((((vendor_id[0] >> 0) & 0xff) == 'G') && - (((vendor_id[0] >> 8) & 0xff) == 'e') && - (((vendor_id[0] >> 16) & 0xff) == 'n') && - (((vendor_id[0] >> 24) & 0xff) == 'u') && - (((vendor_id[1] >> 0) & 0xff) == 'i') && - (((vendor_id[1] >> 8) & 0xff) == 'n') && - (((vendor_id[1] >> 16) & 0xff) == 'e') && - (((vendor_id[1] >> 24) & 0xff) == 'I') && - (((vendor_id[2] >> 0) & 0xff) == 'n') && - (((vendor_id[2] >> 8) & 0xff) == 't') && - (((vendor_id[2] >> 16) & 0xff) == 'e') && - (((vendor_id[2] >> 24) & 0xff) == 'l')) { - if (((value_of_edx >> HT_BIT_SHIFT) & HT_BIT_MASK) == HT_BIT_MASK) { - JLI_TraceLauncher("Hyperthreading supported\n"); - result = hts_supported; - } else { - JLI_TraceLauncher("Hyperthreading not supported\n"); - result = hts_not_supported; - } - } else { - JLI_TraceLauncher("Not GenuineIntel\n"); - result = hts_not_intel; - } - } else { - JLI_TraceLauncher("not Pentium 4 or extended\n"); - result = hts_not_pentium4; - } - return result; -} - -/* Determine how many logical processors there are per CPU */ -static unsigned int -logical_processors_per_package(void) { - /* - * After CPUID with EAX==1, register EBX bits 23 through 16 - * indicate the number of logical processors per package - */ -# define NUM_LOGICAL_SHIFT 16 -# define NUM_LOGICAL_MASK 0xff - unsigned int result = 1U; - const HyperThreadingSupport hyperthreading = hyperthreading_support(); - - if (hyperthreading == hts_supported) { - uint32_t value_of_ebx = 0U; - uint32_t dummy = 0U; - - get_cpuid(1, &dummy, &value_of_ebx, &dummy, &dummy); - result = (value_of_ebx >> NUM_LOGICAL_SHIFT) & NUM_LOGICAL_MASK; - JLI_TraceLauncher("logical processors per package: %u\n", result); - } - return result; -} - -/* Compute the number of physical processors, not logical processors */ -static unsigned long -physical_processors(void) { - const long sys_processors = sysconf(_SC_NPROCESSORS_CONF); - unsigned long result = sys_processors; - - JLI_TraceLauncher("sysconf(_SC_NPROCESSORS_CONF): %lu\n", sys_processors); - if (sys_processors > 1) { - unsigned int logical_processors = logical_processors_per_package(); - if (logical_processors > 1) { - result = (unsigned long) sys_processors / logical_processors; - } - } - JLI_TraceLauncher("physical processors: %lu\n", result); - return result; -}
--- a/jdk/src/java.base/windows/conf/amd64/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/windows/conf/amd64/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -1,6 +1,3 @@ -# -# -# # Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # @@ -27,7 +24,7 @@ # # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/windows/conf/i586/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/windows/conf/i586/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -23,7 +23,7 @@ # # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/windows/conf/ia64/jvm.cfg Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/windows/conf/ia64/jvm.cfg Tue Nov 22 10:48:24 2016 -0800 @@ -1,6 +1,3 @@ -# -# -# # Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # @@ -24,10 +21,9 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -# # List of JVMs that can be used as an option to java, javac, etc. # Order is important -- first in this list is the default JVM. -# NOTE that this both this file and its format are UNSUPPORTED and +# NOTE that both this file and its format are UNSUPPORTED and # WILL GO AWAY in a future release. # # You may also select a JVM in an arbitrary location with the
--- a/jdk/src/java.base/windows/native/libjli/java_md.c Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/java.base/windows/native/libjli/java_md.c Tue Nov 22 10:48:24 2016 -0800 @@ -639,11 +639,6 @@ } } -jboolean -ServerClassMachine() { - return (GetErgoPolicy() == ALWAYS_SERVER_CLASS) ? JNI_TRUE : JNI_FALSE; -} - /* * Wrapper for platform dependent unsetenv function. */
--- a/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/ConsoleReader.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/ConsoleReader.java Tue Nov 22 10:48:24 2016 -0800 @@ -3222,7 +3222,7 @@ } //where: private Pattern CURSOR_COLUMN_PATTERN = - Pattern.compile("(?<prefix>.*)\033\\[[0-9]+;(?<column>[0-9]+)R"); + Pattern.compile("(?<prefix>.*)\033\\[[0-9]+;(?<column>[0-9]+)R", Pattern.DOTALL); /** * Read a line for unsupported terminals.
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties Tue Nov 22 10:48:24 2016 -0800 @@ -71,9 +71,7 @@ \ separated list of elements each using one the following forms:\n\ \ <glob-pattern>\n\ \ glob:<glob-pattern>\n\ -\ regex:<regex-pattern>\n\ -\ @<filename> where filename is the name of a file containing patterns to be\ -\ used, one pattern per line\n\ +\ regex:<regex-pattern> main.opt.full-version=\
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/DirArchive.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/DirArchive.java Tue Nov 22 10:48:24 2016 -0800 @@ -92,7 +92,7 @@ public DirArchive(Path dirPath, Consumer<String> log) { Objects.requireNonNull(dirPath); if (!Files.isDirectory(dirPath)) { - throw new IllegalArgumentException("Not a directory"); + throw new IllegalArgumentException(dirPath + " is not a directory"); } chop = dirPath.toString().length() + 1; this.moduleName = Objects.requireNonNull(dirPath.getFileName()).toString();
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java Tue Nov 22 10:48:24 2016 -0800 @@ -212,7 +212,7 @@ mainOptions.add(new PlugOption(true, (task, opt, arg) -> { Path path = Paths.get(arg); if (!Files.exists(path) || !Files.isDirectory(path)) { - throw newBadArgs("err.image.must.exist"); + throw newBadArgs("err.image.must.exist", path); } existingImage = path.toAbsolutePath(); }, true, POST_PROCESS));
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties Tue Nov 22 10:48:24 2016 -0800 @@ -91,7 +91,7 @@ err.mods.must.be.specified:no modules specified to {0} err.path.not.found=path not found: {0} err.path.not.valid=invalid path: {0} -err.image.must.exist=image does not exist or is not a directory +err.image.must.exist=image {0} does not exist or is not a directory err.existing.image.invalid=existing image is not valid err.file.not.found=cannot find file: {0} err.file.error=cannot access file: {0}
--- a/jdk/test/TEST.ROOT Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/TEST.ROOT Tue Nov 22 10:48:24 2016 -0800 @@ -18,7 +18,7 @@ othervm.dirs=java/awt java/beans javax/accessibility javax/imageio javax/sound javax/print javax/management com/sun/awt sun/awt sun/java2d sun/pisces javax/xml/jaxp/testng/validation java/lang/ProcessHandle # Tests that cannot run concurrently -exclusiveAccess.dirs=java/rmi/Naming java/util/prefs sun/management/jmxremote sun/tools/jstatd sun/security/mscapi java/util/stream javax/rmi +exclusiveAccess.dirs=java/rmi/Naming java/util/prefs sun/management/jmxremote sun/tools/jstatd sun/security/mscapi java/util/stream javax/rmi com/sun/corba/cachedSocket # Group definitions groups=TEST.groups [closed/TEST.groups]
--- a/jdk/test/com/sun/net/httpserver/TEST.properties Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/com/sun/net/httpserver/TEST.properties Tue Nov 22 10:48:24 2016 -0800 @@ -1,1 +1,1 @@ -modules = jdk.httpserver \ No newline at end of file +modules = jdk.httpserver java.logging
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/Locale/Bug8166994.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,74 @@ +/* + * 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. + */ +/* + * @test + * @bug 8166884 + * @summary Checks the subsequent call to parse the same language ranges + * which must generate the same list of language ranges + * i.e. the priority list containing equivalents, as in the + * first call + */ + +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.stream.Collectors; + +public class Bug8166994 { + + public static void main(String[] args) { + List<String> list = Arrays.asList("ccq-aa", "ybd-aa", "rki-aa"); + String ranges = "ccq-aa"; + testParseConsistency(list, ranges); + + // consecutive call to check the language range parse consistency + testParseConsistency(list, ranges); + + // another case with ranges consisting of multiple equivalents and + // single equivalents + list = Arrays.asList("gfx-xz", "oun-xz", "mwj-xz", "vaj-xz", + "taj-xy", "tsf-xy"); + ranges = "gfx-xz, taj-xy"; + testParseConsistency(list, ranges); + // consecutive call to check the language range parse consistency + testParseConsistency(list, ranges); + + } + + private static void testParseConsistency(List<String> list, String ranges) { + List<String> priorityList = parseRanges(ranges); + if (!list.equals(priorityList)) { + throw new RuntimeException("Failed to parse the language range [" + + ranges + "], Expected: " + list + " Found: " + + priorityList); + } + } + + private static List<String> parseRanges(String s) { + return Locale.LanguageRange.parse(s).stream() + .map(Locale.LanguageRange::getRange) + .collect(Collectors.toList()); + } + +} +
--- a/jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/javax/net/ssl/DTLS/DTLSOverDatagram.java Tue Nov 22 10:48:24 2016 -0800 @@ -176,7 +176,10 @@ boolean finished = onReceiveTimeout( engine, peerAddr, side, packets); + log(side, "Reproduced " + packets.size() + " packets"); for (DatagramPacket p : packets) { + printHex("Reproduced packet", + p.getData(), p.getOffset(), p.getLength()); socket.send(p); } @@ -334,7 +337,7 @@ String side, List<DatagramPacket> packets) throws Exception { boolean endLoops = false; - int loops = MAX_HANDSHAKE_LOOPS; + int loops = MAX_HANDSHAKE_LOOPS / 2; while (!endLoops && (serverException == null) && (clientException == null)) { @@ -350,7 +353,8 @@ SSLEngineResult.Status rs = r.getStatus(); SSLEngineResult.HandshakeStatus hs = r.getHandshakeStatus(); - log(side, "====packet(" + loops + ", " + rs + ", " + hs + ")===="); + log(side, "----produce handshake packet(" + + loops + ", " + rs + ", " + hs + ")----"); if (rs == SSLEngineResult.Status.BUFFER_OVERFLOW) { // the client maximum fragment size config does not work? throw new Exception("Buffer overflow: " +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/net/ssl/interop/ClientHelloChromeInterOp.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,75 @@ +/* + * 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. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/* + * @test + * @bug 8169362 + * @summary Interop automated testing with Chrome + * @modules java.base/sun.security.util + * @run main/othervm ClientHelloChromeInterOp + */ + +import java.util.Base64; +import sun.security.util.HexDumpEncoder; + +public class ClientHelloChromeInterOp extends ClientHelloInterOp { + // The ClientHello message. + // + // Captured from Chrome browser (version 54.0.2840.87 m (64-bit)) on + // Windows 10. + private final static String ClientHelloMsg = + "FgMBAL4BAAC6AwOWBEueOntnurZ+WAW0D9Qn2HpdzXLu0MgDjsD9e5JU6AAAIsA\n" + + "rwC/ALMAwzKnMqMwUzBPACcATwArAFACcAJ0ALwA1AAoBAABv/wEAAQAAAAATAB\n" + + "EAAA53d3cub3JhY2xlLmNvbQAXAAAAIwAAAA0AEgAQBgEGAwUBBQMEAQQDAgECA\n" + + "wAFAAUBAAAAAAASAAAAEAAOAAwCaDIIaHR0cC8xLjF1UAAAAAsAAgEAAAoACAAG\n" + + "AB0AFwAY"; + + /* + * Main entry point for this test. + */ + public static void main(String args[]) throws Exception { + (new ClientHelloChromeInterOp()).run(); + } + + @Override + protected byte[] createClientHelloMessage() { + byte[] bytes = Base64.getMimeDecoder().decode(ClientHelloMsg); + + // Dump the hex codes of the ClientHello message so that developers + // can easily check whether the message is captured correct or not. + HexDumpEncoder dump = new HexDumpEncoder(); + System.out.println("The ClientHello message used"); + try { + dump.encodeBuffer(bytes, System.out); + } catch (Exception e) { + // ignore + } + + return bytes; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/net/ssl/interop/ClientHelloInterOp.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,432 @@ +/* + * 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 javax.net.ssl.*; +import javax.net.ssl.SSLEngineResult.*; +import java.io.*; +import java.nio.*; +import java.security.KeyStore; +import java.security.PrivateKey; +import java.security.KeyFactory; +import java.security.cert.Certificate; +import java.security.cert.CertificateFactory; +import java.security.spec.*; +import java.util.Base64; + +public abstract class ClientHelloInterOp { + + /* + * Certificates and keys used in the test. + */ + // Trusted certificates. + private final static String[] trustedCertStrs = { + // SHA256withECDSA, curve prime256v1 + // Validity + // Not Before: Nov 9 03:24:05 2016 GMT + // Not After : Oct 20 03:24:05 2037 GMT + "-----BEGIN CERTIFICATE-----\n" + + "MIICHDCCAcGgAwIBAgIJAM83C/MVp9F5MAoGCCqGSM49BAMCMDsxCzAJBgNVBAYT\n" + + "AlVTMQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2VyaXZj\n" + + "ZTAeFw0xNjExMDkwMzI0MDVaFw0zNzEwMjAwMzI0MDVaMDsxCzAJBgNVBAYTAlVT\n" + + "MQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2VyaXZjZTBZ\n" + + "MBMGByqGSM49AgEGCCqGSM49AwEHA0IABGeQXwyeNyU4UAATfwUbMO5zaREI21Wh\n" + + "bds6WDu+PmfK8SWsTgsgpYxBRui+fZtYqSmbdjkurvAQ3j2fvN++BtWjga0wgaow\n" + + "HQYDVR0OBBYEFDF/OeJ82qBSRkAm1rdZUPbWfDzyMGsGA1UdIwRkMGKAFDF/OeJ8\n" + + "2qBSRkAm1rdZUPbWfDzyoT+kPTA7MQswCQYDVQQGEwJVUzENMAsGA1UEChMESmF2\n" + + "YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2WCCQDPNwvzFafReTAPBgNV\n" + + "HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAKBggqhkjOPQQDAgNJADBGAiEAlHQY\n" + + "QFPlODOsjLVQYSxgeSUvYzMp0vP8naeVB9bfFG8CIQCFfrKZvhq9z3bOtlYKxs2a\n" + + "EWUjUZ82a1JTqkP+lgHY5A==\n" + + "-----END CERTIFICATE-----", + + // SHA256withRSA, 2048 bits + // Validity + // Not Before: Nov 9 03:24:16 2016 GMT + // Not After : Oct 20 03:24:16 2037 GMT + "-----BEGIN CERTIFICATE-----\n" + + "MIIDpzCCAo+gAwIBAgIJAJAYpR2aIlA1MA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNV\n" + + "BAYTAlVTMQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2Vy\n" + + "aXZjZTAeFw0xNjExMDkwMzI0MTZaFw0zNzEwMjAwMzI0MTZaMDsxCzAJBgNVBAYT\n" + + "AlVTMQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2VyaXZj\n" + + "ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL+F/FTPODYzsU0Pakfp\n" + + "lsh88YoQWZPjABhCU+HPsCTMYc8UBkaiduUzregwwVBW3D7kmec2K408krGQsxdy\n" + + "oKJA12GL/XX1YgzDEsyBRk/gvex5lPaBIZiJ5IZlUfjLuRDGxPjtRelBTpZ7SUet\n" + + "PJVZz6zV6hMPGO6kQzCtbzzET515EE0okIS40LkAmtWoOmVm3gRldomaZTrZ0V2L\n" + + "MMaJGzrXYqk0SX+PYul8v+2EEHeMuaXG/XpK5xsg9gZvzpKqFQcBOdENoJHB07go\n" + + "jCmRC328ALqr+bMyktKAuYfB+mhjmN2AU8TQx72WPpvNTXxFDYcwo+8254cCAVKB\n" + + "e98CAwEAAaOBrTCBqjAdBgNVHQ4EFgQUlJQlQTbi8YIyiNf+SqF7LtH+gicwawYD\n" + + "VR0jBGQwYoAUlJQlQTbi8YIyiNf+SqF7LtH+giehP6Q9MDsxCzAJBgNVBAYTAlVT\n" + + "MQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2VyaXZjZYIJ\n" + + "AJAYpR2aIlA1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3\n" + + "DQEBCwUAA4IBAQAI0lTY0YAKQ2VdoIQ6dnqolphLVWdNGiC9drHEYSn7+hmAD2r2\n" + + "v1U/9m752TkcT74a65xKbEVuVtleD/w6i+QjALW2PYt6ivjOnnY0a9Y9a9UCa00j\n" + + "C9415sCw84Tp9VoKtuYqzhN87bBUeABOw5dsW3z32C2N/YhprkqeF/vdx4JxulPr\n" + + "PKze5BREXnKLA1ISoDioCPphvNMKrSpkAofb1rTCwtgt5V/WFls283L52ORmpRGO\n" + + "Ja88ztXOz00ZGu0RQLwlmpN7m8tNgA/5MPrldyYIwegP4RSkkJlF/8+hxvvqfJhK\n" + + "FFDa0HHQSJfR2b9628Iniw1UHOMMT6qx5EHr\n" + + "-----END CERTIFICATE-----" + }; + + // End entity certificate. + private final static String[] endEntityCertStrs = { + // SHA256withECDSA, curve prime256v1 + // Validity + // Not Before: Nov 9 03:24:05 2016 GMT + // Not After : Jul 27 03:24:05 2036 GMT + "-----BEGIN CERTIFICATE-----\n" + + "MIIB1DCCAXmgAwIBAgIJAKVa+4dIUjaLMAoGCCqGSM49BAMCMDsxCzAJBgNVBAYT\n" + + "AlVTMQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2VyaXZj\n" + + "ZTAeFw0xNjExMDkwMzI0MDVaFw0zNjA3MjcwMzI0MDVaMFIxCzAJBgNVBAYTAlVT\n" + + "MQ0wCwYDVQQKDARKYXZhMR0wGwYDVQQLDBRTdW5KU1NFIFRlc3QgU2VyaXZjZTEV\n" + + "MBMGA1UEAwwMSW50ZXJPcCBUZXN0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n" + + "h4vXNUJzULq4e7fAOvF0WiWU6cllOAMus1GqTFvcnRPOChl8suZsvksO0CpZqL3h\n" + + "jXmVX9dp1FV/rUBGLo1aG6NPME0wCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBSO8V5+\n" + + "bj0ik0T9BtJc4jLJt7m6wjAfBgNVHSMEGDAWgBQxfznifNqgUkZAJta3WVD21nw8\n" + + "8jAKBggqhkjOPQQDAgNJADBGAiEAk7MF+L9bFRwUsbPsBCbCqH9DMdzBQR+kFDNf\n" + + "lfn8Rs4CIQD9qWvBXd+EJqwraxiX6cftaFchn+T2HpvMboy+irMFow==\n" + + "-----END CERTIFICATE-----", + + // SHA256withRSA, 2048 bits + // Validity + // Not Before: Nov 9 03:24:16 2016 GMT + // Not After : Jul 27 03:24:16 2036 GMT + "-----BEGIN CERTIFICATE-----\n" + + "MIIDczCCAlugAwIBAgIJAPhM2oUKx0aJMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNV\n" + + "BAYTAlVTMQ0wCwYDVQQKEwRKYXZhMR0wGwYDVQQLExRTdW5KU1NFIFRlc3QgU2Vy\n" + + "aXZjZTAeFw0xNjExMDkwMzI0MTZaFw0zNjA3MjcwMzI0MTZaMFIxCzAJBgNVBAYT\n" + + "AlVTMQ0wCwYDVQQKDARKYXZhMR0wGwYDVQQLDBRTdW5KU1NFIFRlc3QgU2VyaXZj\n" + + "ZTEVMBMGA1UEAwwMSW50ZXJPcCBUZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" + + "MIIBCgKCAQEA36tJaXfJ2B/AFvES+tnueyQPSNABVu9nfMdU+NEPamJ+FH7cEF8Z\n" + + "1Spr1vlQgNzCpDUVrfnmT75rCapgz5ldA9+y+3hdfUyHjZBzzfx+6GHXLB4u6eU2\n" + + "NATa7vqSLNbcLcfZ7/QmkFqg4JRJbX4F42kKkRJrWdKZ8UoCYC8WXWvDaZ3nUs05\n" + + "XHe+mBJ8qMNPTbYST1jpzXPyH5CljlFGYi2mKJDTImDhwht7mu2+zvwvbJ81Gj2X\n" + + "JUSTSf9fu0zxFcCk6RmJPw9nSVqePVlOwtNNBodfKN+k4yr+gOz1v8NmMtmEtklV\n" + + "Sulr/J4QxI+E2Zar/C+4XjxkvstIS+PNKQIDAQABo2MwYTALBgNVHQ8EBAMCA+gw\n" + + "HQYDVR0OBBYEFHt19CItAz0VOF0WKGWwaT4DtEsSMB8GA1UdIwQYMBaAFJSUJUE2\n" + + "4vGCMojX/kqhey7R/oInMBIGA1UdEQEB/wQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL\n" + + "BQADggEBACKYZWvo9B9IEpCCdBba2sNo4X1NI/VEY3fyUx1lkw+Kna+1d2Ab+RCZ\n" + + "cf3Y85fcwv03hNE///wNBp+Nde4NQRDK/oiQARzWwWslfinm5d83eQwzC3cpSzt+\n" + + "7ts6M5UlOblGsLXZI7THWO1tkgoEra9p+zezxLMmf/2MpNyZMZlVoJPM2YGxU9cN\n" + + "ws0AyeY1gpBEdT21vjsBPdxxj6qklXVMnzS3zF8YwXyOndDYQWdjmFEknRK/qmQ2\n" + + "gkLHrzpSpyCziecna5mGuDRdCU2dpsWiq1npEPXTq+PQGwWYcoaFTtXF8DDqhfPC\n" + + "4Abe8gPm6MfzerdmS3RFTj9b/DIIENM=\n" + + "-----END CERTIFICATE-----" + }; + + // Private key in the format of PKCS#8. + private final static String[] endEntityPrivateKeys = { + // + // EC private key related to cert endEntityCertStrs[0]. + // + "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgA3pmS+OrIjGyUv2F\n" + + "K/PkyayJIePM2RTFYxNoQqmJGnihRANCAASHi9c1QnNQurh7t8A68XRaJZTpyWU4\n" + + "Ay6zUapMW9ydE84KGXyy5my+Sw7QKlmoveGNeZVf12nUVX+tQEYujVob", + + // + // RSA private key related to cert endEntityCertStrs[1]. + // + "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDfq0lpd8nYH8AW\n" + + "8RL62e57JA9I0AFW72d8x1T40Q9qYn4UftwQXxnVKmvW+VCA3MKkNRWt+eZPvmsJ\n" + + "qmDPmV0D37L7eF19TIeNkHPN/H7oYdcsHi7p5TY0BNru+pIs1twtx9nv9CaQWqDg\n" + + "lEltfgXjaQqREmtZ0pnxSgJgLxZda8NpnedSzTlcd76YEnyow09NthJPWOnNc/If\n" + + "kKWOUUZiLaYokNMiYOHCG3ua7b7O/C9snzUaPZclRJNJ/1+7TPEVwKTpGYk/D2dJ\n" + + "Wp49WU7C000Gh18o36TjKv6A7PW/w2Yy2YS2SVVK6Wv8nhDEj4TZlqv8L7hePGS+\n" + + "y0hL480pAgMBAAECggEBAJyP1zk+IkloIBtu7+wrdCU6HoDHKMjjlzrehHoOTI4Z\n" + + "F0vdaMkE6J4vrYCyz0kEPjKW/e/jxvT2wxHm8xEdtuApS61+mWJFmXTcMlNzdJnR\n" + + "Mr6s+gW67fAHngA94OgGFeTtyX2PFxdgeM/6vFMqLZD7S+w0SnR7WEpvla4iB7On\n" + + "lXqhJKVQeVc+IpByg/S4MmJb91jck73GltCaCL/b6BTrsz+zc/AY5tb8JInxjMZ9\n" + + "jmjmA+s6l7tnBrFQfJHlF9a374lxCOtZTxyxVJjD7tQcGpsUpSHXZGdpDcT34qYT\n" + + "UGh0yp2Mc/1PfWni5gS/6UGLrYmT57RRCn5YJBJTEkkCgYEA/XPCNehFaOMSxOZh\n" + + "OGBVhQ+eRAmdpJfMhSUsDdEdQLZyWGmZsMTHjZZrwevBX/D0dxQYDv/sAl0GZomJ\n" + + "d6iRCHlscycwx5Q0U/EpacsgRlYHz1nMRzXqS3Ry+8O8qQlliqCLUM7SfVgzdI5/\n" + + "ll9JMrng9NnRl8ccjEdOGK8g/MMCgYEA4eriKMfRslGY4uOQoTPbuEJSMMwQ2X4k\n" + + "lPj1p+xSQfU9QBaWJake67oBj3vpCxqN7/VkvCIeC6LCjhLpWHCn4EkdGiqkEdWz\n" + + "m5CHzpzVIgznzWnbt0rCVL2KdL+ihgY8KPDdsZ6tZrABHuYhsWkAu10wyvuQYM88\n" + + "3u6yOIQn36MCgYEAk5qR1UEzAxWTPbaJkgKQa5Cf9DHBbDS3eCcg098f8SsPxquh\n" + + "RRAkwzGCCgqZsJ0sUhkStdGXifzRGHAq7dPuuwe0ABAn2WNXYjeFjcYtQqkhnUFH\n" + + "tYURsOXdfQAOZEdDqos691GrxjHSraO7bECL6Y3VE+Oyq3jbCFsSgU+kn28CgYBT\n" + + "mrXZO6FJqVK33FlAns1YEgsSjeJKapklHEDkxNroF9Zz6ifkhgKwX6SGMefbORd/\n" + + "zsNZsBKIYdI3+52pIf+uS8BeV5tiEkCmeEUZ3AYv1LDP3rX1zc++xmn/rI97o8EN\n" + + "sZ2JRtyK3OV9RtL/MYmYzPLqm1Ah02+GXLVNnvKWmwKBgE8Ble8CzrXYuuPdGxXz\n" + + "BZU6HnXQrmTUcgeze0tj8SDHzCfsGsaG6pHrVNkT7CKsRuCHTZLM0kXmUijLFKuP\n" + + "5xyE257z4IbbEbs+tcbB3p28n4/47MzZkSR3kt8+FrsEMZq5oOHbFTGzgp9dhZCC\n" + + "dKUqlw5BPHdbxoWB/JpSHGCV" + }; + + // Private key names of endEntityPrivateKeys. + private final static String[] endEntityPrivateKeyNames = { + "EC", + "RSA" + }; + + /* + * Run the test case. + */ + public void run() throws Exception { + SSLEngine serverEngine = createServerEngine(); + + // + // Create and size the buffers appropriately. + // + SSLSession session = serverEngine.getSession(); + ByteBuffer serverAppInbound = + ByteBuffer.allocate(session.getApplicationBufferSize()); + ByteBuffer clientHello = + ByteBuffer.allocate(session.getPacketBufferSize()); + + // + // Generate a ClientHello message, and check if the server + // engine can read it or not. + // + clientHello.put(createClientHelloMessage()); + clientHello.flip(); + + SSLEngineResult serverResult = + serverEngine.unwrap(clientHello, serverAppInbound); + log("Server unwrap: ", serverResult); + runDelegatedTasks(serverResult, serverEngine); + + // + // Generate server responses to the ClientHello request. + // + ByteBuffer clientNetInbound = + ByteBuffer.allocate(session.getPacketBufferSize()); + ByteBuffer clientAppInbound = + ByteBuffer.wrap("Hello Client, I'm Server".getBytes()); + + serverResult = serverEngine.wrap(clientAppInbound, clientNetInbound); + log("Server wrap: ", serverResult); + runDelegatedTasks(serverResult, serverEngine); + } + + /* + * Create a ClientHello message. + */ + abstract protected byte[] createClientHelloMessage(); + + /* + * Create an instance of SSLContext for client use. + */ + protected SSLContext createClientSSLContext() throws Exception { + return createSSLContext(trustedCertStrs, null, null, null); + } + + /* + * Create an instance of SSLContext for server use. + */ + protected SSLContext createServerSSLContext() throws Exception { + return createSSLContext(null, + endEntityCertStrs, endEntityPrivateKeys, + endEntityPrivateKeyNames); + } + + /* + * Create an instance of SSLContext with the specified trust/key materials. + */ + protected SSLContext createSSLContext( + String[] trustedMaterials, + String[] keyMaterialCerts, + String[] keyMaterialKeys, + String[] keyMaterialKeyAlgs) throws Exception { + + KeyStore ts = null; // trust store + KeyStore ks = null; // key store + char passphrase[] = "passphrase".toCharArray(); + + // Generate certificate from cert string. + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + + // Import the trused certs. + ByteArrayInputStream is; + if (trustedMaterials != null && trustedMaterials.length != 0) { + ts = KeyStore.getInstance("JKS"); + ts.load(null, null); + + Certificate[] trustedCert = + new Certificate[trustedMaterials.length]; + for (int i = 0; i < trustedMaterials.length; i++) { + String trustedCertStr = trustedMaterials[i]; + + is = new ByteArrayInputStream(trustedCertStr.getBytes()); + try { + trustedCert[i] = cf.generateCertificate(is); + } finally { + is.close(); + } + + ts.setCertificateEntry("trusted-cert-" + i, trustedCert[i]); + } + } + + // Import the key materials. + // + // Note that certification pathes bigger than one are not supported yet. + boolean hasKeyMaterials = + (keyMaterialCerts != null) && (keyMaterialCerts.length != 0) && + (keyMaterialKeys != null) && (keyMaterialKeys.length != 0) && + (keyMaterialKeyAlgs != null) && (keyMaterialKeyAlgs.length != 0) && + (keyMaterialCerts.length == keyMaterialKeys.length) && + (keyMaterialCerts.length == keyMaterialKeyAlgs.length); + if (hasKeyMaterials) { + ks = KeyStore.getInstance("JKS"); + ks.load(null, null); + + for (int i = 0; i < keyMaterialCerts.length; i++) { + String keyCertStr = keyMaterialCerts[i]; + + // generate the private key. + PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec( + Base64.getMimeDecoder().decode(keyMaterialKeys[i])); + KeyFactory kf = + KeyFactory.getInstance(keyMaterialKeyAlgs[i]); + PrivateKey priKey = kf.generatePrivate(priKeySpec); + + // generate certificate chain + is = new ByteArrayInputStream(keyCertStr.getBytes()); + Certificate keyCert = null; + try { + keyCert = cf.generateCertificate(is); + } finally { + is.close(); + } + + Certificate[] chain = new Certificate[] { keyCert }; + + // import the key entry. + ks.setKeyEntry("cert-" + i, priKey, passphrase, chain); + } + } + + // Create an SSLContext object. + TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX"); + tmf.init(ts); + + SSLContext context = SSLContext.getInstance("TLS"); + if (hasKeyMaterials && ks != null) { + KeyManagerFactory kmf = KeyManagerFactory.getInstance("NewSunX509"); + kmf.init(ks, passphrase); + + context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); + } else { + context.init(null, tmf.getTrustManagers(), null); + } + + return context; + } + + /* + * Create an instance of SSLEngine in client mode. + */ + protected SSLEngine createClientEngine() throws Exception { + return createClientEngine(createClientSSLContext()); + } + + /* + * Create an instance of SSLEngine in client mode with the + * specified SSLContext object. + */ + protected SSLEngine createClientEngine( + SSLContext context) throws Exception { + + SSLEngine engine = context.createSSLEngine(); + engine.setUseClientMode(true); + + /* + * Customize the SSLEngine object. + */ + // blank + + return engine; + } + + /* + * Create an instance of SSLEngine in server mode. + */ + protected SSLEngine createServerEngine() throws Exception { + return createServerEngine(createServerSSLContext()); + } + + /* + * Create an instance of SSLEngine in server mode with the + * specified SSLContext object. + */ + protected SSLEngine createServerEngine( + SSLContext context) throws Exception { + + SSLEngine engine = context.createSSLEngine(); + engine.setUseClientMode(false); + + /* + * Customize the SSLEngine object. + */ + engine.setNeedClientAuth(false); + + return engine; + } + + /* + * Run the delagayed tasks if any. + * + * If the result indicates that we have outstanding tasks to do, + * go ahead and run them in this thread. + */ + protected static void runDelegatedTasks(SSLEngineResult result, + SSLEngine engine) throws Exception { + + if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) { + Runnable runnable; + while ((runnable = engine.getDelegatedTask()) != null) { + log("\trunning delegated task..."); + runnable.run(); + } + HandshakeStatus hsStatus = engine.getHandshakeStatus(); + if (hsStatus == HandshakeStatus.NEED_TASK) { + throw new Exception( + "handshake shouldn't need additional tasks"); + } + log("\tnew HandshakeStatus: " + hsStatus); + } + } + + /* + * Logging the specificated message and the SSLEngine operation result. + */ + protected static void log(String str, SSLEngineResult result) { + HandshakeStatus hsStatus = result.getHandshakeStatus(); + log(str + + result.getStatus() + "/" + hsStatus + ", consumed: " + + result.bytesConsumed() + "/produced: " + result.bytesProduced() + + " bytes"); + + if (hsStatus == HandshakeStatus.FINISHED) { + log("\t...ready for application data"); + } + } + + /* + * Logging the specificated message. + */ + protected static void log(String str) { + System.out.println(str); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/lib/security/SecurityTools.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,122 @@ +/* + * 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.util.ArrayList; +import java.util.Collections; +import java.util.List; +import jdk.testlibrary.JDKToolLauncher; +import jdk.testlibrary.OutputAnalyzer; +import jdk.testlibrary.ProcessTools; + +public class SecurityTools { + + public static final String NO_ALIAS = null; + + // keytool + + public static OutputAnalyzer keytool(List<String> options) + throws Throwable { + + JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("keytool") + .addVMArg("-Duser.language=en") + .addVMArg("-Duser.country=US"); + for (String option : options) { + if (option.startsWith("-J")) { + launcher.addVMArg(option.substring(2)); + } else { + launcher.addToolArg(option); + } + } + return ProcessTools.executeCommand(launcher.getCommand()); + } + + public static OutputAnalyzer keytool(String options) throws Throwable { + return keytool(options.split("\\s+")); + } + + public static OutputAnalyzer keytool(String... options) throws Throwable { + return keytool(List.of(options)); + } + + // jarsigner + + public static OutputAnalyzer jarsigner(String jar, String alias, + List<String> options) throws Throwable { + JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jarsigner") + .addVMArg("-Duser.language=en") + .addVMArg("-Duser.country=US"); + for (String option : options) { + if (option.startsWith("-J")) { + launcher.addVMArg(option.substring(2)); + } else { + launcher.addToolArg(option); + } + } + launcher.addToolArg(jar); + if (alias != null) { + launcher.addToolArg(alias); + } + return ProcessTools.executeCommand(launcher.getCommand()); + } + + public static OutputAnalyzer jarsigner(String jar, String alias, + String options) throws Throwable { + + return jarsigner(jar, alias, options.split("\\s+")); + } + + public static OutputAnalyzer jarsigner(String jar, String alias, + String... options) throws Throwable { + + return jarsigner(jar, alias, List.of(options)); + } + + public static OutputAnalyzer sign(String jar, String alias, String... options) + throws Throwable { + + return jarsigner(jar, alias, + mergeOptions("-J-Djava.security.egd=file:/dev/./urandom", options)); + } + + public static OutputAnalyzer verify(String jar, String... options) + throws Throwable { + + return jarsigner(jar, NO_ALIAS, mergeOptions("-verify", options)); + } + + // helper methods + + private static List<String> mergeOptions( + String firstOption, String... secondPart) { + + return mergeOptions(List.of(firstOption), secondPart); + } + + private static List<String> mergeOptions( + List<String> firstPart, String... secondPart) { + + List<String> options = new ArrayList<>(firstPart); + Collections.addAll(options, secondPart); + return options; + } +}
--- a/jdk/test/sun/net/www/http/HttpClient/RetryPost.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/sun/net/www/http/HttpClient/RetryPost.java Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 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 @@ -21,10 +21,25 @@ * questions. */ -import java.net.*; -import java.util.*; -import java.io.*; -import com.sun.net.httpserver.*; +/* + * @test + * @bug 6427251 6382788 + * @modules jdk.httpserver + * @run main RetryPost + * @run main/othervm -Dsun.net.http.retryPost=false RetryPost noRetry + * @summary HttpURLConnection automatically retries non-idempotent method POST + */ + +import com.sun.net.httpserver.HttpContext; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.SocketException; +import java.net.URL; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService;
--- a/jdk/test/sun/net/www/http/HttpClient/RetryPost.sh Mon Nov 14 10:00:15 2016 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -# -# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# 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 6427251 6382788 - # @run shell/timeout=140 RetryPost.sh - # @summary HttpURLConnection automatically retries non-idempotent method POST - -OS=`uname -s` -case "$OS" in - SunOS | Linux | Darwin | AIX ) - PS=":" - FS="/" - ;; - CYGWIN* ) - PS=";" - FS="/" - ;; - Windows* ) - PS=";" - FS="\\" - ;; - * ) - echo "Unrecognized system!" - exit 1; - ;; -esac - -# compile -${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d . ${TESTSRC}${FS}RetryPost.java - -# run with no option specified. Should retry POST request. -${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} RetryPost -result=$? -if [ "$result" -ne "0" ]; then - exit 1 -fi - -# run with option specified. Should not retry POST request. -${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -Dsun.net.http.retryPost=false RetryPost noRetry -result=$? -if [ "$result" -ne "0" ]; then - exit 1 -fi - -# no failures, exit. -exit 0 -
--- a/jdk/test/sun/net/www/http/KeepAliveStream/InfiniteLoop.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/sun/net/www/http/KeepAliveStream/InfiniteLoop.java Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -24,14 +24,19 @@ /* * @test * @bug 8004863 + * @modules jdk.httpserver * @summary Checks for proper close code in KeepAliveStream */ import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; -import java.io.*; -import java.net.*; +import java.io.InputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.URL; import java.util.concurrent.Phaser; // Racey test, will not always fail, but if it does then we have a problem.
--- a/jdk/test/sun/net/www/protocol/http/NoNTLM.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/sun/net/www/protocol/http/NoNTLM.java Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -26,11 +26,19 @@ * @summary Sanity check that NTLM will not be selected by the http protocol * handler when running on a profile that does not support NTLM * @modules java.base/sun.net.www + * java.base/sun.net.www.protocol.http * @run main/othervm NoNTLM */ -import java.net.*; -import java.io.*; +import java.io.IOException; +import java.lang.reflect.Field; +import java.net.Authenticator; +import java.net.HttpURLConnection; +import java.net.PasswordAuthentication; +import java.net.Proxy; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.URL; import sun.net.www.MessageHeader; public class NoNTLM { @@ -208,11 +216,14 @@ } public static void main(String[] args) throws Exception { - // assume NTLM is not supported when Kerberos is not available try { - Class.forName("javax.security.auth.kerberos.KerberosPrincipal"); - System.out.println("Kerberos is present, assuming NTLM is supported too"); - return; + Class<?> ntlmProxyClass = Class.forName("sun.net.www.protocol.http.NTLMAuthenticationProxy", true, NoNTLM.class.getClassLoader()); + Field ntlmSupportedField = ntlmProxyClass.getDeclaredField("supported"); + ntlmSupportedField.setAccessible(true); + if (ntlmSupportedField.getBoolean(null)) { + System.out.println("NTLM is supported. Nothing to do. Exiting."); + return; + } } catch (ClassNotFoundException okay) { } // setup Authenticator
--- a/jdk/test/sun/security/tools/keytool/KeyToolTest.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/sun/security/tools/keytool/KeyToolTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -1211,18 +1211,26 @@ void sqePrintcertTest() throws Exception { remove("x.jks"); remove("mykey.cert"); + remove("myweakkey.cert"); testOK("", "-keystore x.jks -storetype JKS -storepass changeit " + "-keypass changeit -genkeypair -dname CN=olala"); testOK("", "-keystore x.jks -storetype JKS -storepass changeit " + "-export -file mykey.cert -alias mykey"); + testOK("", "-keystore x.jks -storetype JKS -storepass changeit " + + "-keypass changeit -genkeypair -dname CN=weak -keyalg rsa " + + "-keysize 512 -sigalg MD5withRSA -alias myweakkey"); + testOK("", "-keystore x.jks -storetype JKS -storepass changeit " + + "-export -file myweakkey.cert -alias myweakkey"); testFail("", "-printcert -file badkeystore"); testFail("", "-printcert -file a/b/c/d"); testOK("", "-printcert -file mykey.cert"); + testOK("", "-printcert -file myweakkey.cert"); FileInputStream fin = new FileInputStream("mykey.cert"); testOK(fin, "-printcert"); fin.close(); remove("x.jks"); remove("mykey.cert"); + remove("myweakkey.cert"); } // 8074935: jdk8 keytool doesn't validate pem files for RFC 1421 correctness
--- a/jdk/test/sun/security/tools/keytool/PrintSSL.java Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/sun/security/tools/keytool/PrintSSL.java Tue Nov 22 10:48:24 2016 -0800 @@ -24,20 +24,32 @@ /* * @test * @bug 6480981 8160624 - * @modules java.base/sun.security.tools.keytool * @summary keytool should be able to import certificates from remote SSL server + * @library /lib/security + * @library /lib/testlibrary * @run main/othervm PrintSSL */ -import java.io.IOException; import java.net.ServerSocket; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.concurrent.CountDownLatch; import javax.net.ssl.SSLServerSocketFactory; import javax.net.ssl.SSLSocket; +import jdk.testlibrary.OutputAnalyzer; public class PrintSSL { - public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Throwable { + Files.deleteIfExists(Paths.get("keystore")); + + // make sure that "-printcert" works with weak algorithms + OutputAnalyzer out = SecurityTools.keytool("-genkeypair " + + "-keystore keystore -storepass passphrase " + + "-keypass passphrase -keyalg rsa -keysize 512 " + + "-sigalg MD5withRSA -alias rsa_alias -dname CN=Server"); + System.out.println(out.getOutput()); + out.shouldHaveExitValue(0); int port = new Server().start(); if(port == -1) { @@ -47,7 +59,10 @@ String cmd = String.format( "-debug %s -printcert -sslserver localhost:%s", ((vmOpt == null) ? "" : vmOpt ), port); - sun.security.tools.keytool.Main.main(cmd.split("\\s+")); + + out = SecurityTools.keytool(cmd); + System.out.println(out.getOutput()); + out.shouldHaveExitValue(0); } private static class Server implements Runnable { @@ -68,9 +83,7 @@ public void run() { System.setProperty("javax.net.ssl.keyStorePassword", "passphrase"); - System.setProperty("javax.net.ssl.keyStore", - System.getProperty("test.src", "./") - + "/../../../../javax/net/ssl/etc/keystore"); + System.setProperty("javax.net.ssl.keyStore", "keystore"); SSLServerSocketFactory sslssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); try (ServerSocket server = sslssf.createServerSocket(0)) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/tools/keytool/ReadJar.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,86 @@ +/* + * 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. + */ + +/** + * @test + * @bug 6890872 8168882 + * @summary keytool -printcert to recognize signed jar files + * @library /lib/security + * @library /lib/testlibrary + */ + +import java.nio.file.Files; +import java.nio.file.Paths; +import jdk.testlibrary.JarUtils; +import jdk.testlibrary.OutputAnalyzer; + +public class ReadJar { + + public static void main(String[] args) throws Throwable { + testWithMD5(); + } + + // make sure that -printcert option works + // if a weak algorithm was used for signing a jar + private static void testWithMD5() throws Throwable { + // create jar files + JarUtils.createJar("test_md5.jar", "test"); + JarUtils.createJar("test_rsa.jar", "test"); + + // create a keystore and generate keys for jar signing + Files.deleteIfExists(Paths.get("keystore")); + + OutputAnalyzer out = SecurityTools.keytool("-genkeypair " + + "-keystore keystore -storepass password " + + "-keypass password -keyalg rsa -alias rsa_alias -dname CN=A"); + System.out.println(out.getOutput()); + out.shouldHaveExitValue(0); + + out = SecurityTools.jarsigner("test_rsa.jar", "rsa_alias", + "-keystore keystore -storepass password "); + System.out.println(out.getOutput()); + out.shouldHaveExitValue(0); + + printCert("test_rsa.jar"); + + out = SecurityTools.jarsigner("test_md5.jar", "rsa_alias", + "-keystore keystore -storepass password " + + "-sigalg MD5withRSA -digestalg MD5"); + System.out.println(out.getOutput()); + out.shouldHaveExitValue(0); + + printCert("test_md5.jar"); + } + + private static void printCert(String jar) throws Throwable { + OutputAnalyzer out = SecurityTools.keytool("-printcert -jarfile " + jar); + System.out.println(out.getOutput()); + out.shouldHaveExitValue(0); + out.shouldNotContain("Not a signed jar file"); + + out = SecurityTools.keytool("-printcert -rfc -jarfile " + jar); + System.out.println(out.getOutput()); + out.shouldHaveExitValue(0); + out.shouldNotContain("Not a signed jar file"); + } +}
--- a/jdk/test/sun/security/tools/keytool/readjar.sh Mon Nov 14 10:00:15 2016 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -# -# Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# 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 6890872 -# @summary keytool -printcert to recognize signed jar files -# - -if [ "${TESTJAVA}" = "" ] ; then - JAVAC_CMD=`which javac` - TESTJAVA=`dirname $JAVAC_CMD`/.. - COMPILEJAVA=${TESTJAVA} -fi - -# set platform-dependent variables -OS=`uname -s` -case "$OS" in - Windows_* ) - FS="\\" - ;; - * ) - FS="/" - ;; -esac - -KS=readjar.jks -rm $KS -$TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -storepass changeit -keypass changeit -keystore $KS \ - -keyalg rsa -alias x -dname CN=X -genkeypair -$COMPILEJAVA${FS}bin${FS}jar ${TESTTOOLVMOPTS} cvf readjar.jar $KS -$COMPILEJAVA${FS}bin${FS}jarsigner ${TESTTOOLVMOPTS} -storepass changeit -keystore $KS readjar.jar x - -$TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -printcert -jarfile readjar.jar || exit 1 -$TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -printcert -jarfile readjar.jar -rfc || exit 1 - -exit 0 -
--- a/jdk/test/sun/util/calendar/zi/tzdata/VERSION Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/sun/util/calendar/zi/tzdata/VERSION Tue Nov 22 10:48:24 2016 -0800 @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2016h +tzdata2016i
--- a/jdk/test/sun/util/calendar/zi/tzdata/antarctica Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/sun/util/calendar/zi/tzdata/antarctica Tue Nov 22 10:48:24 2016 -0800 @@ -87,13 +87,18 @@ # Background: # http://www.timeanddate.com/news/time/antartica-time-changes-2010.html +# From Steffen Thorsen (2016-10-28): +# Australian Antarctica Division informed us that Casey changed time +# zone to UTC+11 in "the morning of 22nd October 2016". + # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Antarctica/Casey 0 - -00 1969 8:00 - +08 2009 Oct 18 2:00 11:00 - +11 2010 Mar 5 2:00 8:00 - +08 2011 Oct 28 2:00 11:00 - +11 2012 Feb 21 17:00u - 8:00 - +08 + 8:00 - +08 2016 Oct 22 + 11:00 - +11 Zone Antarctica/Davis 0 - -00 1957 Jan 13 7:00 - +07 1964 Nov 0 - -00 1969 Feb
--- a/jdk/test/sun/util/calendar/zi/tzdata/asia Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/sun/util/calendar/zi/tzdata/asia Tue Nov 22 10:48:24 2016 -0800 @@ -794,9 +794,19 @@ ############################################################################### # Cyprus + +# Milne says the Eastern Telegraph Company used 2:14:00. Stick with LMT. +# IATA SSIM (1998-09) has Cyprus using EU rules for the first time. + +# From Paul Eggert (2016-09-09): +# Yesterday's Cyprus Mail reports that Northern Cyprus followed Turkey's +# lead and switched from +02/+03 to +03 year-round. +# http://cyprus-mail.com/2016/09/08/two-time-zones-cyprus-turkey-will-not-turn-clocks-back-next-month/ # -# Milne says the Eastern Telegraph Company used 2:14:00. Stick with LMT. -# +# From Even Scharning (2016-10-31): +# Looks like the time zone split in Cyprus went through last night. +# http://cyprus-mail.com/2016/10/30/cyprus-new-division-two-time-zones-now-reality/ + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Cyprus 1975 only - Apr 13 0:00 1:00 S Rule Cyprus 1975 only - Oct 12 0:00 0 - @@ -811,7 +821,10 @@ Zone Asia/Nicosia 2:13:28 - LMT 1921 Nov 14 2:00 Cyprus EE%sT 1998 Sep 2:00 EUAsia EE%sT -# IATA SSIM (1998-09) has Cyprus using EU rules for the first time. +Zone Asia/Famagusta 2:15:48 - LMT 1921 Nov 14 + 2:00 Cyprus EE%sT 1998 Sep + 2:00 EUAsia EE%sT 2016 Sep 8 + 3:00 - +03 # Classically, Cyprus belongs to Asia; e.g. see Herodotus, Histories, I.72. # However, for various reasons many users expect to find it under Europe.
--- a/jdk/test/sun/util/calendar/zi/tzdata/australasia Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/sun/util/calendar/zi/tzdata/australasia Tue Nov 22 10:48:24 2016 -0800 @@ -725,11 +725,13 @@ Rule Tonga 2000 only - Mar 19 2:00s 0 - Rule Tonga 2000 2001 - Nov Sun>=1 2:00 1:00 S Rule Tonga 2001 2002 - Jan lastSun 2:00 0 - +Rule Tonga 2016 max - Nov Sun>=1 2:00 1:00 S +Rule Tonga 2017 max - Jan Sun>=15 3:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Pacific/Tongatapu 12:19:20 - LMT 1901 - 12:20 - TOT 1941 # Tonga Time - 13:00 - TOT 1999 - 13:00 Tonga TO%sT + 12:20 - +1220 1941 + 13:00 - +13 1999 + 13:00 Tonga +13/+14 # Tuvalu # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -1735,9 +1737,17 @@ # of January the standard time in the Kingdom shall be moved backward by one # hour to 1:00am. -# From Pulu 'Anau (2002-11-05): +# From Pulu ʻAnau (2002-11-05): # The law was for 3 years, supposedly to get renewed. It wasn't. +# From Pulu ʻAnau (2016-10-27): +# http://mic.gov.to/news-today/press-releases/6375-daylight-saving-set-to-run-from-6-november-2016-to-15-january-2017 +# Cannot find anyone who knows the rules, has seen the duration or has seen +# the cabinet decision, but it appears we are following Fiji's rule set. +# +# From Tim Parenti (2016-10-26): +# Assume Tonga will observe DST from the first Sunday in November at 02:00 +# through the third Sunday in January at 03:00, like Fiji, for now. # Wake
--- a/jdk/test/sun/util/calendar/zi/tzdata/europe Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/sun/util/calendar/zi/tzdata/europe Tue Nov 22 10:48:24 2016 -0800 @@ -1523,73 +1523,84 @@ # But these events all occurred before the 1970 cutoff, # so record only the time in Rome. # -# From Paul Eggert (2006-03-22): -# For Italian DST we have three sources: Shanks & Pottenger, Whitman, and -# F. Pollastri -# Day-light Saving Time in Italy (2006-02-03) -# http://toi.iriti.cnr.it/uk/ienitlt.html -# ('FP' below), taken from an Italian National Electrotechnical Institute -# publication. When the three sources disagree, guess who's right, as follows: +# From Michael Deckers (2016-10-24): +# http://www.ac-ilsestante.it/MERIDIANE/ora_legale quotes a law of 1893-08-10 +# ... [translated as] "The preceding dispositions will enter into +# force at the instant at which, according to the time specified in +# the 1st article, the 1st of November 1893 will begin...." # -# year FP Shanks&P. (S) Whitman (W) Go with: -# 1916 06-03 06-03 24:00 06-03 00:00 FP & W -# 09-30 09-30 24:00 09-30 01:00 FP; guess 24:00s -# 1917 04-01 03-31 24:00 03-31 00:00 FP & S -# 09-30 09-29 24:00 09-30 01:00 FP & W -# 1918 03-09 03-09 24:00 03-09 00:00 FP & S -# 10-06 10-05 24:00 10-06 01:00 FP & W -# 1919 03-01 03-01 24:00 03-01 00:00 FP & S -# 10-04 10-04 24:00 10-04 01:00 FP; guess 24:00s -# 1920 03-20 03-20 24:00 03-20 00:00 FP & S -# 09-18 09-18 24:00 10-01 01:00 FP; guess 24:00s -# 1944 04-02 04-03 02:00 S (see C-Eur) -# 09-16 10-02 03:00 FP; guess 24:00s -# 1945 09-14 09-16 24:00 FP; guess 24:00s -# 1970 05-21 05-31 00:00 S -# 09-20 09-27 00:00 S +# From Pierpaolo Bernardi (2016-10-20): +# The authoritative source for time in Italy is the national metrological +# institute, which has a summary page of historical DST data at +# http://www.inrim.it/res/tf/ora_legale_i.shtml +# (2016-10-24): +# http://www.renzobaldini.it/le-ore-legali-in-italia/ +# has still different data for 1944. It divides Italy in two, as +# there were effectively two governments at the time, north of Gothic +# Line German controlled territory, official government RSI, and south +# of the Gothic Line, controlled by allied armies. +# +# From Brian Inglis (2016-10-23): +# Viceregal LEGISLATIVE DECREE. 14 September 1944, no. 219. +# Restoration of Standard Time. (044U0219) (OJ 62 of 30.9.1944) ... +# Given the R. law decreed on 1944-03-29, no. 92, by which standard time is +# advanced to sixty minutes later starting at hour two on 1944-04-02; ... +# Starting at hour three on the date 1944-09-17 standard time will be resumed. +# +# From Paul Eggert (2016-10-27): +# Go with INRiM for DST rules, except as corrected by Inglis for 1944 +# for the Kingdom of Italy. This is consistent with Renzo Baldini. +# Model Rome's occupation by using using C-Eur rules from 1943-09-10 +# to 1944-06-04; although Rome was an open city during this period, it +# was effectively controlled by Germany. # # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S -Rule Italy 1916 only - Jun 3 0:00s 1:00 S -Rule Italy 1916 only - Oct 1 0:00s 0 - -Rule Italy 1917 only - Apr 1 0:00s 1:00 S -Rule Italy 1917 only - Sep 30 0:00s 0 - -Rule Italy 1918 only - Mar 10 0:00s 1:00 S -Rule Italy 1918 1919 - Oct Sun>=1 0:00s 0 - -Rule Italy 1919 only - Mar 2 0:00s 1:00 S -Rule Italy 1920 only - Mar 21 0:00s 1:00 S -Rule Italy 1920 only - Sep 19 0:00s 0 - -Rule Italy 1940 only - Jun 15 0:00s 1:00 S -Rule Italy 1944 only - Sep 17 0:00s 0 - -Rule Italy 1945 only - Apr 2 2:00 1:00 S -Rule Italy 1945 only - Sep 15 0:00s 0 - -Rule Italy 1946 only - Mar 17 2:00s 1:00 S -Rule Italy 1946 only - Oct 6 2:00s 0 - -Rule Italy 1947 only - Mar 16 0:00s 1:00 S -Rule Italy 1947 only - Oct 5 0:00s 0 - -Rule Italy 1948 only - Feb 29 2:00s 1:00 S -Rule Italy 1948 only - Oct 3 2:00s 0 - -Rule Italy 1966 1968 - May Sun>=22 0:00 1:00 S -Rule Italy 1966 1969 - Sep Sun>=22 0:00 0 - -Rule Italy 1969 only - Jun 1 0:00 1:00 S -Rule Italy 1970 only - May 31 0:00 1:00 S -Rule Italy 1970 only - Sep lastSun 0:00 0 - -Rule Italy 1971 1972 - May Sun>=22 0:00 1:00 S -Rule Italy 1971 only - Sep lastSun 1:00 0 - -Rule Italy 1972 only - Oct 1 0:00 0 - -Rule Italy 1973 only - Jun 3 0:00 1:00 S -Rule Italy 1973 1974 - Sep lastSun 0:00 0 - -Rule Italy 1974 only - May 26 0:00 1:00 S -Rule Italy 1975 only - Jun 1 0:00s 1:00 S -Rule Italy 1975 1977 - Sep lastSun 0:00s 0 - -Rule Italy 1976 only - May 30 0:00s 1:00 S -Rule Italy 1977 1979 - May Sun>=22 0:00s 1:00 S -Rule Italy 1978 only - Oct 1 0:00s 0 - -Rule Italy 1979 only - Sep 30 0:00s 0 - +Rule Italy 1916 only - Jun 3 24:00 1:00 S +Rule Italy 1916 1917 - Sep 30 24:00 0 - +Rule Italy 1917 only - Mar 31 24:00 1:00 S +Rule Italy 1918 only - Mar 9 24:00 1:00 S +Rule Italy 1918 only - Oct 6 24:00 0 - +Rule Italy 1919 only - Mar 1 24:00 1:00 S +Rule Italy 1919 only - Oct 4 24:00 0 - +Rule Italy 1920 only - Mar 20 24:00 1:00 S +Rule Italy 1920 only - Sep 18 24:00 0 - +Rule Italy 1940 only - Jun 14 24:00 1:00 S +Rule Italy 1942 only - Nov 2 2:00s 0 - +Rule Italy 1943 only - Mar 29 2:00s 1:00 S +Rule Italy 1943 only - Oct 4 2:00s 0 - +Rule Italy 1944 only - Apr 2 2:00s 1:00 S +Rule Italy 1944 only - Sep 17 2:00s 0 - +Rule Italy 1945 only - Apr 2 2:00 1:00 S +Rule Italy 1945 only - Sep 15 1:00 0 - +Rule Italy 1946 only - Mar 17 2:00s 1:00 S +Rule Italy 1946 only - Oct 6 2:00s 0 - +Rule Italy 1947 only - Mar 16 0:00s 1:00 S +Rule Italy 1947 only - Oct 5 0:00s 0 - +Rule Italy 1948 only - Feb 29 2:00s 1:00 S +Rule Italy 1948 only - Oct 3 2:00s 0 - +Rule Italy 1966 1968 - May Sun>=22 0:00s 1:00 S +Rule Italy 1966 only - Sep 24 24:00 0 - +Rule Italy 1967 1969 - Sep Sun>=22 0:00s 0 - +Rule Italy 1969 only - Jun 1 0:00s 1:00 S +Rule Italy 1970 only - May 31 0:00s 1:00 S +Rule Italy 1970 only - Sep lastSun 0:00s 0 - +Rule Italy 1971 1972 - May Sun>=22 0:00s 1:00 S +Rule Italy 1971 only - Sep lastSun 0:00s 0 - +Rule Italy 1972 only - Oct 1 0:00s 0 - +Rule Italy 1973 only - Jun 3 0:00s 1:00 S +Rule Italy 1973 1974 - Sep lastSun 0:00s 0 - +Rule Italy 1974 only - May 26 0:00s 1:00 S +Rule Italy 1975 only - Jun 1 0:00s 1:00 S +Rule Italy 1975 1977 - Sep lastSun 0:00s 0 - +Rule Italy 1976 only - May 30 0:00s 1:00 S +Rule Italy 1977 1979 - May Sun>=22 0:00s 1:00 S +Rule Italy 1978 only - Oct 1 0:00s 0 - +Rule Italy 1979 only - Sep 30 0:00s 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Rome 0:49:56 - LMT 1866 Sep 22 - 0:49:56 - RMT 1893 Nov 1 0:00s # Rome Mean - 1:00 Italy CE%sT 1942 Nov 2 2:00s - 1:00 C-Eur CE%sT 1944 Jul + 0:49:56 - RMT 1893 Oct 31 23:49:56 # Rome Mean + 1:00 Italy CE%sT 1943 Sep 10 + 1:00 C-Eur CE%sT 1944 Jun 4 1:00 Italy CE%sT 1980 1:00 EU CE%sT @@ -1788,6 +1799,10 @@ # See Europe/Belgrade. # Malta +# +# From Paul Eggert (2016-10-21): +# Assume 1900-1972 was like Rome, overriding Shanks. +# # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Malta 1973 only - Mar 31 0:00s 1:00 S Rule Malta 1973 only - Sep 29 0:00s 0 - @@ -1798,8 +1813,6 @@ Rule Malta 1980 only - Mar 31 2:00 1:00 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Malta 0:58:04 - LMT 1893 Nov 2 0:00s # Valletta - 1:00 Italy CE%sT 1942 Nov 2 2:00s - 1:00 C-Eur CE%sT 1945 Apr 2 2:00s 1:00 Italy CE%sT 1973 Mar 31 1:00 Malta CE%sT 1981 1:00 EU CE%sT @@ -1931,7 +1944,7 @@ # Amsterdam mean time. # The data entries before 1945 are taken from -# http://www.staff.science.uu.nl/~gent0113/idl/idl.htm +# http://www.staff.science.uu.nl/~gent0113/wettijd/wettijd.htm # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Neth 1916 only - May 1 0:00 1:00 NST # Netherlands Summer Time
--- a/jdk/test/sun/util/calendar/zi/tzdata/zone.tab Mon Nov 14 10:00:15 2016 -0800 +++ b/jdk/test/sun/util/calendar/zi/tzdata/zone.tab Tue Nov 22 10:48:24 2016 -0800 @@ -175,7 +175,8 @@ CV +1455-02331 Atlantic/Cape_Verde CW +1211-06900 America/Curacao CX -1025+10543 Indian/Christmas -CY +3510+03322 Asia/Nicosia +CY +3510+03322 Asia/Nicosia Cyprus (most areas) +CY +3507+03357 Asia/Famagusta Northern Cyprus CZ +5005+01426 Europe/Prague DE +5230+01322 Europe/Berlin Germany (most areas) DE +4742+00841 Europe/Busingen Busingen
--- a/langtools/.hgtags Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/.hgtags Tue Nov 22 10:48:24 2016 -0800 @@ -386,3 +386,4 @@ 296c875051187918f8f3f87e9432036d13013d39 jdk-9+141 d245e56f4a79a8a8d18bd143c08f079ee98ab638 jdk-9+142 6ef8a1453577832626b0efb7f70a3102b721ebbf jdk-9+143 +47871e348144bafddea0ede3a44299461e254a2d jdk-9+144
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Scope.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Scope.java Tue Nov 22 10:48:24 2016 -0800 @@ -137,12 +137,18 @@ /** Returns true iff the given Symbol is in this scope or any outward scope. */ public boolean includes(final Symbol sym) { + return includes(sym, RECURSIVE); + } + + /** Returns true iff the given Symbol is in this scope, optionally checking outward scopes. + */ + public boolean includes(final Symbol sym, LookupKind lookupKind) { return getSymbolsByName(sym.name, new Filter<Symbol>() { @Override public boolean accepts(Symbol t) { return t == sym; } - }).iterator().hasNext(); + }, lookupKind).iterator().hasNext(); } /** Returns true iff this scope does not contain any Symbol. Does not inspect outward scopes.
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java Tue Nov 22 10:48:24 2016 -0800 @@ -383,7 +383,19 @@ addRootPackageFor(unnamedModule); unnamedModule.enclosedPackages = unnamedModule.enclosedPackages.prepend(unnamedModule.unnamedPackage); - errModule = new ModuleSymbol(names.empty, null) { }; + errModule = new ModuleSymbol(names.empty, null) { + { + directives = List.nil(); + exports = List.nil(); + provides = List.nil(); + uses = List.nil(); + ModuleSymbol java_base = enterModule(names.java_base); + com.sun.tools.javac.code.Directive.RequiresDirective d = + new com.sun.tools.javac.code.Directive.RequiresDirective(java_base, + EnumSet.of(com.sun.tools.javac.code.Directive.RequiresFlag.MANDATED)); + requires = List.of(d); + } + }; addRootPackageFor(errModule); noModule = new ModuleSymbol(names.empty, null) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java Tue Nov 22 10:48:24 2016 -0800 @@ -293,8 +293,11 @@ private void enterModule(JCCompilationUnit toplevel, ClassSymbol c, Set<ModuleSymbol> modules) { boolean isModuleInfo = toplevel.sourcefile.isNameCompatible("module-info", Kind.SOURCE); boolean isModuleDecl = toplevel.defs.nonEmpty() && toplevel.defs.head.hasTag(MODULEDEF); - if (isModuleInfo && isModuleDecl) { + if (isModuleDecl) { JCModuleDecl decl = (JCModuleDecl) toplevel.defs.head; + if (!isModuleInfo) { + log.error(decl.pos(), Errors.ModuleDeclSbInModuleInfoJava); + } Name name = TreeInfo.fullName(decl.qualId); ModuleSymbol sym; if (c != null) { @@ -330,9 +333,6 @@ JCTree tree = toplevel.defs.isEmpty() ? toplevel : toplevel.defs.head; log.error(tree.pos(), Errors.ExpectedModule); } - } else if (isModuleDecl) { - JCTree tree = toplevel.defs.head; - log.error(tree.pos(), Errors.ModuleDeclSbInModuleInfoJava); } }
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java Tue Nov 22 10:48:24 2016 -0800 @@ -62,6 +62,7 @@ import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.Kind.*; +import com.sun.tools.javac.code.Scope.LookupKind; import static com.sun.tools.javac.code.TypeTag.ARRAY; import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.code.TypeTag.TYPEVAR; @@ -2186,7 +2187,11 @@ // Sometimes anonymous classes don't have an outer // instance, however, there is no reliable way to tell so // we never strip this$n - if (!currentOwner.name.isEmpty()) + // ditto for local classes. Local classes that have an enclosing method set + // won't pass the "hasOuterInstance" check above, but those that don't have an + // enclosing method (i.e. from initializers) will pass that check. + boolean local = !currentOwner.owner.members().includes(currentOwner, LookupKind.NON_RECURSIVE); + if (!currentOwner.name.isEmpty() && !local) type = new MethodType(adjustMethodParams(flags, type.getParameterTypes()), type.getReturnType(), type.getThrownTypes(),
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java Tue Nov 22 10:48:24 2016 -0800 @@ -35,6 +35,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -43,6 +44,7 @@ import java.util.ServiceLoader; import java.util.Set; import java.util.TreeSet; +import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.StreamSupport; @@ -200,31 +202,37 @@ // The standard file manager code knows to split apart the NULL-separated components. @Override public boolean process(OptionHelper helper, String option, String arg) { - if (!arg.contains("=")) { // could be more strict regeex, e.g. "(?i)[a-z0-9_.]+=.*" - helper.error(Errors.LocnInvalidArgForXpatch(arg)); + if (arg.isEmpty()) { + helper.error("err.no.value.for.option", option); + return true; + } else if (getPattern().matcher(arg).matches()) { + String prev = helper.get(PATCH_MODULE); + if (prev == null) { + super.process(helper, option, arg); + return false; + } else { + String argModulePackage = arg.substring(0, arg.indexOf('=')); + boolean isRepeated = Arrays.stream(prev.split("\0")) + .map(s -> s.substring(0, s.indexOf('='))) + .collect(Collectors.toSet()) + .contains(argModulePackage); + if (isRepeated) { + helper.error("err.repeated.value.for.patch.module", argModulePackage); + return true; + } else { + super.process(helper, option, prev + '\0' + arg); + return false; + } + } + } else { + helper.error("err.bad.value.for.option", option, arg); + return true; } + } - String previous = helper.get(this); - if (previous == null) { - return super.process(helper, option, arg); - } - - Map<String,String> map = new LinkedHashMap<>(); - for (String s : previous.split("\0")) { - int sep = s.indexOf('='); - map.put(s.substring(0, sep), s.substring(sep + 1)); - } - - int sep = arg.indexOf('='); - map.put(arg.substring(0, sep), arg.substring(sep + 1)); - - StringBuilder sb = new StringBuilder(); - map.forEach((m, p) -> { - if (sb.length() > 0) - sb.append('\0'); - sb.append(m).append('=').append(p); - }); - return super.process(helper, option, sb.toString()); + @Override + public Pattern getPattern() { + return Pattern.compile("([^/]+)=(,*[^,].*)"); } },
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties Tue Nov 22 10:48:24 2016 -0800 @@ -361,6 +361,8 @@ bad value for {0} option: ''{1}'' javac.err.no.value.for.option=\ no value for {0} option +javac.err.repeated.value.for.patch.module=\ + --patch-module specified more than once for {0} ## messages
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractMemberWriter.java Tue Nov 22 10:48:24 2016 -0800 @@ -535,7 +535,7 @@ TypeElement superClass = utils.getSuperClass(typeElement); while (superClass != null) { - if (visibleMemberMap.hasMembersFor(superClass)) { + if (visibleMemberMap.hasMembers(superClass)) { liNav.addContent(getNavSummaryLink(superClass, true)); return; }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConfigurationImpl.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConfigurationImpl.java Tue Nov 22 10:48:24 2016 -0800 @@ -135,8 +135,6 @@ */ public String docrootparent = ""; - public boolean sortedMethodDetails = false; - /** * True if command line option "-nohelp" is used. Default value is false. */
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriterImpl.java Tue Nov 22 10:48:24 2016 -0800 @@ -72,7 +72,7 @@ VisibleMemberMap visibleMemberMap = new VisibleMemberMap( typeElement, VisibleMemberMap.Kind.CONSTRUCTORS, configuration); - SortedSet<Element> constructors = visibleMemberMap.getMembersFor(typeElement); + List<Element> constructors = visibleMemberMap.getMembers(typeElement); for (Element constructor : constructors) { if (utils.isProtected(constructor) || utils.isPrivate(constructor)) { setFoundNonPubConstructor(true);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AbstractMemberBuilder.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AbstractMemberBuilder.java Tue Nov 22 10:48:24 2016 -0800 @@ -25,6 +25,15 @@ package jdk.javadoc.internal.doclets.toolkit.builders; +import java.util.Collection; +import java.util.Comparator; +import java.util.Iterator; +import java.util.SortedSet; +import java.util.TreeSet; + +import javax.lang.model.element.Element; + +import jdk.javadoc.internal.doclets.formats.html.ConfigurationImpl; import jdk.javadoc.internal.doclets.toolkit.Content; import jdk.javadoc.internal.doclets.toolkit.DocletException; @@ -42,6 +51,7 @@ */ public abstract class AbstractMemberBuilder extends AbstractBuilder { + public final Comparator<Element> comparator; /** * Construct a SubBuilder. * @param context a context object, providing information used in this run @@ -49,6 +59,7 @@ */ public AbstractMemberBuilder(Context context) { super(context); + comparator = utils.makeGeneralPurposeComparator(); } /** @@ -83,4 +94,10 @@ * @return true if this subbuilder has anything to document */ public abstract boolean hasMembersToDocument(); + + public SortedSet<Element> asSortedSet(Collection<Element> members) { + SortedSet<Element> out = new TreeSet<>(comparator); + out.addAll(members); + return out; + } }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeFieldBuilder.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeFieldBuilder.java Tue Nov 22 10:48:24 2016 -0800 @@ -67,7 +67,7 @@ /** * The list of members being documented. */ - protected SortedSet<Element> members; + protected List<Element> members; /** * The index of the current member that is being documented at this point @@ -91,7 +91,7 @@ this.typeElement = typeElement; this.writer = writer; this.visibleMemberMap = new VisibleMemberMap(typeElement, memberType, configuration); - this.members = this.visibleMemberMap.getMembersFor(typeElement); + this.members = this.visibleMemberMap.getMembers(typeElement); } @@ -118,26 +118,6 @@ return "AnnotationTypeFieldDetails"; } - /** - * Returns a list of members that will be documented for the given class. - * This information can be used for doclet specific documentation - * generation. - * - * @param typeElement the TypeElement we want to check. - * @return a list of members that will be documented. - */ - public SortedSet<Element> members(TypeElement typeElement) { - return visibleMemberMap.getMembersFor(typeElement); - } - - /** - * Returns the visible member map for the members of this class. - * - * @return the visible member map for the members of this class. - */ - public VisibleMemberMap getVisibleMemberMap() { - return visibleMemberMap; - } /** * Returns whether or not there are members to document. @@ -145,7 +125,7 @@ */ @Override public boolean hasMembersToDocument() { - return members.size() > 0; + return !members.isEmpty(); } /** @@ -172,16 +152,19 @@ if (writer == null) { return; } - if (!members.isEmpty()) { + if (hasMembersToDocument()) { writer.addAnnotationFieldDetailsMarker(memberDetailsTree); - for (Element element : members) { - currentMember = element; + + Element lastElement = members.get(members.size() - 1); + for (Element member : members) { + currentMember = member; Content detailsTree = writer.getMemberTreeHeader(); writer.addAnnotationDetailsTreeHeader(typeElement, detailsTree); - Content annotationDocTree = writer.getAnnotationDocTreeHeader(element, detailsTree); + Content annotationDocTree = writer.getAnnotationDocTreeHeader(currentMember, + detailsTree); buildChildren(node, annotationDocTree); detailsTree.addContent(writer.getAnnotationDoc( - annotationDocTree, currentMember == members.last())); + annotationDocTree, currentMember == lastElement)); memberDetailsTree.addContent(writer.getAnnotationDetails(detailsTree)); } }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java Tue Nov 22 10:48:24 2016 -0800 @@ -68,7 +68,7 @@ /** * The list of members being documented. */ - protected SortedSet<Element> members; + protected List<Element> members; /** * The index of the current member that is being documented at this point @@ -82,6 +82,7 @@ * @param context the build context. * @param typeElement the class whose members are being documented. * @param writer the doclet specific writer. + * @param memberType the kind of member this builder processes. */ protected AnnotationTypeRequiredMemberBuilder(Context context, TypeElement typeElement, @@ -91,7 +92,7 @@ this.typeElement = typeElement; this.writer = writer; this.visibleMemberMap = new VisibleMemberMap(typeElement, memberType, configuration); - this.members = this.visibleMemberMap.getMembersFor(typeElement); + this.members = this.visibleMemberMap.getMembers(typeElement); } @@ -101,6 +102,7 @@ * @param context the build context. * @param typeElement the class whose members are being documented. * @param writer the doclet specific writer. + * @return an instance of this object */ public static AnnotationTypeRequiredMemberBuilder getInstance( Context context, TypeElement typeElement, @@ -119,33 +121,12 @@ } /** - * Returns a list of members that will be documented for the given class. - * This information can be used for doclet specific documentation - * generation. - * - * @param typeElement the {@link TypeElement} we want to check. - * @return a list of members that will be documented. - */ - public SortedSet<Element> members(TypeElement typeElement) { - return visibleMemberMap.getMembersFor(typeElement); - } - - /** - * Returns the visible member map for the members of this class. - * - * @return the visible member map for the members of this class. - */ - public VisibleMemberMap getVisibleMemberMap() { - return visibleMemberMap; - } - - /** * Returns whether or not there are members to document. * @return whether or not there are members to document */ @Override public boolean hasMembersToDocument() { - return members.size() > 0; + return !members.isEmpty(); } /** @@ -165,24 +146,25 @@ * * @param node the XML element that specifies which components to document * @param memberDetailsTree the content tree to which the documentation will be added + * @throws DocletException if an error occurs */ public void buildAnnotationTypeMember(XMLNode node, Content memberDetailsTree) throws DocletException { if (writer == null) { return; } - int size = members.size(); - if (size > 0) { + if (hasMembersToDocument()) { writer.addAnnotationDetailsMarker(memberDetailsTree); - for (Element element : members) { - currentMember = element; + Element lastMember = members.get((members.size() - 1)); + for (Element member : members) { + currentMember = member; Content detailsTree = writer.getMemberTreeHeader(); writer.addAnnotationDetailsTreeHeader(typeElement, detailsTree); Content annotationDocTree = writer.getAnnotationDocTreeHeader( - element, detailsTree); + currentMember, detailsTree); buildChildren(node, annotationDocTree); detailsTree.addContent(writer.getAnnotationDoc( - annotationDocTree, currentMember == members.last())); + annotationDocTree, currentMember == lastMember)); memberDetailsTree.addContent(writer.getAnnotationDetails(detailsTree)); } }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstantsSummaryBuilder.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstantsSummaryBuilder.java Tue Nov 22 10:48:24 2016 -0800 @@ -275,7 +275,7 @@ private boolean hasConstantField (TypeElement typeElement) { VisibleMemberMap visibleMemberMapFields = new VisibleMemberMap(typeElement, VisibleMemberMap.Kind.FIELDS, configuration); - SortedSet<Element> fields = visibleMemberMapFields.getLeafClassMembers(); + List<Element> fields = visibleMemberMapFields.getLeafMembers(); for (Element f : fields) { VariableElement field = (VariableElement)f; if (field.getConstantValue() != null) { @@ -350,21 +350,21 @@ } /** - * Return the list of visible constant fields for the given TypeElement. - * @return the list of visible constant fields for the given TypeElement. + * Returns a set of visible constant fields for the given type. + * @return the set of visible constant fields for the given type. */ protected SortedSet<VariableElement> members() { - SortedSet<Element> list = visibleMemberMapFields.getLeafClassMembers(); - list.addAll(visibleMemberMapEnumConst.getLeafClassMembers()); - SortedSet<VariableElement> inclList = + List<Element> members = visibleMemberMapFields.getLeafMembers(); + members.addAll(visibleMemberMapEnumConst.getLeafMembers()); + SortedSet<VariableElement> includes = new TreeSet<>(utils.makeGeneralPurposeComparator()); - for (Element element : list) { + for (Element element : members) { VariableElement member = (VariableElement)element; if (member.getConstantValue() != null) { - inclList.add(member); + includes.add(member); } } - return inclList; + return includes; } } }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstructorBuilder.java Tue Nov 22 10:48:24 2016 -0800 @@ -59,7 +59,7 @@ /** * The current constructor that is being documented at this point in time. */ - private ExecutableElement constructor; + private ExecutableElement currentConstructor; /** * The class whose constructors are being documented. @@ -79,7 +79,7 @@ /** * The constructors being documented. */ - private final SortedSet<Element> constructors; + private final List<Element> constructors; /** * Construct a new ConstructorBuilder. @@ -99,7 +99,7 @@ typeElement, VisibleMemberMap.Kind.CONSTRUCTORS, configuration); - constructors = visibleMemberMap.getMembersFor(typeElement); + constructors = visibleMemberMap.getMembers(typeElement); for (Element ctor : constructors) { if (utils.isProtected(ctor) || utils.isPrivate(ctor)) { writer.setFoundNonPubConstructor(true); @@ -137,18 +137,6 @@ } /** - * Returns a list of constructors that will be documented for the given class. - * This information can be used for doclet specific documentation - * generation. - * - * @param typeElement the class - * @return a list of constructors that will be documented. - */ - public SortedSet<Element> members(TypeElement typeElement) { - return visibleMemberMap.getMembersFor(typeElement); - } - - /** * Return the constructor writer for this builder. * * @return the constructor writer for this builder. @@ -168,17 +156,17 @@ if (writer == null) { return; } - int size = constructors.size(); - if (size > 0) { + if (hasMembersToDocument()) { Content constructorDetailsTree = writer.getConstructorDetailsTreeHeader(typeElement, memberDetailsTree); - for (Element ctor : constructors) { - constructor = (ExecutableElement)ctor; - Content constructorDocTree = writer.getConstructorDocTreeHeader( - constructor, constructorDetailsTree); + + Element lastElement = constructors.get(constructors.size() - 1); + for (Element contructor : constructors) { + currentConstructor = (ExecutableElement)contructor; + Content constructorDocTree = writer.getConstructorDocTreeHeader(currentConstructor, constructorDetailsTree); buildChildren(node, constructorDocTree); constructorDetailsTree.addContent(writer.getConstructorDoc(constructorDocTree, - constructors.last().equals(constructor))); + currentConstructor == lastElement)); } memberDetailsTree.addContent( writer.getConstructorDetails(constructorDetailsTree)); @@ -192,7 +180,7 @@ * @param constructorDocTree the content tree to which the documentation will be added */ public void buildSignature(XMLNode node, Content constructorDocTree) { - constructorDocTree.addContent(writer.getSignature(constructor)); + constructorDocTree.addContent(writer.getSignature(currentConstructor)); } /** @@ -202,7 +190,7 @@ * @param constructorDocTree the content tree to which the documentation will be added */ public void buildDeprecationInfo(XMLNode node, Content constructorDocTree) { - writer.addDeprecated(constructor, constructorDocTree); + writer.addDeprecated(currentConstructor, constructorDocTree); } /** @@ -214,7 +202,7 @@ */ public void buildConstructorComments(XMLNode node, Content constructorDocTree) { if (!configuration.nocomment) { - writer.addComments(constructor, constructorDocTree); + writer.addComments(currentConstructor, constructorDocTree); } } @@ -225,6 +213,6 @@ * @param constructorDocTree the content tree to which the documentation will be added */ public void buildTagInfo(XMLNode node, Content constructorDocTree) { - writer.addTags(constructor, constructorDocTree); + writer.addTags(currentConstructor, constructorDocTree); } }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/EnumConstantBuilder.java Tue Nov 22 10:48:24 2016 -0800 @@ -67,9 +67,9 @@ private final EnumConstantWriter writer; /** - * The list of enum constants being documented. + * The set of enum constants being documented. */ - private final SortedSet<Element> enumConstants; + private final List<Element> enumConstants; /** * The current enum constant that is being documented at this point @@ -94,7 +94,7 @@ typeElement, VisibleMemberMap.Kind.ENUM_CONSTANTS, configuration); - enumConstants = visibleMemberMap.getMembersFor(typeElement); + enumConstants = visibleMemberMap.getMembers(typeElement); } /** @@ -119,34 +119,13 @@ } /** - * Returns a list of enum constants that will be documented for the given class. - * This information can be used for doclet specific documentation - * generation. - * - * @param typeElement the {@link TypeElement} we want to check. - * @return a list of enum constants that will be documented. - */ - public SortedSet<Element> members(TypeElement typeElement) { - return visibleMemberMap.getMembersFor(typeElement); - } - - /** - * Returns the visible member map for the enum constants of this class. - * - * @return the visible member map for the enum constants of this class. - */ - public VisibleMemberMap getVisibleMemberMap() { - return visibleMemberMap; - } - - /** * Returns whether or not there are members to document. * * @return whether or not there are members to document */ @Override public boolean hasMembersToDocument() { - return enumConstants.size() > 0; + return !enumConstants.isEmpty(); } /** @@ -160,16 +139,17 @@ if (writer == null) { return; } - if (!enumConstants.isEmpty()) { + if (hasMembersToDocument()) { Content enumConstantsDetailsTree = writer.getEnumConstantsDetailsTreeHeader(typeElement, memberDetailsTree); - for (Element element : enumConstants) { - currentElement = (VariableElement)element; + Element lastElement = enumConstants.get(enumConstants.size() - 1); + for (Element enumConstant : enumConstants) { + currentElement = (VariableElement)enumConstant; Content enumConstantsTree = writer.getEnumConstantsTreeHeader(currentElement, enumConstantsDetailsTree); buildChildren(node, enumConstantsTree); enumConstantsDetailsTree.addContent(writer.getEnumConstants( - enumConstantsTree, currentElement.equals(enumConstants.last()))); + enumConstantsTree, currentElement == lastElement)); } memberDetailsTree.addContent( writer.getEnumConstantsDetails(enumConstantsDetailsTree));
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/FieldBuilder.java Tue Nov 22 10:48:24 2016 -0800 @@ -69,7 +69,7 @@ /** * The list of fields being documented. */ - private final SortedSet<Element> fields; + private final List<Element> fields; /** * The index of the current field that is being documented at this point @@ -95,7 +95,7 @@ typeElement, VisibleMemberMap.Kind.FIELDS, configuration); - fields = visibleMemberMap.getLeafClassMembers(); + fields = visibleMemberMap.getLeafMembers(); } /** @@ -121,27 +121,6 @@ } /** - * Returns a list of fields that will be documented for the given class. - * This information can be used for doclet specific documentation - * generation. - * - * @param typeElement the {@link TypeElement} we want to check. - * @return a list of fields that will be documented. - */ - public SortedSet<Element> members(TypeElement typeElement) { - return visibleMemberMap.getMembersFor(typeElement); - } - - /** - * Returns the visible member map for the fields of this class. - * - * @return the visible member map for the fields of this class. - */ - public VisibleMemberMap getVisibleMemberMap() { - return visibleMemberMap; - } - - /** * Returns whether or not there are members to document. * * @return whether or not there are members to document @@ -164,12 +143,14 @@ } if (!fields.isEmpty()) { Content fieldDetailsTree = writer.getFieldDetailsTreeHeader(typeElement, memberDetailsTree); + + Element lastElement = fields.get(fields.size() - 1); for (Element element : fields) { currentElement = (VariableElement)element; Content fieldDocTree = writer.getFieldDocTreeHeader(currentElement, fieldDetailsTree); buildChildren(node, fieldDocTree); fieldDetailsTree.addContent(writer.getFieldDoc( - fieldDocTree, currentElement.equals(fields.last()))); + fieldDocTree, currentElement == lastElement)); } memberDetailsTree.addContent( writer.getFieldDetails(fieldDetailsTree));
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MemberSummaryBuilder.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MemberSummaryBuilder.java Tue Nov 22 10:48:24 2016 -0800 @@ -182,7 +182,9 @@ * @see VisibleMemberMap */ public SortedSet<Element> members(VisibleMemberMap.Kind type) { - return visibleMemberMaps.get(type).getLeafClassMembers(); + TreeSet<Element> out = new TreeSet<>(comparator); + out.addAll(visibleMemberMaps.get(type).getLeafMembers()); + return out; } /** @@ -336,7 +338,7 @@ */ private void buildSummary(MemberSummaryWriter writer, VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) { - SortedSet<Element> members = visibleMemberMap.getLeafClassMembers(); + SortedSet<Element> members = asSortedSet(visibleMemberMap.getLeafMembers()); if (!members.isEmpty()) { List<Content> tableContents = new LinkedList<>(); int counter = 0; @@ -492,7 +494,7 @@ if (inhclass == typeElement) { continue; } - SortedSet<Element> inhmembers = visibleMemberMap.getMembersFor(inhclass); + SortedSet<Element> inhmembers = asSortedSet(visibleMemberMap.getMembers(inhclass)); if (!inhmembers.isEmpty()) { Content inheritedTree = writer.getInheritedSummaryHeader(inhclass); Content linksTree = writer.getInheritedSummaryLinksTree();
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/MethodBuilder.java Tue Nov 22 10:48:24 2016 -0800 @@ -78,7 +78,7 @@ /** * The methods being documented. */ - private final SortedSet<Element> methods; + private final List<Element> methods; /** @@ -98,7 +98,7 @@ typeElement, VisibleMemberMap.Kind.METHODS, configuration); - methods = visibleMemberMap.getLeafClassMembers(); + methods = visibleMemberMap.getLeafMembers(); } /** @@ -124,27 +124,6 @@ } /** - * Returns a list of methods that will be documented for the given class. - * This information can be used for doclet specific documentation - * generation. - * - * @param typeElement the {@link TypeElement} we want to check. - * @return a list of methods that will be documented. - */ - public SortedSet<Element> members(TypeElement typeElement) { - return visibleMemberMap.getMembersFor(typeElement); - } - - /** - * Returns the visible member map for the methods of this class. - * - * @return the visible member map for the methods of this class. - */ - public VisibleMemberMap getVisibleMemberMap() { - return visibleMemberMap; - } - - /** * {@inheritDoc} */ @Override @@ -163,18 +142,17 @@ if (writer == null) { return; } - if (!methods.isEmpty()) { + if (hasMembersToDocument()) { Content methodDetailsTree = writer.getMethodDetailsTreeHeader(typeElement, memberDetailsTree); - Set<Element> methodDetailSet = ((ConfigurationImpl)configuration).sortedMethodDetails - ? methods - : visibleMemberMap.getLeafClassMembersSourceOrder(); - for (Element e : methodDetailSet) { - currentMethod = (ExecutableElement) e; + + Element lastElement = methods.get(methods.size() - 1); + for (Element method : methods) { + currentMethod = (ExecutableElement)method; Content methodDocTree = writer.getMethodDocTreeHeader(currentMethod, methodDetailsTree); buildChildren(node, methodDocTree); methodDetailsTree.addContent(writer.getMethodDoc( - methodDocTree, currentMethod == methods.last())); + methodDocTree, currentMethod == lastElement)); } memberDetailsTree.addContent(writer.getMethodDetails(methodDetailsTree)); }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/PropertyBuilder.java Tue Nov 22 10:48:24 2016 -0800 @@ -69,7 +69,7 @@ /** * The list of properties being documented. */ - private final SortedSet<Element> properties; + private final List<Element> properties; /** * The index of the current property that is being documented at this point @@ -95,7 +95,7 @@ typeElement, VisibleMemberMap.Kind.PROPERTIES, configuration); - properties = visibleMemberMap.getMembersFor(typeElement); + properties = visibleMemberMap.getMembers(typeElement); } /** @@ -121,27 +121,6 @@ } /** - * Returns a list of properties that will be documented for the given class. - * This information can be used for doclet specific documentation - * generation. - * - * @param typeElement the {@link TypeElement} we want to check. - * @return a list of properties that will be documented. - */ - public SortedSet<Element> members(TypeElement typeElement) { - return visibleMemberMap.getMembersFor(typeElement); - } - - /** - * Returns the visible member map for the properties of this class. - * - * @return the visible member map for the properties of this class. - */ - public VisibleMemberMap getVisibleMemberMap() { - return visibleMemberMap; - } - - /** * Returns whether or not there are members to document. * * @return whether or not there are members to document @@ -162,17 +141,17 @@ if (writer == null) { return; } - int size = properties.size(); - if (size > 0) { + if (hasMembersToDocument()) { Content propertyDetailsTree = writer.getPropertyDetailsTreeHeader(typeElement, memberDetailsTree); - for (Element e : properties) { - currentProperty = (ExecutableElement) e; + Element lastElement = properties.get(properties.size() - 1); + for (Element property : properties) { + currentProperty = (ExecutableElement)property; Content propertyDocTree = writer.getPropertyDocTreeHeader(currentProperty, propertyDetailsTree); buildChildren(node, propertyDocTree); propertyDetailsTree.addContent(writer.getPropertyDoc( - propertyDocTree, currentProperty == properties.last())); + propertyDocTree, currentProperty == lastElement)); } memberDetailsTree.addContent( writer.getPropertyDetails(propertyDetailsTree));
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java Tue Nov 22 10:48:24 2016 -0800 @@ -25,7 +25,6 @@ package jdk.javadoc.internal.doclets.toolkit.util; -import java.io.IOException; import java.lang.annotation.Documented; import java.lang.ref.SoftReference; import java.text.CollationKey; @@ -77,9 +76,7 @@ import com.sun.source.util.TreePath; import jdk.javadoc.internal.doclets.toolkit.CommentUtils.DocCommentDuo; import jdk.javadoc.internal.doclets.toolkit.Configuration; -import jdk.javadoc.internal.doclets.toolkit.DocletException; import jdk.javadoc.internal.doclets.toolkit.Messages; -import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.WorkArounds; import static javax.lang.model.element.ElementKind.*; @@ -258,14 +255,6 @@ return getEnclosingTypeElement(e) == null || isStatic(e); } - public boolean matches(Element e1, Element e2) { - if (isExecutableElement(e1) && isExecutableElement(e1)) { - return executableMembersEqual((ExecutableElement)e1, (ExecutableElement)e2); - } else { - return e1.getSimpleName().equals(e2.getSimpleName()); - } - } - /** * Copy doc-files directory and its contents from the source * package directory to the generated documentation directory. @@ -2161,6 +2150,13 @@ return convertToExecutableElement(getItems(e, false, METHOD)); } + public int getOrdinalValue(VariableElement member) { + if (member == null || member.getKind() != ENUM_CONSTANT) { + throw new IllegalArgumentException("must be an enum constant: " + member); + } + return member.getEnclosingElement().getEnclosedElements().indexOf(member); + } + public long getLineNumber(Element e) { TreePath path = getTreePath(e); if (path == null) { // maybe null if synthesized
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/VisibleMemberMap.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/VisibleMemberMap.java Tue Nov 22 10:48:24 2016 -0800 @@ -220,48 +220,36 @@ } /** - * Return the visible members of the class being mapped. Also append at the - * end of the list members that are inherited by inaccessible parents. We - * document these members in the child because the parent is not documented. + * Returns a list of visible enclosed members of the type being mapped. + * This list may also contain appended members, inherited by inaccessible + * super types. These members are documented in the subtype when the + * super type is not documented. * - * @param configuration the current configuration of the doclet. + * @return a list of visible enclosed members */ - public SortedSet<Element> getLeafClassMembers() { - SortedSet<Element> result = getMembersFor(typeElement); - result.addAll(getInheritedPackagePrivateMethods()); - return result; - } - public Set<Element> getLeafClassMembersSourceOrder() { - Set<Element> result = new LinkedHashSet<>(classMap.get(typeElement).members); + public List<Element> getLeafMembers() { + List<Element> result = new ArrayList<>(); + result.addAll(classMap.get(typeElement).members); result.addAll(getInheritedPackagePrivateMethods()); return result; } /** - * Retrn the list of members for the given class. + * Returns a list of enclosed members for the given type. * - * @param typeElement the class to retrieve the list of visible members for. + * @param typeElement the given type * - * @return the list of members for the given class. + * @return a list of enclosed members */ - public SortedSet<Element> getMembersFor(TypeElement typeElement) { - return asSortedSet(classMap.get(typeElement).members); + public List<Element> getMembers(TypeElement typeElement) { + return classMap.get(typeElement).members; } - public boolean hasMembersFor(TypeElement typeElement) { + public boolean hasMembers(TypeElement typeElement) { return !classMap.get(typeElement).members.isEmpty(); } - private SortedSet<Element> asSortedSet(Collection<Element> in) { - if (in == null) { - return Collections.emptySortedSet(); - } - TreeSet<Element> out = new TreeSet<>(comparator); - out.addAll(in); - return out; - } - private void fillMemberLevelMap(List<? extends Element> list, String level) { for (Element element : list) { Object key = getMemberKey(element); @@ -318,9 +306,9 @@ private final TypeElement typeElement; /** - * List of inherited members from the mapping class. + * List of members from the mapping class. */ - private Set<Element> members = new LinkedHashSet<>(); + private List<Element> members = null; /** * Level/Depth of inheritance. @@ -379,23 +367,23 @@ * Adjust member-level-map, class-map. */ private void addMembers(TypeElement fromClass) { - List<? extends Element> classMembers = getClassMembers(fromClass, true); - List<Element> incllist = new ArrayList<>(); - for (Element element : classMembers) { - if (!found(members, element)) { - if (memberIsVisible(element)) { - if (!isOverridden(element, level)) { - if (!utils.isHidden(element)) { - incllist.add(element); - } + List<Element> result = new ArrayList<>(); + for (Element element : getClassMembers(fromClass, true)) { + if (memberIsVisible(element)) { + if (!isOverridden(element, level)) { + if (!utils.isHidden(element)) { + result.add(element); } } } } - if (!incllist.isEmpty()) { + if (members != null) { + throw new AssertionError("members should not be null"); + } + members = Collections.unmodifiableList(result); + if (!members.isEmpty()) { noVisibleMembers = false; } - members.addAll(incllist); fillMemberLevelMap(getClassMembers(fromClass, false), level); } @@ -513,16 +501,6 @@ return targetMembers; } - private boolean found(Iterable<Element> list, Element elem) { - for (Element pgmelem : list) { - if (utils.matches(pgmelem, elem)) { - return true; - } - } - return false; - } - - /** * Is member overridden? The member is overridden if it is found in the * same level hierarchy e.g. member at level "11" overrides member at
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java Tue Nov 22 10:48:24 2016 -0800 @@ -939,6 +939,17 @@ public void put(String name, String value) { compOpts.put(name, value); } + + @Override + public void remove(String name) { + compOpts.remove(name); + } + + @Override + public boolean handleFileManagerOption(com.sun.tools.javac.main.Option option, String value) { + fileManagerOpts.put(option, value); + return true; + } }; }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOption.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOption.java Tue Nov 22 10:48:24 2016 -0800 @@ -57,63 +57,56 @@ BOOTCLASSPATH("-bootclasspath", STANDARD, true) { @Override public void process(Helper helper, String arg) { - helper.setFileManagerOpt(Option.BOOT_CLASS_PATH, arg); + Option.BOOT_CLASS_PATH.process(helper.getOptionHelper(), primaryName, arg); } }, CLASS_PATH("--class-path -classpath -cp", STANDARD, true) { @Override public void process(Helper helper, String arg) { - helper.setFileManagerOpt(Option.CLASS_PATH, arg); + Option.CLASS_PATH.process(helper.getOptionHelper(), primaryName, arg); } }, EXTDIRS("-extdirs", STANDARD, true) { @Override public void process(Helper helper, String arg) { - helper.setFileManagerOpt(Option.EXTDIRS, arg); + Option.EXTDIRS.process(helper.getOptionHelper(), primaryName, arg); } }, SOURCE_PATH("--source-path -sourcepath", STANDARD, true) { @Override public void process(Helper helper, String arg) { - helper.setFileManagerOpt(Option.SOURCE_PATH, arg); - } - }, - - SYSCLASSPATH("-sysclasspath", HIDDEN, true) { - @Override - public void process(Helper helper, String arg) { - helper.setFileManagerOpt(Option.BOOT_CLASS_PATH, arg); + Option.SOURCE_PATH.process(helper.getOptionHelper(), primaryName, arg); } }, MODULE_SOURCE_PATH("--module-source-path", STANDARD, true) { @Override public void process(Helper helper, String arg) { - helper.setFileManagerOpt(Option.MODULE_SOURCE_PATH, arg); + Option.MODULE_SOURCE_PATH.process(helper.getOptionHelper(), primaryName, arg); } }, UPGRADE_MODULE_PATH("--upgrade-module-path", STANDARD, true) { @Override public void process(Helper helper, String arg) { - helper.setFileManagerOpt(Option.UPGRADE_MODULE_PATH, arg); + Option.UPGRADE_MODULE_PATH.process(helper.getOptionHelper(), primaryName, arg); } }, SYSTEM("--system", STANDARD, true) { @Override public void process(Helper helper, String arg) { - helper.setFileManagerOpt(Option.SYSTEM, arg); + Option.SYSTEM.process(helper.getOptionHelper(), primaryName, arg); } }, MODULE_PATH("--module-path -p", STANDARD, true) { @Override public void process(Helper helper, String arg) { - helper.setFileManagerOpt(Option.MODULE_PATH, arg); + Option.MODULE_PATH.process(helper.getOptionHelper(), primaryName, arg); } }, @@ -141,7 +134,7 @@ ENCODING("-encoding", STANDARD, true) { @Override public void process(Helper helper, String arg) { - helper.setFileManagerOpt(Option.ENCODING, arg); + Option.ENCODING.process(helper.getOptionHelper(), primaryName, arg); } }, @@ -290,14 +283,6 @@ // ----- output control options ----- - PROMPT("-prompt", HIDDEN) { - @Override - public void process(Helper helper) { - helper.compOpts.put("-prompt", "-prompt"); - helper.promptOnError = true; - } - }, - QUIET("-quiet", STANDARD) { @Override public void process(Helper helper) {
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsConfiguration.java Tue Nov 22 10:48:24 2016 -0800 @@ -89,6 +89,7 @@ List<Path> classpaths, List<Archive> initialArchives, boolean allDefaultModules, + boolean allSystemModules, Runtime.Version version) throws IOException { @@ -107,6 +108,11 @@ roots.isEmpty() || allDefaultModules) { mods.addAll(systemModulePath.defaultSystemRoots()); } + if (allSystemModules) { + systemModulePath.findAll().stream() + .map(mref -> mref.descriptor().name()) + .forEach(mods::add); + } this.configuration = Configuration.empty() .resolveRequires(finder, ModuleFinder.of(), mods); @@ -488,6 +494,7 @@ ModuleFinder appModulePath; boolean addAllApplicationModules; boolean addAllDefaultModules; + boolean addAllSystemModules; Runtime.Version version; public Builder() { @@ -533,8 +540,7 @@ * Include all system modules and modules found on modulepath */ public Builder allModules() { - systemModulePath.moduleNames() - .forEach(this.rootModules::add); + this.addAllSystemModules = true; this.addAllApplicationModules = true; return this; } @@ -588,6 +594,7 @@ classPaths, initialArchives, addAllDefaultModules, + addAllSystemModules, version); }
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java Tue Nov 22 10:48:24 2016 -0800 @@ -25,8 +25,10 @@ package com.sun.tools.jdeps; +import com.sun.tools.jdeps.Analyzer.Type; import static com.sun.tools.jdeps.Analyzer.Type.*; import static com.sun.tools.jdeps.JdepsWriter.*; +import static java.util.stream.Collectors.*; import java.io.IOException; import java.io.PrintWriter; @@ -111,6 +113,10 @@ this.aliases = aliases; } + Option(boolean hasArg, CommandOption cmd) { + this(hasArg, cmd.names()); + } + boolean isHidden() { return false; } @@ -144,25 +150,46 @@ } } + enum CommandOption { + ANALYZE_DEPS(""), + GENERATE_DOT_FILE("-dotoutput", "--dot-output"), + GENERATE_MODULE_INFO("--generate-module-info"), + LIST_DEPS("--list-deps"), + LIST_REDUCED_DEPS("--list-reduced-deps"), + CHECK_MODULES("--check"); + + private final String[] names; + CommandOption(String... names) { + this.names = names; + } + + String[] names() { + return names; + } + + @Override + public String toString() { + return names[0]; + } + } + static Option[] recognizedOptions = { new Option(false, "-h", "-?", "-help", "--help") { void process(JdepsTask task, String opt, String arg) { task.options.help = true; } }, - new Option(true, "-dotoutput", "--dot-output") { + new Option(true, CommandOption.GENERATE_DOT_FILE) { void process(JdepsTask task, String opt, String arg) throws BadArgs { - Path p = Paths.get(arg); - if (Files.exists(p) && (!Files.isDirectory(p) || !Files.isWritable(p))) { - throw new BadArgs("err.invalid.path", arg); + if (task.command != null) { + throw new BadArgs("err.command.set", task.command, opt); } - task.options.dotOutputDir = Paths.get(arg);; + task.command = task.genDotFile(Paths.get(arg)); } }, new Option(false, "-s", "-summary") { void process(JdepsTask task, String opt, String arg) { task.options.showSummary = true; - task.options.verbose = SUMMARY; } }, new Option(false, "-v", "-verbose", @@ -196,35 +223,48 @@ task.options.apiOnly = true; } }, - new Option(true, "--check") { - void process(JdepsTask task, String opt, String arg) throws BadArgs { - Set<String> mods = Set.of(arg.split(",")); - task.options.checkModuleDeps = mods; - task.options.addmods.addAll(mods); - } - }, - new Option(true, "--generate-module-info") { - void process(JdepsTask task, String opt, String arg) throws BadArgs { - Path p = Paths.get(arg); - if (Files.exists(p) && (!Files.isDirectory(p) || !Files.isWritable(p))) { - throw new BadArgs("err.invalid.path", arg); - } - task.options.genModuleInfo = Paths.get(arg); - } - }, + new Option(false, "-jdkinternals", "--jdk-internals") { void process(JdepsTask task, String opt, String arg) { task.options.findJDKInternals = true; - task.options.verbose = CLASS; if (task.options.includePattern == null) { task.options.includePattern = Pattern.compile(".*"); } } }, - new Option(false, "--list-deps", "--list-reduced-deps") { - void process(JdepsTask task, String opt, String arg) { - task.options.showModulesAddExports = true; - task.options.reduced = opt.equals("--list-reduced-deps"); + + new Option(true, CommandOption.CHECK_MODULES) { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + if (task.command != null) { + throw new BadArgs("err.command.set", task.command, opt); + } + Set<String> mods = Set.of(arg.split(",")); + task.options.addmods.addAll(mods); + task.command = task.checkModuleDeps(mods); + } + }, + new Option(true, CommandOption.GENERATE_MODULE_INFO) { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + if (task.command != null) { + throw new BadArgs("err.command.set", task.command, opt); + } + task.command = task.genModuleInfo(Paths.get(arg)); + } + }, + new Option(false, CommandOption.LIST_DEPS) { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + if (task.command != null) { + throw new BadArgs("err.command.set", task.command, opt); + } + task.command = task.listModuleDeps(false); + } + }, + new Option(false, CommandOption.LIST_REDUCED_DEPS) { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + if (task.command != null) { + throw new BadArgs("err.command.set", task.command, opt); + } + task.command = task.listModuleDeps(true); } }, @@ -419,6 +459,7 @@ private final Options options = new Options(); private final List<String> inputArgs = new ArrayList<>(); + private Command command; private PrintWriter log; void setLog(PrintWriter out) { log = out; @@ -445,55 +486,30 @@ if (options.version || options.fullVersion) { showVersion(options.fullVersion); } + if (options.help || options.version || options.fullVersion) { + return EXIT_OK; + } + if (!inputArgs.isEmpty() && options.rootModule != null) { reportError("err.invalid.arg.for.option", "-m"); } - if (inputArgs.isEmpty() && options.addmods.isEmpty() && options.includePattern == null - && options.includeSystemModulePattern == null && options.checkModuleDeps == null) { - if (options.help || options.version || options.fullVersion) { - return EXIT_OK; - } else { - showHelp(); - return EXIT_CMDERR; - } - } - if (options.genModuleInfo != null) { - if (options.dotOutputDir != null || options.classpath != null || options.hasFilter()) { - showHelp(); - return EXIT_CMDERR; - } - } if (options.numFilters() > 1) { reportError("err.invalid.filters"); return EXIT_CMDERR; } - if (options.inverse && options.depth != 1) { - reportError("err.invalid.inverse.option", "-R"); - return EXIT_CMDERR; + // default command to analyze dependences + if (command == null) { + command = analyzeDeps(); } - - if (options.inverse && options.numFilters() == 0) { - reportError("err.invalid.filters"); - return EXIT_CMDERR; - } - - if ((options.findJDKInternals) && (options.hasFilter() || options.showSummary)) { - showHelp(); - return EXIT_CMDERR; - } - if (options.showSummary && options.verbose != SUMMARY) { - showHelp(); - return EXIT_CMDERR; - } - if (options.checkModuleDeps != null && !inputArgs.isEmpty()) { - reportError("err.invalid.module.option", inputArgs, "--check"); + if (!command.checkOptions()) { return EXIT_CMDERR; } boolean ok = run(); return ok ? EXIT_OK : EXIT_ERROR; + } catch (BadArgs|UncheckedBadArgs e) { reportError(e.getKey(), e.getArgs()); if (e.showUsage()) { @@ -515,13 +531,14 @@ } boolean run() throws IOException { - try (JdepsConfiguration config = buildConfig()) { + try (JdepsConfiguration config = buildConfig(command.allModules())) { // detect split packages - config.splitPackages().entrySet().stream() + config.splitPackages().entrySet() + .stream() .sorted(Map.Entry.comparingByKey()) .forEach(e -> System.out.format("split package: %s %s%n", e.getKey(), - e.getValue().toString())); + e.getValue().toString())); // check if any module specified in --require is missing Stream.concat(options.addmods.stream(), options.requires.stream()) @@ -529,38 +546,11 @@ .forEach(mn -> config.findModule(mn).orElseThrow(() -> new UncheckedBadArgs(new BadArgs("err.module.not.found", mn)))); - // --generate-module-info - if (options.genModuleInfo != null) { - return genModuleInfo(config); - } - - // --check - if (options.checkModuleDeps != null) { - return new ModuleAnalyzer(config, log, options.checkModuleDeps).run(); - } - - if (options.showModulesAddExports) { - return new ModuleExportsAnalyzer(config, - dependencyFilter(config), - options.reduced, - log).run(); - } - - if (options.dotOutputDir != null && - (options.verbose == SUMMARY || options.verbose == MODULE) && - !options.addmods.isEmpty() && inputArgs.isEmpty()) { - return new ModuleAnalyzer(config, log).genDotFiles(options.dotOutputDir); - } - - if (options.inverse) { - return analyzeInverseDeps(config); - } else { - return analyzeDeps(config); - } + return command.run(config); } } - private JdepsConfiguration buildConfig() throws IOException { + private JdepsConfiguration buildConfig(boolean allModules) throws IOException { JdepsConfiguration.Builder builder = new JdepsConfiguration.Builder(options.systemModulePath); @@ -568,7 +558,7 @@ .appModulePath(options.modulePath) .addmods(options.addmods); - if (options.checkModuleDeps != null || options.showModulesAddExports) { + if (allModules) { // check all system modules in the image builder.allModules(); } @@ -592,148 +582,421 @@ return builder.build(); } - private boolean analyzeDeps(JdepsConfiguration config) throws IOException { - // output result - final JdepsWriter writer; - if (options.dotOutputDir != null) { - writer = new DotFileWriter(options.dotOutputDir, - options.verbose, - options.showProfile, - options.showModule, - options.showLabel); - } else { - writer = new SimpleWriter(log, - options.verbose, - options.showProfile, - options.showModule); + // ---- factory methods to create a Command + + private AnalyzeDeps analyzeDeps() throws BadArgs { + return options.inverse ? new InverseAnalyzeDeps() + : new AnalyzeDeps(); + } + + private GenDotFile genDotFile(Path dir) throws BadArgs { + if (Files.exists(dir) && (!Files.isDirectory(dir) || !Files.isWritable(dir))) { + throw new BadArgs("err.invalid.path", dir.toString()); + } + return new GenDotFile(dir); + } + + private GenModuleInfo genModuleInfo(Path dir) throws BadArgs { + if (Files.exists(dir) && (!Files.isDirectory(dir) || !Files.isWritable(dir))) { + throw new BadArgs("err.invalid.path", dir.toString()); + } + return new GenModuleInfo(dir); + } + + private ListModuleDeps listModuleDeps(boolean reduced) throws BadArgs { + return reduced ? new ListReducedDeps() + : new ListModuleDeps(); + } + + private CheckModuleDeps checkModuleDeps(Set<String> mods) throws BadArgs { + return new CheckModuleDeps(mods); + } + + abstract class Command { + final CommandOption option; + protected Command(CommandOption option) { + this.option = option; + } + /** + * Returns true if the command-line options are all valid; + * otherwise, returns false. + */ + abstract boolean checkOptions(); + + /** + * Do analysis + */ + abstract boolean run(JdepsConfiguration config) throws IOException; + + /** + * Includes all modules on system module path and application module path + */ + boolean allModules() { + return false; } - // analyze the dependencies - DepsAnalyzer analyzer = new DepsAnalyzer(config, - dependencyFilter(config), - writer, - options.verbose, - options.apiOnly); + @Override + public String toString() { + return option.toString(); + } + } - boolean ok = analyzer.run(options.compileTimeView, options.depth); - // print skipped entries, if any - if (!options.nowarning) { - analyzer.archives() - .forEach(archive -> archive.reader() - .skippedEntries().stream() - .forEach(name -> warning("warn.skipped.entry", name))); + /** + * Analyze dependences + */ + class AnalyzeDeps extends Command { + JdepsWriter writer; + AnalyzeDeps() { + this(CommandOption.ANALYZE_DEPS); } - if (options.findJDKInternals && !options.nowarning) { - Map<String, String> jdkInternals = new TreeMap<>(); - Set<String> deps = analyzer.dependences(); - // find the ones with replacement - deps.forEach(cn -> replacementFor(cn).ifPresent( - repl -> jdkInternals.put(cn, repl)) - ); + AnalyzeDeps(CommandOption option) { + super(option); + } - if (!deps.isEmpty()) { - log.println(); - warning("warn.replace.useJDKInternals", getMessage("jdeps.wiki.url")); + @Override + boolean checkOptions() { + if (options.findJDKInternals) { + // cannot set any filter, -verbose and -summary option + if (options.showSummary || options.verbose != null) { + reportError("err.invalid.options", "-summary or -verbose", + "-jdkinternals"); + return false; + } + if (options.hasFilter()) { + reportError("err.invalid.options", "--package, --regex, --require", + "-jdkinternals"); + return false; + } + } + if (options.showSummary) { + // -summary cannot use with -verbose option + if (options.verbose != null) { + reportError("err.invalid.options", "-v, -verbose", "-s, -summary"); + return false; + } + } + if (inputArgs.isEmpty() && !options.hasSourcePath()) { + showHelp(); + return false; + } + return true; + } + + /* + * Default is to show package-level dependencies + */ + Type getAnalyzerType() { + if (options.showSummary) + return Type.SUMMARY; + + if (options.findJDKInternals) + return Type.CLASS; + + // default to package-level verbose + return options.verbose != null ? options.verbose : PACKAGE; + } + + @Override + boolean run(JdepsConfiguration config) throws IOException { + Type type = getAnalyzerType(); + // default to package-level verbose + JdepsWriter writer = new SimpleWriter(log, + type, + options.showProfile, + options.showModule); + + return run(config, writer, type); + } + + boolean run(JdepsConfiguration config, JdepsWriter writer, Type type) throws IOException { + + + // analyze the dependencies + DepsAnalyzer analyzer = new DepsAnalyzer(config, + dependencyFilter(config), + writer, + type, + options.apiOnly); + + boolean ok = analyzer.run(options.compileTimeView, options.depth); + + // print skipped entries, if any + if (!options.nowarning) { + analyzer.archives() + .forEach(archive -> archive.reader() + .skippedEntries().stream() + .forEach(name -> warning("warn.skipped.entry", name))); } - if (!jdkInternals.isEmpty()) { - log.println(); - log.format("%-40s %s%n", "JDK Internal API", "Suggested Replacement"); - log.format("%-40s %s%n", "----------------", "---------------------"); - jdkInternals.entrySet().stream() - .forEach(e -> { - String key = e.getKey(); - String[] lines = e.getValue().split("\\n"); - for (String s : lines) { - log.format("%-40s %s%n", key, s); - key = ""; + if (options.findJDKInternals && !options.nowarning) { + Map<String, String> jdkInternals = new TreeMap<>(); + Set<String> deps = analyzer.dependences(); + // find the ones with replacement + deps.forEach(cn -> replacementFor(cn).ifPresent( + repl -> jdkInternals.put(cn, repl)) + ); + + if (!deps.isEmpty()) { + log.println(); + warning("warn.replace.useJDKInternals", getMessage("jdeps.wiki.url")); + } + + if (!jdkInternals.isEmpty()) { + log.println(); + log.format("%-40s %s%n", "JDK Internal API", "Suggested Replacement"); + log.format("%-40s %s%n", "----------------", "---------------------"); + jdkInternals.entrySet().stream() + .forEach(e -> { + String key = e.getKey(); + String[] lines = e.getValue().split("\\n"); + for (String s : lines) { + log.format("%-40s %s%n", key, s); + key = ""; + } + }); + } + } + return ok; + } + } + + + class InverseAnalyzeDeps extends AnalyzeDeps { + InverseAnalyzeDeps() { + } + + @Override + boolean checkOptions() { + if (options.depth != 1) { + reportError("err.invalid.options", "-R", "--inverse"); + return false; + } + + if (options.numFilters() == 0) { + reportError("err.filter.not.specified"); + return false; + } + + if (!super.checkOptions()) { + return false; + } + + return true; + } + + @Override + boolean run(JdepsConfiguration config) throws IOException { + Type type = getAnalyzerType(); + + InverseDepsAnalyzer analyzer = + new InverseDepsAnalyzer(config, + dependencyFilter(config), + writer, + type, + options.apiOnly); + boolean ok = analyzer.run(); + + log.println(); + if (!options.requires.isEmpty()) + log.format("Inverse transitive dependences on %s%n", options.requires); + else + log.format("Inverse transitive dependences matching %s%n", + options.regex != null + ? options.regex.toString() + : "packages " + options.packageNames); + + analyzer.inverseDependences().stream() + .sorted(Comparator.comparing(this::sortPath)) + .forEach(path -> log.println(path.stream() + .map(Archive::getName) + .collect(joining(" <- ")))); + return ok; + } + + private String sortPath(Deque<Archive> path) { + return path.peekFirst().getName(); + } + } + + + class GenModuleInfo extends Command { + final Path dir; + GenModuleInfo(Path dir) { + super(CommandOption.GENERATE_MODULE_INFO); + this.dir = dir; + } + + @Override + boolean checkOptions() { + if (options.classpath != null) { + reportError("err.invalid.options", "-classpath", + option); + return false; + } + if (options.hasFilter()) { + reportError("err.invalid.options", "--package, --regex, --require", + option); + return false; + } + return true; + } + + @Override + boolean run(JdepsConfiguration config) throws IOException { + // check if any JAR file contains unnamed package + for (String arg : inputArgs) { + try (ClassFileReader reader = ClassFileReader.newInstance(Paths.get(arg))) { + Optional<String> classInUnnamedPackage = + reader.entries().stream() + .filter(n -> n.endsWith(".class")) + .filter(cn -> toPackageName(cn).isEmpty()) + .findFirst(); + + if (classInUnnamedPackage.isPresent()) { + if (classInUnnamedPackage.get().equals("module-info.class")) { + reportError("err.genmoduleinfo.not.jarfile", arg); + } else { + reportError("err.genmoduleinfo.unnamed.package", arg); + } + return false; + } + } + } + + ModuleInfoBuilder builder + = new ModuleInfoBuilder(config, inputArgs, dir); + boolean ok = builder.run(); + + if (!ok && !options.nowarning) { + log.println("ERROR: missing dependencies"); + builder.visitMissingDeps( + new Analyzer.Visitor() { + @Override + public void visitDependence(String origin, Archive originArchive, + String target, Archive targetArchive) { + if (builder.notFound(targetArchive)) + log.format(" %-50s -> %-50s %s%n", + origin, target, targetArchive.getName()); } }); } + return ok; } - return ok; + + private String toPackageName(String name) { + int i = name.lastIndexOf('/'); + return i > 0 ? name.replace('/', '.').substring(0, i) : ""; + } } - private boolean analyzeInverseDeps(JdepsConfiguration config) throws IOException { - JdepsWriter writer = new SimpleWriter(log, - options.verbose, - options.showProfile, - options.showModule); + class CheckModuleDeps extends Command { + final Set<String> modules; + CheckModuleDeps(Set<String> mods) { + super(CommandOption.CHECK_MODULES); + this.modules = mods; + } - InverseDepsAnalyzer analyzer = new InverseDepsAnalyzer(config, - dependencyFilter(config), - writer, - options.verbose, - options.apiOnly); - boolean ok = analyzer.run(); + @Override + boolean checkOptions() { + if (!inputArgs.isEmpty()) { + reportError("err.invalid.options", inputArgs, "--check"); + return false; + } + return true; + } - log.println(); - if (!options.requires.isEmpty()) - log.format("Inverse transitive dependences on %s%n", options.requires); - else - log.format("Inverse transitive dependences matching %s%n", - options.regex != null - ? options.regex.toString() - : "packages " + options.packageNames); + @Override + boolean run(JdepsConfiguration config) throws IOException { + if (!config.initialArchives().isEmpty()) { + String list = config.initialArchives().stream() + .map(Archive::getPathName).collect(joining(" ")); + throw new UncheckedBadArgs(new BadArgs("err.invalid.options", + list, "--check")); + } + return new ModuleAnalyzer(config, log, modules).run(); + } - analyzer.inverseDependences().stream() - .sorted(Comparator.comparing(this::sortPath)) - .forEach(path -> log.println(path.stream() - .map(Archive::getName) - .collect(Collectors.joining(" <- ")))); - return ok; + public boolean allModules() { + return true; + } } - private String sortPath(Deque<Archive> path) { - return path.peekFirst().getName(); + class ListReducedDeps extends ListModuleDeps { + ListReducedDeps() { + super(CommandOption.LIST_REDUCED_DEPS, true); + } } - private boolean genModuleInfo(JdepsConfiguration config) throws IOException { - // check if any JAR file contains unnamed package - for (String arg : inputArgs) { - try (ClassFileReader reader = ClassFileReader.newInstance(Paths.get(arg))) { - Optional<String> classInUnnamedPackage = - reader.entries().stream() - .filter(n -> n.endsWith(".class")) - .filter(cn -> toPackageName(cn).isEmpty()) - .findFirst(); - - if (classInUnnamedPackage.isPresent()) { - if (classInUnnamedPackage.get().equals("module-info.class")) { - reportError("err.genmoduleinfo.not.jarfile", arg); - } else { - reportError("err.genmoduleinfo.unnamed.package", arg); - } - return false; - } - } + class ListModuleDeps extends Command { + final boolean reduced; + ListModuleDeps() { + this(CommandOption.LIST_DEPS, false); + } + ListModuleDeps(CommandOption option, boolean reduced) { + super(option); + this.reduced = reduced; } - ModuleInfoBuilder builder - = new ModuleInfoBuilder(config, inputArgs, options.genModuleInfo); - boolean ok = builder.run(); + @Override + boolean checkOptions() { + if (options.showSummary || options.verbose != null) { + reportError("err.invalid.options", "-summary or -verbose", + option); + return false; + } + if (options.findJDKInternals) { + reportError("err.invalid.options", "-jdkinternals", + option); + return false; + } + if (inputArgs.isEmpty() && !options.hasSourcePath()) { + showHelp(); + return false; + } + return true; + } - if (!ok && !options.nowarning) { - log.println("ERROR: missing dependencies"); - builder.visitMissingDeps( - new Analyzer.Visitor() { - @Override - public void visitDependence(String origin, Archive originArchive, - String target, Archive targetArchive) { - if (builder.notFound(targetArchive)) - log.format(" %-50s -> %-50s %s%n", - origin, target, targetArchive.getName()); - } - }); + @Override + boolean run(JdepsConfiguration config) throws IOException { + return new ModuleExportsAnalyzer(config, + dependencyFilter(config), + reduced, + log).run(); } - return ok; + + @Override + boolean allModules() { + return true; + } } - private String toPackageName(String name) { - int i = name.lastIndexOf('/'); - return i > 0 ? name.replace('/', '.').substring(0, i) : ""; + + class GenDotFile extends AnalyzeDeps { + final Path dotOutputDir; + GenDotFile(Path dotOutputDir) { + super(CommandOption.GENERATE_DOT_FILE); + + this.dotOutputDir = dotOutputDir; + } + + @Override + boolean run(JdepsConfiguration config) throws IOException { + if ((options.showSummary || options.verbose == MODULE) && + !options.addmods.isEmpty() && inputArgs.isEmpty()) { + // print module descriptor + return new ModuleAnalyzer(config, log).genDotFiles(dotOutputDir); + } + + Type type = getAnalyzerType(); + JdepsWriter writer = new DotFileWriter(dotOutputDir, + type, + options.showProfile, + options.showModule, + options.showLabel); + return run(config, writer, type); + } } /** @@ -875,14 +1138,11 @@ boolean showLabel; boolean findJDKInternals; boolean nowarning = false; - // default is to show package-level dependencies - // and filter references from same package - Analyzer.Type verbose = PACKAGE; + Analyzer.Type verbose; + // default filter references from same package boolean filterSamePackage = true; boolean filterSameArchive = false; Pattern filterRegex; - Path dotOutputDir; - Path genModuleInfo; String classpath; int depth = 1; Set<String> requires = new HashSet<>(); @@ -892,15 +1152,17 @@ Pattern includeSystemModulePattern; boolean inverse = false; boolean compileTimeView = false; - Set<String> checkModuleDeps; String systemModulePath = System.getProperty("java.home"); String upgradeModulePath; String modulePath; String rootModule; Set<String> addmods = new HashSet<>(); Runtime.Version multiRelease; - boolean showModulesAddExports; - boolean reduced; + + boolean hasSourcePath() { + return !addmods.isEmpty() || includePattern != null || + includeSystemModulePattern != null; + } boolean hasFilter() { return numFilters() > 0;
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Module.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Module.java Tue Nov 22 10:48:24 2016 -0800 @@ -81,7 +81,7 @@ * Returns module name */ public String name() { - return descriptor.name(); + return descriptor != null ? descriptor.name() : getName(); } public boolean isNamed() {
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleAnalyzer.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleAnalyzer.java Tue Nov 22 10:48:24 2016 -0800 @@ -70,14 +70,6 @@ public ModuleAnalyzer(JdepsConfiguration config, PrintWriter log, Set<String> names) { - - if (!config.initialArchives().isEmpty()) { - String list = config.initialArchives().stream() - .map(Archive::getPathName).collect(joining(" ")); - throw new JdepsTask.UncheckedBadArgs(new BadArgs("err.invalid.module.option", - list, "--check")); - } - this.configuration = config; this.log = log;
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModuleExportsAnalyzer.java Tue Nov 22 10:48:24 2016 -0800 @@ -33,6 +33,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import static com.sun.tools.jdeps.Analyzer.NOT_FOUND; @@ -140,20 +141,34 @@ Set<Module> modules = builder.build().adjacentNodes(root); // if reduced is set, apply transition reduction - Set<Module> reducedSet = reduced ? builder.reduced().adjacentNodes(root) - : modules; + Set<Module> reducedSet; + if (reduced) { + Set<Module> nodes = builder.reduced().adjacentNodes(root); + if (nodes.size() == 1) { + // java.base only + reducedSet = nodes; + } else { + // java.base is mandated and can be excluded from the reduced graph + reducedSet = nodes.stream() + .filter(m -> !"java.base".equals(m.name()) || + jdkinternals.containsKey("java.base")) + .collect(Collectors.toSet()); + } + } else { + reducedSet = modules; + } modules.stream() .sorted(Comparator.comparing(Module::name)) .forEach(m -> { - if (jdkinternals.containsKey(m)) { - jdkinternals.get(m).stream() - .sorted() - .forEach(pn -> writer.format(" %s/%s%n", m, pn)); - } else if (reducedSet.contains(m)){ - // if the transition reduction is applied, show the reduced graph - writer.format(" %s%n", m); - } + if (jdkinternals.containsKey(m)) { + jdkinternals.get(m).stream() + .sorted() + .forEach(pn -> writer.format(" %s/%s%n", m, pn)); + } else if (reducedSet.contains(m)){ + // if the transition reduction is applied, show the reduced graph + writer.format(" %s%n", m); + } }); }
--- a/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties Tue Nov 22 10:48:24 2016 -0800 @@ -151,7 +151,9 @@ main.opt.list-deps=\ \ --list-deps Lists the dependences and use of JDK internal\n\ -\ APIs.\n\ +\ APIs. + +main.opt.list-reduced-deps=\ \ --list-reduced-deps Same as --list-deps with not listing\n\ \ the implied reads edges from the module graph\n\ \ If module M1 depends on M2 and M3,\n\ @@ -171,6 +173,7 @@ \ multi-release jar files. <version> should\n\ \ be integer >= 9 or base. +err.command.set={0} and {1} options are specified. err.unknown.option=unknown option: {0} err.missing.arg=no value given for {0} err.invalid.arg.for.option=invalid argument for option: {0} @@ -180,11 +183,10 @@ err.profiles.msg=No profile information err.exception.message={0} err.invalid.path=invalid path: {0} -err.invalid.module.option=Cannot set {0} with {1} option. -err.invalid.filters=Only one of --package (-p), --regex (-e), --require option can be set +err.invalid.options={0} cannot be used with {1} option err.module.not.found=module not found: {0} err.root.module.not.set=root module set empty -err.invalid.inverse.option={0} cannot be used with --inverse option +err.filter.not.specified=--package (-p), --regex (-e), --require option must be specified err.multirelease.option.exists={0} is not a multi-release jar file, but the --multi-release option is set err.multirelease.option.notfound={0} is a multi-release jar file, but the --multi-release option is not set err.multirelease.version.associated=class {0} already associated with version {1}, trying to add version {2}
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java Tue Nov 22 10:48:24 2016 -0800 @@ -57,7 +57,6 @@ import jdk.internal.jline.TerminalSupport; import jdk.internal.jline.WindowsTerminal; import jdk.internal.jline.console.ConsoleReader; -import jdk.internal.jline.console.CursorBuffer; import jdk.internal.jline.console.KeyMap; import jdk.internal.jline.console.UserInterruptException; import jdk.internal.jline.console.completer.Completer; @@ -581,26 +580,55 @@ private static final FixComputer[] FIX_COMPUTERS = new FixComputer[] { new FixComputer('v', false) { //compute "Introduce variable" Fix: + private void performToVar(ConsoleReader in, String type) throws IOException { + in.redrawLine(); + in.setCursorPosition(0); + in.putString(type + " = "); + in.setCursorPosition(in.getCursorBuffer().cursor - 3); + in.flush(); + } + @Override public FixResult compute(JShellTool repl, String code, int cursor) { String type = repl.analysis.analyzeType(code, cursor); if (type == null) { return new FixResult(Collections.emptyList(), null); } - return new FixResult(Collections.singletonList(new Fix() { + List<Fix> fixes = new ArrayList<>(); + fixes.add(new Fix() { @Override public String displayName() { return repl.messageFormat("jshell.console.create.variable"); } + @Override public void perform(ConsoleReader in) throws IOException { - in.redrawLine(); - in.setCursorPosition(0); - in.putString(type + " = "); - in.setCursorPosition(in.getCursorBuffer().cursor - 3); - in.flush(); + performToVar(in, type); } - }), null); + }); + int idx = type.lastIndexOf("."); + if (idx > 0) { + String stype = type.substring(idx + 1); + QualifiedNames res = repl.analysis.listQualifiedNames(stype, stype.length()); + if (res.isUpToDate() && res.getNames().contains(type) + && !res.isResolvable()) { + fixes.add(new Fix() { + @Override + public String displayName() { + return "import: " + type + ". " + + repl.messageFormat("jshell.console.create.variable"); + } + + @Override + public void perform(ConsoleReader in) throws IOException { + repl.state.eval("import " + type + ";"); + in.println("Imported: " + type); + performToVar(in, stype); + } + }); + } + } + return new FixResult(fixes, null); } }, new FixComputer('i', true) { //compute "Add import" Fixes: @@ -614,6 +642,7 @@ public String displayName() { return "import: " + fqn; } + @Override public void perform(ConsoleReader in) throws IOException { repl.state.eval("import " + fqn + ";");
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/JdiDefaultExecutionControl.java Tue Nov 22 10:48:24 2016 -0800 @@ -29,6 +29,7 @@ import java.io.ObjectInput; import java.io.ObjectOutput; import java.io.OutputStream; +import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; @@ -111,7 +112,7 @@ */ private static ExecutionControl create(ExecutionEnv env, boolean isLaunch, String host) throws IOException { - try (final ServerSocket listener = new ServerSocket(0)) { + try (final ServerSocket listener = new ServerSocket(0, 1, InetAddress.getLoopbackAddress())) { // timeout after 60 seconds listener.setSoTimeout(60000); int port = listener.getLocalPort();
--- a/langtools/test/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/test/jdk/javadoc/doclet/testJavaFX/TestJavaFX.java Tue Nov 22 10:48:24 2016 -0800 @@ -23,7 +23,7 @@ /* * @test - * @bug 7112427 8012295 8025633 8026567 8061305 8081854 8150130 8162363 + * @bug 7112427 8012295 8025633 8026567 8061305 8081854 8150130 8162363 8167967 * @summary Test of the JavaFX doclet features. * @author jvalenta * @library ../lib @@ -163,10 +163,7 @@ "pkg2"); checkExit(Exit.OK); checkOutput("pkg2/Test.html", true, - "<li class=\"blockList\"><a name=\"property.detail\">\n" - + "<!-- -->\n" - + "</a>\n" - + "<h3>Property Detail</h3>\n" + "<h3>Property Detail</h3>\n" + "<a name=\"betaProperty\">\n" + "<!-- -->\n" + "</a>\n" @@ -176,27 +173,27 @@ + "<pre>public java.lang.Object betaProperty</pre>\n" + "</li>\n" + "</ul>\n" + + "<a name=\"gammaProperty\">\n" + + "<!-- -->\n" + + "</a>\n" + + "<ul class=\"blockList\">\n" + + "<li class=\"blockList\">\n" + + "<h4>gamma</h4>\n" + + "<pre>public final java.util.List<java.lang.String> gammaProperty</pre>\n" + + "</li>\n" + + "</ul>\n" + "<a name=\"deltaProperty\">\n" + "<!-- -->\n" + "</a>\n" - + "<ul class=\"blockList\">\n" + + "<ul class=\"blockListLast\">\n" + "<li class=\"blockList\">\n" + "<h4>delta</h4>\n" + "<pre>public final java.util.List<" + "java.util.Set<? super java.lang.Object>> deltaProperty</pre>\n" + "</li>\n" + "</ul>\n" - + "<a name=\"gammaProperty\">\n" - + "<!-- -->\n" - + "</a>\n" - + "<ul class=\"blockListLast\">\n" - + "<li class=\"blockList\">\n" - + "<h4>gamma</h4>\n" - + "<pre>public final java.util.List<" - + "java.lang.String> gammaProperty</pre>\n" + "</li>\n" - + "</ul>\n" - + "</li>"); + + "</ul>"); } /*
--- a/langtools/test/jdk/javadoc/doclet/testOrdering/TestOrdering.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/test/jdk/javadoc/doclet/testOrdering/TestOrdering.java Tue Nov 22 10:48:24 2016 -0800 @@ -23,9 +23,8 @@ /* * @test - * @bug 8039410 8042601 8042829 8049393 8050031 8155061 8155995 + * @bug 8039410 8042601 8042829 8049393 8050031 8155061 8155995 8167967 * @summary test to determine if members are ordered correctly - * @author ksrini * @library ../lib/ * @modules jdk.javadoc/jdk.javadoc.internal.tool * @build JavadocTester @@ -51,492 +50,640 @@ @Test void testUnnamedPackagesForClassUse() { - javadoc("-d", "out", - "-sourcepath", testSrc, - "-use", - testSrc("C.java"), testSrc("UsedInC.java")); - checkExit(Exit.OK); - checkExecutableMemberOrdering("class-use/UsedInC.html"); + new UnnamedPackageForClassUseTest(this).run(); } @Test void testNamedPackagesForClassUse() { - javadoc("-d", "out-1", - "-sourcepath", testSrc, - "-use", - "pkg1"); - checkExit(Exit.OK); - checkClassUseOrdering("pkg1/class-use/UsedClass.html"); - checkOrder("pkg1/class-use/UsedClass.html", expectedClassUseMethodOrdering); - checkOrder("pkg1/class-use/UsedClass.html", expectedClassUseWithTypeParams); - checkOrder("pkg1/class-use/UsedClass.html", expectedInnerClassContructors); - checkOrder("pkg1/ImplementsOrdering.html", expectedImplementsOrdering); - checkOrder("pkg1/OverrideOrdering.html", expectedOverrideOrdering); - checkOrder("allclasses-noframe.html", expectedAllClasses); - checkOrder("allclasses-frame.html", expectedAllClasses); + new NamedPackagesForClassUseTest(this).run(); } - enum ListOrder { NONE, REVERSE, SHUFFLE }; - /* - * By default we do not shuffle the input list, in order to keep the list deterministic, - * and the test predictable. However, we can turn on the stress mode, by setting the following - * property if required. - */ - static final ListOrder STRESS_MODE = Boolean.getBoolean("TestOrder.STRESS") - ? ListOrder.SHUFFLE - : ListOrder.REVERSE; - - /* - * Controls the number of sibling packages, pkg0, pkg1, pkg2, ..... - */ - static final int MAX_PACKAGES = 4; - - /* - * Controls the number of children packages, pkg0, pkg0.pkg, pkg0.pkg.pkg, ..... - * Note: having too long a depth (> 256 chars on Windows), will likely lead to - * cause problems with automated build and test systems. - */ - static final int MAX_SUBPACKAGES_DEPTH = 4; @Test void testIndexOrdering() throws IOException { - final String clsname = "Add"; - List<String> cmdArgs = new ArrayList(); - cmdArgs.add("-d"); - cmdArgs.add("out-2"); - cmdArgs.add("-sourcepath"); - cmdArgs.add("src"); - cmdArgs.add("-package"); - System.out.println("STRESS_MODE: " + STRESS_MODE); - emitFile(null, clsname, STRESS_MODE); - for (int width = 0 ; width < MAX_PACKAGES ; width++) { - String wpkgname = "add" + width; - String dpkgname = wpkgname; - emitFile(wpkgname, clsname, ListOrder.NONE); // list as-is - cmdArgs.add(wpkgname); - for (int depth = 1 ; depth < MAX_SUBPACKAGES_DEPTH ; depth++) { - dpkgname = dpkgname + ".add"; - emitFile(dpkgname, clsname, STRESS_MODE); - cmdArgs.add(dpkgname); - } - } - File srcDir = new File(new File("."), "src"); - cmdArgs.add(new File(srcDir, clsname + ".java").getPath()); - javadoc(cmdArgs.toArray(new String[cmdArgs.size()])); - checkExit(Exit.OK); - checkOrder("index-all.html", composeTestVectors()); - checkOrder("add0/add/package-tree.html", expectedPackageTreeOrdering); - checkOrder("overview-tree.html", expectedOverviewOrdering); - checkOrder("overview-frame.html", expectedOverviewFrameOrdering); + new IndexOrderingTest(this).run(); } @Test void testIndexTypeClustering() { - javadoc("-d", "out-3", - "-sourcepath", testSrc("src-2"), - "-use", - "a", - "b", - "e", - "something"); - checkOrder("index-all.html", typeTestVectors); - checkExit(Exit.OK); + new IndexTypeClusteringTest(this).run(); } @Test - void testMethodDetailOrdering() { - javadoc("-d", "out-4", - "-sourcepath", testSrc(new File(".").getPath()), - "order" - ); - checkOrder("order/MethodOrder.html", methodSourceOrderVectors); - checkExit(Exit.OK); + void testTypeElementMemberOrdering() { + new TypeElementMemberOrderingTest(this).run(); } - String[] methodSourceOrderVectors = { - "<pre>public void d()</pre>\n" + - "<div class=\"block\">Method d.\n" + - " Second line.</div>", - "<pre>public void b()</pre>\n" + - "<div class=\"block\">Method b.\n" + - " Second line.</div>", - "<pre>public void c()</pre>\n" + - "<div class=\"block\">Method c.\n" + - " Second line.</div>", - "<pre>public void a()</pre>\n" + - "<div class=\"block\">Method a.\n" + - " Second line.</div>" - }; + static class UnnamedPackageForClassUseTest { + final JavadocTester tester; - String[] typeTestVectors = { - "something</a> - package something</dt>", - "something</span></a> - Class in", - "something</span></a> - Enum in", - "something</span></a> - Interface in", - "something</span></a> - Annotation Type in", - "something</a></span> - Variable in class", - "something()</a></span> - Constructor", - "something()</a></span> - Method in class a.<a href=\"a/A.html\"", - "something()</a></span> - Method in class a.<a href=\"a/something.html\"", - "something()</a></span> - Method in class something.<a href=\"something/J.html\"" - }; - - String[] composeTestVectors() { - List<String> testList = new ArrayList<>(); - - testList.addAll(Arrays.asList(expectedPackageOrdering)); - for (String x : expectedEnumOrdering) { - testList.add(x.replace("REPLACE_ME", "<Unnamed>")); - for (int i = 0; i < MAX_PACKAGES; i++) { - String wpkg = "add" + i; - testList.add(wpkg + "/" + x.replace("REPLACE_ME", - wpkg)); - String dpkg = wpkg; - for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) { - dpkg = dpkg + "/" + "add"; - testList.add(dpkg + "/" + x.replace("REPLACE_ME", - pathToPackage(dpkg))); - } - } + UnnamedPackageForClassUseTest(JavadocTester tester) { + this.tester = tester; } - testList.addAll(Arrays.asList(expectedFieldOrdering)); - - for (String x : expectedMethodOrdering) { - testList.add(x); - for (int i = 0; i < MAX_PACKAGES; i++) { - String wpkg = "add" + i; - testList.add(wpkg + "/" + x); - String dpkg = wpkg; - for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) { - dpkg = dpkg + "/" + "add"; - testList.add(dpkg + "/" + x); - } - } + void run() { + tester.javadoc("-d", "out", + "-sourcepath", testSrc, + "-use", + tester.testSrc("C.java"), tester.testSrc("UsedInC.java")); + tester.checkExit(Exit.OK); + checkExecutableMemberOrdering("class-use/UsedInC.html"); } - return testList.toArray(new String[testList.size()]); - } + void checkExecutableMemberOrdering(String usePage) { + String contents = tester.readFile(usePage); + // check constructors + tester.checking("constructors"); + int idx1 = contents.indexOf("C.html#C-UsedInC"); + int idx2 = contents.indexOf("C.html#C-UsedInC-int"); + int idx3 = contents.indexOf("C.html#C-UsedInC-java.lang.String"); + if (idx1 == -1 || idx2 == -1 || idx3 == -1) { + tester.failed("ctor strings not found"); + } else if (idx1 > idx2 || idx2 > idx3 || idx1 > idx3) { + tester.failed("ctor strings are out of order"); + } else { + tester.passed("ctor strings are in order"); + } - void checkExecutableMemberOrdering(String usePage) { - String contents = readFile(usePage); - // check constructors - checking("constructors"); - int idx1 = contents.indexOf("C.html#C-UsedInC"); - int idx2 = contents.indexOf("C.html#C-UsedInC-int"); - int idx3 = contents.indexOf("C.html#C-UsedInC-java.lang.String"); - if (idx1 == -1 || idx2 == -1 || idx3 == -1) { - failed("ctor strings not found"); - } else if (idx1 > idx2 || idx2 > idx3 || idx1 > idx3) { - failed("ctor strings are out of order"); - } else - passed("ctor strings are in order"); - - // check methods - checking("methods"); - idx1 = contents.indexOf("C.html#ymethod-int"); - idx2 = contents.indexOf("C.html#ymethod-java.lang.String"); - if (idx1 == -1 || idx2 == -1) { - failed("#ymethod strings not found"); - } else if (idx1 > idx2) { - failed("#ymethod strings are out of order"); - } else - passed("Executable Member Ordering: OK"); - } - - void checkClassUseOrdering(String usePage) { - checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zfield"); - checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#fieldInC#ITERATION#"); - checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zmethod-pkg1.UsedClass"); - checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#methodInC#ITERATION#"); - } - - void checkClassUseOrdering(String usePage, String searchString) { - String contents = readFile(usePage); - int lastidx = 0; - System.out.println("testing for " + searchString); - for (int i = 1; i < 5; i++) { - String s = searchString.replaceAll("#ITERATION#", Integer.toString(i)); - checking(s); - int idx = contents.indexOf(s); - if (idx < lastidx) { - failed(s + ", member ordering error, last:" + lastidx + ", got:" + idx); + // check methods + tester.checking("methods"); + idx1 = contents.indexOf("C.html#ymethod-int"); + idx2 = contents.indexOf("C.html#ymethod-java.lang.String"); + if (idx1 == -1 || idx2 == -1) { + tester.failed("#ymethod strings not found"); + } else if (idx1 > idx2) { + tester.failed("#ymethod strings are out of order"); } else { - passed("\tlast: " + lastidx + " got:" + idx); + tester.passed("Executable Member Ordering: OK"); } - lastidx = idx; } } - static String[] contents = { - "public add ADDADD;", - "public add AddAdd;", - "public add addadd;", - "public enum add {add, ADD, addd, ADDD};", - "public enum ADD {ADD, add, addd, ADDD};", - "public void add(){}", - "public void add(double d){}", - "public void add(int i, float f){}", - "public void add(float f, int i){}", - "public void add(double d, byte b){}", - "public Double add(Double d) {return (double) 22/7;}", - "public double add(double d1, double d2) {return d1 + d2;}", - "public double add(double d1, Double d2) {return d1 + d2;}", - "public Float add(float f) {return (float) 22/7;}", - "public void add(int i){}", - "public int add(Integer i) {return 0;}" - }; + static class NamedPackagesForClassUseTest { + final JavadocTester tester; - void emitFile(String pkgname, String clsname, ListOrder order) throws IOException { - File srcDir = new File("src"); - File outDir = pkgname == null - ? srcDir - : new File(srcDir, pkgname.replace(".", File.separator)); - File outFile = new File(outDir, clsname + ".java"); - outDir.mkdirs(); - List<String> scratch = new ArrayList<>(Arrays.asList(contents)); - switch (order) { - case SHUFFLE: - Collections.shuffle(scratch); - break; - case REVERSE: - Collections.reverse(scratch); - break; - default: - // leave list as-is + NamedPackagesForClassUseTest(JavadocTester tester) { + this.tester = tester; } - // insert the header - scratch.add(0, "public class " + clsname + " {"); - if (pkgname != null) { - scratch.add(0, "package " + pkgname + ";"); + + public void run() { + tester.javadoc("-d", "out-1", + "-sourcepath", tester.testSrc, + "-use", + "pkg1"); + tester.checkExit(Exit.OK); + + checkClassUseOrdering("pkg1/class-use/UsedClass.html"); + + tester.checkOrder("pkg1/class-use/UsedClass.html", + "../../pkg1/MethodOrder.html#m--", + "../../pkg1/MethodOrder.html#m-byte:A-", + "../../pkg1/MethodOrder.html#m-double-", + "../../pkg1/MethodOrder.html#m-double-double-", + "../../pkg1/MethodOrder.html#m-double-java.lang.Double-", + "../../pkg1/MethodOrder.html#m-int-", + "../../pkg1/MethodOrder.html#m-int-int-", + "../../pkg1/MethodOrder.html#m-int-java.lang.Integer-", + "../../pkg1/MethodOrder.html#m-long-", + "../../pkg1/MethodOrder.html#m-long-long-", + "../../pkg1/MethodOrder.html#m-long-java.lang.Long-", + "../../pkg1/MethodOrder.html#m-long-java.lang.Long...-", + "../../pkg1/MethodOrder.html#m-java.lang.Double-", + "../../pkg1/MethodOrder.html#m-java.lang.Double-double-", + "../../pkg1/MethodOrder.html#m-java.lang.Double-java.lang.Double-", + "../../pkg1/MethodOrder.html#m-java.lang.Integer-", + "../../pkg1/MethodOrder.html#m-java.lang.Integer-int-", + "../../pkg1/MethodOrder.html#m-java.lang.Integer-java.lang.Integer-", + "../../pkg1/MethodOrder.html#m-java.lang.Object:A-", + "../../pkg1/MethodOrder.html#m-java.util.ArrayList-", + "../../pkg1/MethodOrder.html#m-java.util.Collection-", + "../../pkg1/MethodOrder.html#m-java.util.List-"); + + tester.checkOrder("pkg1/class-use/UsedClass.html", + "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-", + "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-pkg1.UsedClass-", + "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-pkg1.UsedClass:A-", + "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-java.lang.String-"); + + tester.checkOrder("pkg1/class-use/UsedClass.html", + "../../pkg1/A.html#A-pkg1.UsedClass-", + "../../pkg1/B.A.html#A-pkg1.UsedClass-", + "../../pkg1/B.html#B-pkg1.UsedClass-", + "../../pkg1/A.C.html#C-pkg1.UsedClass-java.lang.Object:A-", + "../../pkg1/A.C.html#C-pkg1.UsedClass-java.util.Collection-", + "../../pkg1/A.C.html#C-pkg1.UsedClass-java.util.List-"); + + tester.checkOrder("pkg1/ImplementsOrdering.html", + "<dd><code>close</code> in interface <code>java.lang.AutoCloseable</code></dd>", + "<dd><code>close</code> in interface <code>java.nio.channels.Channel</code></dd>", + "<dd><code>close</code> in interface <code>java.io.Closeable</code></dd>"); + + tester.checkOrder("pkg1/OverrideOrdering.html", + "<dd><code>iterator</code> in interface <code>java.util.Collection<", + "<dd><code>iterator</code> in interface <code>java.lang.Iterable<"); + + tester.checkOrder("allclasses-noframe.html", + "pkg1/A.html\" title=\"class in pkg1", + "pkg1/A.C.html\" title=\"class in pkg1", + "pkg1/B.html\" title=\"class in pkg1", + "pkg1/B.A.html\" title=\"class in pkg1", + "pkg1/C1.html\" title=\"class in pkg1", + "pkg1/C2.html\" title=\"class in pkg1", + "pkg1/C3.html\" title=\"class in pkg1", + "pkg1/C4.html\" title=\"class in pkg1", + "pkg1/ImplementsOrdering.html\" title=\"interface in pkg1", + "pkg1/MethodOrder.html\" title=\"class in pkg1", + "pkg1/OverrideOrdering.html\" title=\"class in pkg1", + "pkg1/UsedClass.html\" title=\"class in pkg1"); + + tester.checkOrder("allclasses-frame.html", + "pkg1/A.html\" title=\"class in pkg1", + "pkg1/A.C.html\" title=\"class in pkg1", + "pkg1/B.html\" title=\"class in pkg1", + "pkg1/B.A.html\" title=\"class in pkg1", + "pkg1/C1.html\" title=\"class in pkg1", + "pkg1/C2.html\" title=\"class in pkg1", + "pkg1/C3.html\" title=\"class in pkg1", + "pkg1/C4.html\" title=\"class in pkg1", + "pkg1/ImplementsOrdering.html\" title=\"interface in pkg1", + "pkg1/MethodOrder.html\" title=\"class in pkg1", + "pkg1/OverrideOrdering.html\" title=\"class in pkg1", + "pkg1/UsedClass.html\" title=\"class in pkg1"); } - // append the footer - scratch.add("}"); - Files.write(outFile.toPath(), scratch, CREATE, TRUNCATE_EXISTING); + + void checkClassUseOrdering(String usePage) { + checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zfield"); + checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#fieldInC#ITERATION#"); + checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zmethod-pkg1.UsedClass"); + checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#methodInC#ITERATION#"); + } + + void checkClassUseOrdering(String usePage, String searchString) { + String contents = tester.readFile(usePage); + int lastidx = 0; + System.out.println("testing for " + searchString); + for (int i = 1; i < 5; i++) { + String s = searchString.replaceAll("#ITERATION#", Integer.toString(i)); + tester.checking(s); + int idx = contents.indexOf(s); + if (idx < lastidx) { + tester.failed(s + ", member ordering error, last:" + lastidx + ", got:" + idx); + } else { + tester.passed("\tlast: " + lastidx + " got:" + idx); + } + lastidx = idx; + } + } } - String pathToPackage(String in) { - return in.replace("/", "."); + static class IndexOrderingTest { + private final JavadocTester tester; + + IndexOrderingTest(JavadocTester tester) { + this.tester = tester; + } + + enum ListOrder { + NONE, REVERSE, SHUFFLE + }; + + /* + * By default we do not shuffle the input list, in order to keep the list deterministic, + * and the test predictable. However, we can turn on the stress mode, by setting the following + * property if required. + */ + static final ListOrder STRESS_MODE = Boolean.getBoolean("TestOrder.STRESS") + ? ListOrder.SHUFFLE + : ListOrder.REVERSE; + + /* + * Controls the number of children packages, pkg0, pkg0.pkg, pkg0.pkg.pkg, ..... + * Note: having too long a depth (> 256 chars on Windows), will likely lead to + * cause problems with automated build and test systems. + */ + static final int MAX_SUBPACKAGES_DEPTH = 4; + + /* + * Controls the number of sibling packages, pkg0, pkg1, pkg2, ..... + */ + static final int MAX_PACKAGES = 4; + + static String[] contents = { + "public add ADDADD;", + "public add AddAdd;", + "public add addadd;", + "public enum add {add, ADD, addd, ADDD};", + "public enum ADD {ADD, add, addd, ADDD};", + "public void add(){}", + "public void add(double d){}", + "public void add(int i, float f){}", + "public void add(float f, int i){}", + "public void add(double d, byte b){}", + "public Double add(Double d) {return (double) 22/7;}", + "public double add(double d1, double d2) {return d1 + d2;}", + "public double add(double d1, Double d2) {return d1 + d2;}", + "public Float add(float f) {return (float) 22/7;}", + "public void add(int i){}", + "public int add(Integer i) {return 0;}" + }; + + static String expectedEnumOrdering[] = { + "Add.add.html\" title=\"enum in REPLACE_ME\"", + "Add.ADD.html\" title=\"enum in REPLACE_ME\"" + }; + + static String expectedFieldOrdering[] = { + "Add.html#addadd\"", + "add0/add/add/add/Add.html#addadd\"", + "add0/add/add/Add.html#addadd\"", + "add0/add/Add.html#addadd\"", + "add0/Add.html#addadd\"", + "add1/add/add/add/Add.html#addadd\"", + "add1/add/add/Add.html#addadd\"", + "add1/add/Add.html#addadd\"", + "add1/Add.html#addadd\"", + "add2/add/add/add/Add.html#addadd\"", + "add2/add/add/Add.html#addadd\"", + "add2/add/Add.html#addadd\"", + "add2/Add.html#addadd\"", + "add3/add/add/add/Add.html#addadd\"", + "add3/add/add/Add.html#addadd\"", + "add3/add/Add.html#addadd\"", + "add3/Add.html#addadd\"", + "Add.html#AddAdd\"", + "add0/add/add/add/Add.html#AddAdd\"", + "add0/add/add/Add.html#AddAdd\"", + "add0/add/Add.html#AddAdd\"", + "add0/Add.html#AddAdd\"", + "add1/add/add/add/Add.html#AddAdd\"", + "add1/add/add/Add.html#AddAdd\"", + "add1/add/Add.html#AddAdd\"", + "add1/Add.html#AddAdd\"", + "add2/add/add/add/Add.html#AddAdd\"", + "add2/add/add/Add.html#AddAdd\"", + "add2/add/Add.html#AddAdd\"", + "add2/Add.html#AddAdd\"", + "add3/add/add/add/Add.html#AddAdd\"", + "add3/add/add/Add.html#AddAdd\"", + "add3/add/Add.html#AddAdd\"", + "add3/Add.html#AddAdd\"", + "Add.html#ADDADD\"", + "add0/add/add/add/Add.html#ADDADD\"", + "add0/add/add/Add.html#ADDADD\"", + "add0/add/Add.html#ADDADD\"", + "add0/Add.html#ADDADD\"", + "add1/add/add/add/Add.html#ADDADD\"", + "add1/add/add/Add.html#ADDADD\"", + "add1/add/Add.html#ADDADD\"", + "add1/Add.html#ADDADD\"", + "add2/add/add/add/Add.html#ADDADD\"", + "add2/add/add/Add.html#ADDADD\"", + "add2/add/Add.html#ADDADD\"", + "add2/Add.html#ADDADD\"", + "add3/add/add/add/Add.html#ADDADD\"", + "add3/add/add/Add.html#ADDADD\"", + "add3/add/Add.html#ADDADD\"", + "add3/Add.html#ADDADD\"" + }; + + static String expectedMethodOrdering[] = { + "Add.html#add--", + "Add.html#add-double-", + "Add.html#add-double-byte-", + "Add.html#add-double-double-", + "Add.html#add-double-java.lang.Double-", + "Add.html#add-float-", + "Add.html#add-float-int-", + "Add.html#add-int-", + "Add.html#add-int-float-", + "Add.html#add-java.lang.Double-", + "Add.html#add-java.lang.Integer-" + }; + + static String expectedPackageOrdering[] = { + "\"add0/package-summary.html\">add0</a> - package add0", + "\"add0/add/package-summary.html\">add0.add</a> - package add0.add", + "\"add0/add/add/package-summary.html\">add0.add.add</a> - package add0.add.add", + "\"add0/add/add/add/package-summary.html\">add0.add.add.add</a> - package add0.add.add.add", + "\"add1/package-summary.html\">add1</a> - package add1", + "\"add1/add/package-summary.html\">add1.add</a> - package add1.add", + "\"add1/add/add/package-summary.html\">add1.add.add</a> - package add1.add.add", + "\"add1/add/add/add/package-summary.html\">add1.add.add.add</a> - package add1.add.add.add", + "\"add2/package-summary.html\">add2</a> - package add2", + "\"add2/add/package-summary.html\">add2.add</a> - package add2.add", + "\"add2/add/add/package-summary.html\">add2.add.add</a> - package add2.add.add", + "\"add2/add/add/add/package-summary.html\">add2.add.add.add</a> - package add2.add.add.add", + "\"add3/package-summary.html\">add3</a> - package add3", + "\"add3/add/package-summary.html\">add3.add</a> - package add3.add", + "\"add3/add/add/package-summary.html\">add3.add.add</a> - package add3.add.add", + "\"add3/add/add/add/package-summary.html\">add3.add.add.add</a> - package add3.add.add.add" + }; + + void run() throws IOException { + final String clsname = "Add"; + List<String> cmdArgs = new ArrayList(); + cmdArgs.add("-d"); + cmdArgs.add("out-2"); + cmdArgs.add("-sourcepath"); + cmdArgs.add("src"); + cmdArgs.add("-package"); + System.out.println("STRESS_MODE: " + STRESS_MODE); + emitFile(null, clsname, STRESS_MODE); + for (int width = 0; width < MAX_PACKAGES; width++) { + String wpkgname = "add" + width; + String dpkgname = wpkgname; + emitFile(wpkgname, clsname, ListOrder.NONE); // list as-is + cmdArgs.add(wpkgname); + for (int depth = 1; depth < MAX_SUBPACKAGES_DEPTH; depth++) { + dpkgname = dpkgname + ".add"; + emitFile(dpkgname, clsname, STRESS_MODE); + cmdArgs.add(dpkgname); + } + } + File srcDir = new File(new File("."), "src"); + cmdArgs.add(new File(srcDir, clsname + ".java").getPath()); + tester.javadoc(cmdArgs.toArray(new String[cmdArgs.size()])); + tester.checkExit(Exit.OK); + tester.checkOrder("index-all.html", composeTestVectors()); + tester.checkOrder("add0/add/package-tree.html", + "<a href=\"../../add0/add/Add.add.html\" title=\"enum in add0.add\">", + "<a href=\"../../add0/add/Add.ADD.html\" title=\"enum in add0.add\">"); + tester.checkOrder("overview-tree.html", + "<a href=\"Add.add.html\" title=\"enum in <Unnamed>\">", + "<a href=\"add0/Add.add.html\" title=\"enum in add0\">", + "<a href=\"add0/add/Add.add.html\" title=\"enum in add0.add\">", + "<a href=\"add0/add/add/Add.add.html\" title=\"enum in add0.add.add\">", + "<a href=\"add0/add/add/add/Add.add.html\" title=\"enum in add0.add.add.add\">", + "<a href=\"add1/Add.add.html\" title=\"enum in add1\">", + "<a href=\"add1/add/Add.add.html\" title=\"enum in add1.add\">", + "<a href=\"add1/add/add/Add.add.html\" title=\"enum in add1.add.add\">", + "<a href=\"add1/add/add/add/Add.add.html\" title=\"enum in add1.add.add.add\">", + "<a href=\"add2/Add.add.html\" title=\"enum in add2\">", + "<a href=\"add2/add/Add.add.html\" title=\"enum in add2.add\">", + "<a href=\"add2/add/add/Add.add.html\" title=\"enum in add2.add.add\">", + "<a href=\"add2/add/add/add/Add.add.html\" title=\"enum in add2.add.add.add\">", + "<a href=\"add3/Add.add.html\" title=\"enum in add3\">", + "<a href=\"add3/add/Add.add.html\" title=\"enum in add3.add\">", + "<a href=\"add3/add/add/Add.add.html\" title=\"enum in add3.add.add\">", + "<a href=\"add3/add/add/add/Add.add.html\" title=\"enum in add3.add.add.add\">", + "<a href=\"Add.ADD.html\" title=\"enum in <Unnamed>\">", + "<a href=\"add0/Add.ADD.html\" title=\"enum in add0\">", + "<a href=\"add0/add/Add.ADD.html\" title=\"enum in add0.add\">", + "<a href=\"add0/add/add/Add.ADD.html\" title=\"enum in add0.add.add\">", + "<a href=\"add0/add/add/add/Add.ADD.html\" title=\"enum in add0.add.add.add\">", + "<a href=\"add1/Add.ADD.html\" title=\"enum in add1\">", + "<a href=\"add1/add/Add.ADD.html\" title=\"enum in add1.add\">", + "<a href=\"add1/add/add/Add.ADD.html\" title=\"enum in add1.add.add\">", + "<a href=\"add1/add/add/add/Add.ADD.html\" title=\"enum in add1.add.add.add\">", + "<a href=\"add2/Add.ADD.html\" title=\"enum in add2\">", + "<a href=\"add2/add/Add.ADD.html\" title=\"enum in add2.add\">", + "<a href=\"add2/add/add/Add.ADD.html\" title=\"enum in add2.add.add\">", + "<a href=\"add2/add/add/add/Add.ADD.html\" title=\"enum in add2.add.add.add\">", + "<a href=\"add3/Add.ADD.html\" title=\"enum in add3\">", + "<a href=\"add3/add/Add.ADD.html\" title=\"enum in add3.add\">", + "<a href=\"add3/add/add/Add.ADD.html\" title=\"enum in add3.add.add\">", + "<a href=\"add3/add/add/add/Add.ADD.html\" title=\"enum in add3.add.add.add\">"); + + tester.checkOrder("overview-frame.html", + "<a href=\"package-frame.html\" target=\"packageFrame\"><unnamed package></a>", + "<a href=\"add0/package-frame.html\" target=\"packageFrame\">add0</a>", + "<a href=\"add0/add/package-frame.html\" target=\"packageFrame\">add0.add</a>", + "<a href=\"add0/add/add/package-frame.html\" target=\"packageFrame\">add0.add.add</a>", + "<a href=\"add0/add/add/add/package-frame.html\" target=\"packageFrame\">add0.add.add.add</a>", + "<a href=\"add1/package-frame.html\" target=\"packageFrame\">add1</a>", + "<a href=\"add1/add/package-frame.html\" target=\"packageFrame\">add1.add</a>", + "<a href=\"add1/add/add/package-frame.html\" target=\"packageFrame\">add1.add.add</a>", + "<a href=\"add1/add/add/add/package-frame.html\" target=\"packageFrame\">add1.add.add.add</a>", + "<a href=\"add2/package-frame.html\" target=\"packageFrame\">add2</a>", + "<a href=\"add2/add/package-frame.html\" target=\"packageFrame\">add2.add</a>", + "<a href=\"add2/add/add/package-frame.html\" target=\"packageFrame\">add2.add.add</a>", + "<a href=\"add2/add/add/add/package-frame.html\" target=\"packageFrame\">add2.add.add.add</a>", + "<a href=\"add3/package-frame.html\" target=\"packageFrame\">add3</a>", + "<a href=\"add3/add/package-frame.html\" target=\"packageFrame\">add3.add</a>", + "<a href=\"add3/add/add/package-frame.html\" target=\"packageFrame\">add3.add.add</a>", + "<a href=\"add3/add/add/add/package-frame.html\" target=\"packageFrame\">add3.add.add.add</a></li>"); + } + + void emitFile(String pkgname, String clsname, ListOrder order) throws IOException { + File srcDir = new File("src"); + File outDir = pkgname == null + ? srcDir + : new File(srcDir, pkgname.replace(".", File.separator)); + File outFile = new File(outDir, clsname + ".java"); + outDir.mkdirs(); + List<String> scratch = new ArrayList<>(Arrays.asList(contents)); + switch (order) { + case SHUFFLE: + Collections.shuffle(scratch); + break; + case REVERSE: + Collections.reverse(scratch); + break; + default: + // leave list as-is + } + // insert the header + scratch.add(0, "public class " + clsname + " {"); + if (pkgname != null) { + scratch.add(0, "package " + pkgname + ";"); + } + // append the footer + scratch.add("}"); + Files.write(outFile.toPath(), scratch, CREATE, TRUNCATE_EXISTING); + } + + String[] composeTestVectors() { + List<String> testList = new ArrayList<>(); + + testList.addAll(Arrays.asList(expectedPackageOrdering)); + for (String x : expectedEnumOrdering) { + testList.add(x.replace("REPLACE_ME", "<Unnamed>")); + for (int i = 0; i < MAX_PACKAGES; i++) { + String wpkg = "add" + i; + testList.add(wpkg + "/" + x.replace("REPLACE_ME", + wpkg)); + String dpkg = wpkg; + for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) { + dpkg = dpkg + "/" + "add"; + testList.add(dpkg + "/" + x.replace("REPLACE_ME", pathToPackage(dpkg))); + } + } + } + + testList.addAll(Arrays.asList(expectedFieldOrdering)); + + for (String x : expectedMethodOrdering) { + testList.add(x); + for (int i = 0; i < MAX_PACKAGES; i++) { + String wpkg = "add" + i; + testList.add(wpkg + "/" + x); + String dpkg = wpkg; + for (int j = 1; j < MAX_SUBPACKAGES_DEPTH; j++) { + dpkg = dpkg + "/" + "add"; + testList.add(dpkg + "/" + x); + } + } + } + + return testList.toArray(new String[testList.size()]); + } + + String pathToPackage(String in) { + return in.replace("/", "."); + } } - final String expectedAllClasses[] = { - "pkg1/A.html\" title=\"class in pkg1", - "pkg1/A.C.html\" title=\"class in pkg1", - "pkg1/B.html\" title=\"class in pkg1", - "pkg1/B.A.html\" title=\"class in pkg1", - "pkg1/C1.html\" title=\"class in pkg1", - "pkg1/C2.html\" title=\"class in pkg1", - "pkg1/C3.html\" title=\"class in pkg1", - "pkg1/C4.html\" title=\"class in pkg1", - "pkg1/ImplementsOrdering.html\" title=\"interface in pkg1", - "pkg1/MethodOrder.html\" title=\"class in pkg1", - "pkg1/OverrideOrdering.html\" title=\"class in pkg1", - "pkg1/UsedClass.html\" title=\"class in pkg1" + static class IndexTypeClusteringTest { - }; + private final JavadocTester tester; - final String expectedInnerClassContructors[] = { - "../../pkg1/A.html#A-pkg1.UsedClass-", - "../../pkg1/B.A.html#A-pkg1.UsedClass-", - "../../pkg1/B.html#B-pkg1.UsedClass-", - "../../pkg1/A.C.html#C-pkg1.UsedClass-java.lang.Object:A-", - "../../pkg1/A.C.html#C-pkg1.UsedClass-java.util.Collection-", - "../../pkg1/A.C.html#C-pkg1.UsedClass-java.util.List-" - }; + IndexTypeClusteringTest(JavadocTester tester) { + this.tester = tester; + } - final String expectedClassUseMethodOrdering[] = { - "../../pkg1/MethodOrder.html#m--", - "../../pkg1/MethodOrder.html#m-byte:A-", - "../../pkg1/MethodOrder.html#m-double-", - "../../pkg1/MethodOrder.html#m-double-double-", - "../../pkg1/MethodOrder.html#m-double-java.lang.Double-", - "../../pkg1/MethodOrder.html#m-int-", - "../../pkg1/MethodOrder.html#m-int-int-", - "../../pkg1/MethodOrder.html#m-int-java.lang.Integer-", - "../../pkg1/MethodOrder.html#m-long-", - "../../pkg1/MethodOrder.html#m-long-long-", - "../../pkg1/MethodOrder.html#m-long-java.lang.Long-", - "../../pkg1/MethodOrder.html#m-long-java.lang.Long...-", - "../../pkg1/MethodOrder.html#m-java.lang.Double-", - "../../pkg1/MethodOrder.html#m-java.lang.Double-double-", - "../../pkg1/MethodOrder.html#m-java.lang.Double-java.lang.Double-", - "../../pkg1/MethodOrder.html#m-java.lang.Integer-", - "../../pkg1/MethodOrder.html#m-java.lang.Integer-int-", - "../../pkg1/MethodOrder.html#m-java.lang.Integer-java.lang.Integer-", - "../../pkg1/MethodOrder.html#m-java.lang.Object:A-", - "../../pkg1/MethodOrder.html#m-java.util.ArrayList-", - "../../pkg1/MethodOrder.html#m-java.util.Collection-", - "../../pkg1/MethodOrder.html#m-java.util.List-" - }; + void run() { + tester.javadoc("-d", "out-3", + "-sourcepath", tester.testSrc("src-2"), + "-use", + "a", + "b", + "e", + "something"); - final String expectedClassUseWithTypeParams[] = { - "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-", - "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-pkg1.UsedClass-", - "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-pkg1.UsedClass:A-", - "../../pkg1/MethodOrder.html#tpm-pkg1.UsedClass-java.lang.String-" - }; + tester.checkExit(Exit.OK); - final String expectedPackageOrdering[] = { - "\"add0/package-summary.html\">add0</a> - package add0", - "\"add0/add/package-summary.html\">add0.add</a> - package add0.add", - "\"add0/add/add/package-summary.html\">add0.add.add</a> - package add0.add.add", - "\"add0/add/add/add/package-summary.html\">add0.add.add.add</a> - package add0.add.add.add", - "\"add1/package-summary.html\">add1</a> - package add1", - "\"add1/add/package-summary.html\">add1.add</a> - package add1.add", - "\"add1/add/add/package-summary.html\">add1.add.add</a> - package add1.add.add", - "\"add1/add/add/add/package-summary.html\">add1.add.add.add</a> - package add1.add.add.add", - "\"add2/package-summary.html\">add2</a> - package add2", - "\"add2/add/package-summary.html\">add2.add</a> - package add2.add", - "\"add2/add/add/package-summary.html\">add2.add.add</a> - package add2.add.add", - "\"add2/add/add/add/package-summary.html\">add2.add.add.add</a> - package add2.add.add.add", - "\"add3/package-summary.html\">add3</a> - package add3", - "\"add3/add/package-summary.html\">add3.add</a> - package add3.add", - "\"add3/add/add/package-summary.html\">add3.add.add</a> - package add3.add.add", - "\"add3/add/add/add/package-summary.html\">add3.add.add.add</a> - package add3.add.add.add" - }; + tester.checkOrder("index-all.html", + "something</a> - package something</dt>", + "something</span></a> - Class in", + "something</span></a> - Enum in", + "something</span></a> - Interface in", + "something</span></a> - Annotation Type in", + "something</a></span> - Variable in class", + "something()</a></span> - Constructor", + "something()</a></span> - Method in class a.<a href=\"a/A.html\"", + "something()</a></span> - Method in class a.<a href=\"a/something.html\"", + "something()</a></span> - Method in class something.<a href=\"something/J.html\""); + } + } - final String expectedMethodOrdering[] = { - "Add.html#add--", - "Add.html#add-double-", - "Add.html#add-double-byte-", - "Add.html#add-double-double-", - "Add.html#add-double-java.lang.Double-", - "Add.html#add-float-", - "Add.html#add-float-int-", - "Add.html#add-int-", - "Add.html#add-int-float-", - "Add.html#add-java.lang.Double-", - "Add.html#add-java.lang.Integer-" - }; + static class TypeElementMemberOrderingTest { - final String expectedEnumOrdering[] = { - "Add.add.html\" title=\"enum in REPLACE_ME\"", - "Add.ADD.html\" title=\"enum in REPLACE_ME\"" - }; + final JavadocTester tester; - final String expectedFieldOrdering[] = { - "Add.html#addadd\"", - "add0/add/add/add/Add.html#addadd\"", - "add0/add/add/Add.html#addadd\"", - "add0/add/Add.html#addadd\"", - "add0/Add.html#addadd\"", - "add1/add/add/add/Add.html#addadd\"", - "add1/add/add/Add.html#addadd\"", - "add1/add/Add.html#addadd\"", - "add1/Add.html#addadd\"", - "add2/add/add/add/Add.html#addadd\"", - "add2/add/add/Add.html#addadd\"", - "add2/add/Add.html#addadd\"", - "add2/Add.html#addadd\"", - "add3/add/add/add/Add.html#addadd\"", - "add3/add/add/Add.html#addadd\"", - "add3/add/Add.html#addadd\"", - "add3/Add.html#addadd\"", - "Add.html#AddAdd\"", - "add0/add/add/add/Add.html#AddAdd\"", - "add0/add/add/Add.html#AddAdd\"", - "add0/add/Add.html#AddAdd\"", - "add0/Add.html#AddAdd\"", - "add1/add/add/add/Add.html#AddAdd\"", - "add1/add/add/Add.html#AddAdd\"", - "add1/add/Add.html#AddAdd\"", - "add1/Add.html#AddAdd\"", - "add2/add/add/add/Add.html#AddAdd\"", - "add2/add/add/Add.html#AddAdd\"", - "add2/add/Add.html#AddAdd\"", - "add2/Add.html#AddAdd\"", - "add3/add/add/add/Add.html#AddAdd\"", - "add3/add/add/Add.html#AddAdd\"", - "add3/add/Add.html#AddAdd\"", - "add3/Add.html#AddAdd\"", - "Add.html#ADDADD\"", - "add0/add/add/add/Add.html#ADDADD\"", - "add0/add/add/Add.html#ADDADD\"", - "add0/add/Add.html#ADDADD\"", - "add0/Add.html#ADDADD\"", - "add1/add/add/add/Add.html#ADDADD\"", - "add1/add/add/Add.html#ADDADD\"", - "add1/add/Add.html#ADDADD\"", - "add1/Add.html#ADDADD\"", - "add2/add/add/add/Add.html#ADDADD\"", - "add2/add/add/Add.html#ADDADD\"", - "add2/add/Add.html#ADDADD\"", - "add2/Add.html#ADDADD\"", - "add3/add/add/add/Add.html#ADDADD\"", - "add3/add/add/Add.html#ADDADD\"", - "add3/add/Add.html#ADDADD\"", - "add3/Add.html#ADDADD\"" - }; + TypeElementMemberOrderingTest(JavadocTester tester) { + this.tester = tester; + } - final String expectedPackageTreeOrdering[] = { - "<a href=\"../../add0/add/Add.add.html\" title=\"enum in add0.add\">", - "<a href=\"../../add0/add/Add.ADD.html\" title=\"enum in add0.add\">" - }; + void run() { + tester.javadoc("-d", "out-5", + "-javafx", + "-sourcepath", tester.testSrc(new File(".").getPath()), + "pkg5" + ); - final String expectedOverviewOrdering[] = { - "<a href=\"Add.add.html\" title=\"enum in <Unnamed>\">", - "<a href=\"add0/Add.add.html\" title=\"enum in add0\">", - "<a href=\"add0/add/Add.add.html\" title=\"enum in add0.add\">", - "<a href=\"add0/add/add/Add.add.html\" title=\"enum in add0.add.add\">", - "<a href=\"add0/add/add/add/Add.add.html\" title=\"enum in add0.add.add.add\">", - "<a href=\"add1/Add.add.html\" title=\"enum in add1\">", - "<a href=\"add1/add/Add.add.html\" title=\"enum in add1.add\">", - "<a href=\"add1/add/add/Add.add.html\" title=\"enum in add1.add.add\">", - "<a href=\"add1/add/add/add/Add.add.html\" title=\"enum in add1.add.add.add\">", - "<a href=\"add2/Add.add.html\" title=\"enum in add2\">", - "<a href=\"add2/add/Add.add.html\" title=\"enum in add2.add\">", - "<a href=\"add2/add/add/Add.add.html\" title=\"enum in add2.add.add\">", - "<a href=\"add2/add/add/add/Add.add.html\" title=\"enum in add2.add.add.add\">", - "<a href=\"add3/Add.add.html\" title=\"enum in add3\">", - "<a href=\"add3/add/Add.add.html\" title=\"enum in add3.add\">", - "<a href=\"add3/add/add/Add.add.html\" title=\"enum in add3.add.add\">", - "<a href=\"add3/add/add/add/Add.add.html\" title=\"enum in add3.add.add.add\">", - "<a href=\"Add.ADD.html\" title=\"enum in <Unnamed>\">", - "<a href=\"add0/Add.ADD.html\" title=\"enum in add0\">", - "<a href=\"add0/add/Add.ADD.html\" title=\"enum in add0.add\">", - "<a href=\"add0/add/add/Add.ADD.html\" title=\"enum in add0.add.add\">", - "<a href=\"add0/add/add/add/Add.ADD.html\" title=\"enum in add0.add.add.add\">", - "<a href=\"add1/Add.ADD.html\" title=\"enum in add1\">", - "<a href=\"add1/add/Add.ADD.html\" title=\"enum in add1.add\">", - "<a href=\"add1/add/add/Add.ADD.html\" title=\"enum in add1.add.add\">", - "<a href=\"add1/add/add/add/Add.ADD.html\" title=\"enum in add1.add.add.add\">", - "<a href=\"add2/Add.ADD.html\" title=\"enum in add2\">", - "<a href=\"add2/add/Add.ADD.html\" title=\"enum in add2.add\">", - "<a href=\"add2/add/add/Add.ADD.html\" title=\"enum in add2.add.add\">", - "<a href=\"add2/add/add/add/Add.ADD.html\" title=\"enum in add2.add.add.add\">", - "<a href=\"add3/Add.ADD.html\" title=\"enum in add3\">", - "<a href=\"add3/add/Add.ADD.html\" title=\"enum in add3.add\">", - "<a href=\"add3/add/add/Add.ADD.html\" title=\"enum in add3.add.add\">", - "<a href=\"add3/add/add/add/Add.ADD.html\" title=\"enum in add3.add.add.add\">", - }; + tester.checkExit(Exit.OK); - final static String expectedOverviewFrameOrdering[] = { - "<a href=\"package-frame.html\" target=\"packageFrame\"><unnamed package></a>", - "<a href=\"add0/package-frame.html\" target=\"packageFrame\">add0</a>", - "<a href=\"add0/add/package-frame.html\" target=\"packageFrame\">add0.add</a>", - "<a href=\"add0/add/add/package-frame.html\" target=\"packageFrame\">add0.add.add</a>", - "<a href=\"add0/add/add/add/package-frame.html\" target=\"packageFrame\">add0.add.add.add</a>", - "<a href=\"add1/package-frame.html\" target=\"packageFrame\">add1</a>", - "<a href=\"add1/add/package-frame.html\" target=\"packageFrame\">add1.add</a>", - "<a href=\"add1/add/add/package-frame.html\" target=\"packageFrame\">add1.add.add</a>", - "<a href=\"add1/add/add/add/package-frame.html\" target=\"packageFrame\">add1.add.add.add</a>", - "<a href=\"add2/package-frame.html\" target=\"packageFrame\">add2</a>", - "<a href=\"add2/add/package-frame.html\" target=\"packageFrame\">add2.add</a>", - "<a href=\"add2/add/add/package-frame.html\" target=\"packageFrame\">add2.add.add</a>", - "<a href=\"add2/add/add/add/package-frame.html\" target=\"packageFrame\">add2.add.add.add</a>", - "<a href=\"add3/package-frame.html\" target=\"packageFrame\">add3</a>", - "<a href=\"add3/add/package-frame.html\" target=\"packageFrame\">add3.add</a>", - "<a href=\"add3/add/add/package-frame.html\" target=\"packageFrame\">add3.add.add</a>", - "<a href=\"add3/add/add/add/package-frame.html\" target=\"packageFrame\">add3.add.add.add</a></li>" - }; + tester.checkOrder("pkg5/AnnoFieldTest.html", + "<h3>Field Detail</h3>", + "<pre>static final int one</pre>", + "<pre>static final int two</pre>", + "<pre>static final int three</pre>", + "<pre>static final int four</pre>"); - final static String expectedImplementsOrdering[] = { - "<dd><code>close</code> in interface <code>java.lang.AutoCloseable</code></dd>", - "<dd><code>close</code> in interface <code>java.nio.channels.Channel</code></dd>", - "<dd><code>close</code> in interface <code>java.io.Closeable</code></dd>" - }; + tester.checkOrder("pkg5/AnnoOptionalTest.html", + "<h3>Optional Element Summary</h3>", + "<a href=\"../pkg5/AnnoOptionalTest.html#four--\">four</a>", + "<a href=\"../pkg5/AnnoOptionalTest.html#one--\">one</a>", + "<a href=\"../pkg5/AnnoOptionalTest.html#three--\">three</a>", + "<a href=\"../pkg5/AnnoOptionalTest.html#two--\">two</a>", + "<h3>Element Detail</h3>", + "<h4>one</h4>", + "<h4>two</h4>", + "<h4>three</h4>", + "<h4>four</h4>"); - final static String expectedOverrideOrdering[] = { - "<dd><code>iterator</code> in interface <code>java.util.Collection<", - "<dd><code>iterator</code> in interface <code>java.lang.Iterable<" - }; + tester.checkOrder("pkg5/AnnoRequiredTest.html", + "<h3>Required Element Summary</h3>", + "<a href=\"../pkg5/AnnoRequiredTest.html#four--\">four</a>", + "<a href=\"../pkg5/AnnoRequiredTest.html#one--\">one</a>", + "<a href=\"../pkg5/AnnoRequiredTest.html#three--\">three</a>", + "<a href=\"../pkg5/AnnoRequiredTest.html#two--\">two</a>", + "<h3>Element Detail</h3>", + "<h4>one</h4>", + "<h4>two</h4>", + "<h4>three</h4>", + "<h4>four</h4>"); + + tester.checkOrder("pkg5/CtorTest.html", + "<h3>Constructor Summary</h3>", + "<a href=\"../pkg5/CtorTest.html#CtorTest-int-\"", + "<a href=\"../pkg5/CtorTest.html#CtorTest-int-int-\"", + "<a href=\"../pkg5/CtorTest.html#CtorTest-int-int-int-\"", + "<a href=\"../pkg5/CtorTest.html#CtorTest-int-int-int-int-\"", + "<h3>Constructor Detail</h3>", + "<a name=\"CtorTest-int-int-int-int-\">", + "<a name=\"CtorTest-int-int-int-\">", + "<a name=\"CtorTest-int-int-\">", + "<a name=\"CtorTest-int-\">"); + + tester.checkOrder("pkg5/EnumTest.html", + "<h3>Enum Constant Summary</h3>", + "<a href=\"../pkg5/EnumTest.html#FOUR\">FOUR</a>", + "<a href=\"../pkg5/EnumTest.html#ONE\">ONE</a>", + "<a href=\"../pkg5/EnumTest.html#THREE\">THREE</a>", + "<a href=\"../pkg5/EnumTest.html#TWO\">TWO</a>", + "<h3>Enum Constant Detail</h3>", + "<h4>ONE</h4>", + "<h4>TWO</h4>", + "<h4>THREE</h4>", + "<h4>FOUR</h4>"); + + tester.checkOrder("pkg5/FieldTest.html", + "<h3>Field Summary</h3>", + "<a href=\"../pkg5/FieldTest.html#four\">four</a>", + "<a href=\"../pkg5/FieldTest.html#one\">one</a>", + "<a href=\"../pkg5/FieldTest.html#three\">three</a>", + "<a href=\"../pkg5/FieldTest.html#two\">two</a>", + "<h3>Field Detail</h3>", + "<h4>one</h4>", + "<h4>two</h4>", + "<h4>three</h4>", + "<h4>four</h4>"); + + tester.checkOrder("pkg5/IntfTest.html", + "<h3>Method Summary</h3>", + "<a href=\"../pkg5/IntfTest.html#four--\">four</a>", + "<a href=\"../pkg5/IntfTest.html#one--\">one</a>", + "<a href=\"../pkg5/IntfTest.html#three--\">three</a>", + "<a href=\"../pkg5/IntfTest.html#two--\">two</a>", + "<h3>Method Detail</h3>", + "<h4>one</h4>", + "<h4>two</h4>", + "<h4>three</h4>", + "<h4>four</h4>"); + + tester.checkOrder("pkg5/MethodTest.html", + "<h3>Method Summary</h3>", + "<a href=\"../pkg5/MethodTest.html#four--\">four</a>", + "<a href=\"../pkg5/MethodTest.html#one--\">one</a>", + "<a href=\"../pkg5/MethodTest.html#three--\">three</a>", + "<a href=\"../pkg5/MethodTest.html#two--\">two</a>", + "<h3>Method Detail</h3>", + "<h4>one</h4>", + "<h4>two</h4>", + "<h4>three</h4>", + "<h4>four</h4>"); + + tester.checkOrder("pkg5/PropertyTest.html", + "<h3>Property Summary</h3>", + "<a href=\"../pkg5/PropertyTest.html#fourProperty\">four</a>", + "<a href=\"../pkg5/PropertyTest.html#oneProperty\">one</a>", + "<a href=\"../pkg5/PropertyTest.html#threeProperty\">three</a>", + "<a href=\"../pkg5/PropertyTest.html#twoProperty\">two</a>", + "<h3>Property Detail</h3>", + "<h4>oneProperty</h4>", + "<h4>twoProperty</h4>", + "<h4>threeProperty</h4>", + "<h4>fourProperty</h4>"); + } + } }
--- a/langtools/test/jdk/javadoc/doclet/testOrdering/order/MethodOrder.java Mon Nov 14 10:00:15 2016 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2014, 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 order; - -/** - * This class ensures the method detail section contains the methods - * in the order as it appears in the source. - * @author kumasrin - */ -public class MethodOrder { - /** - * Method d. - * Second line. - */ - public void d(){} - /** - * Method b. - * Second line. - */ - public void b() {} - /** - * Method c. - * Second line. - */ - public void c() {} - /** - * Method a. - * Second line. - */ - public void a() {} -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/AnnoFieldTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,31 @@ +/* + * 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 pkg5; + +public @interface AnnoFieldTest { + public int one = 1; + public int two = 2; + public int three = 3; + public int four = 4; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/AnnoOptionalTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,31 @@ +/* + * 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 pkg5; + +public @interface AnnoOptionalTest { + int one() default 1; + int two() default 2; + int three() default 3; + int four() default 4; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/AnnoRequiredTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,31 @@ +/* + * 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 pkg5; + +public @interface AnnoRequiredTest { + int one(); + int two(); + int three(); + int four(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/CtorTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,31 @@ +/* + * 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 pkg5; + +public class CtorTest { + public CtorTest(int one, int two, int three, int four) {} + public CtorTest(int one, int two, int three) {} + public CtorTest(int one, int two) {} + public CtorTest(int one) {} +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/EnumTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,31 @@ +/* + * 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 pkg5; + +public enum EnumTest { + ONE, + TWO, + THREE, + FOUR +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/FieldTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,31 @@ +/* + * 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 pkg5; + +public class FieldTest { + public int one; + public int two; + public int three; + public int four; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/IntfTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,31 @@ +/* + * 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 pkg5; + +public interface IntfTest { + void one(); + void two(); + void three(); + void four(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/MethodTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,31 @@ +/* + * 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 pkg5; + +public class MethodTest { + public void one(){} + public void two(){} + public void three(){} + public void four(){} +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/jdk/javadoc/doclet/testOrdering/pkg5/PropertyTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,31 @@ +/* + * 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 pkg5; + +public class PropertyTest { + public int oneProperty() { return 1; } + public int twoProperty() { return 2; } + public int threeProperty() { return 3; } + public int fourProperty() { return 4; } +}
--- a/langtools/test/jdk/javadoc/tool/modules/Modules.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/test/jdk/javadoc/tool/modules/Modules.java Tue Nov 22 10:48:24 2016 -0800 @@ -296,7 +296,7 @@ checkMembersSelected("pkg2.B.f"); } -// @Test @ignore JDK-8166379 + @Test public void testPatchModuleOption(Path base) throws Exception { Path src = base.resolve("src"); Path modulePath = base.resolve("modules");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/modules/AnnotationProcessingWithModuleInfoInWrongPlace.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,99 @@ +/* + * 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. + */ + +/** + * @test + * @bug 8168312 + * @summary javac throws NPE if annotation processor is specified and module is declared in a file named arbitrarily + * @library /tools/lib + * @modules + * jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * @build toolbox.ToolBox toolbox.JavacTask ModuleTestBase + * @run main AnnotationProcessingWithModuleInfoInWrongPlace + */ + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Set; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.TypeElement; + +import toolbox.JavacTask; +import toolbox.Task; + +public class AnnotationProcessingWithModuleInfoInWrongPlace extends ModuleTestBase { + + public static void main(String... args) throws Exception { + new AnnotationProcessingWithModuleInfoInWrongPlace().runTests(); + } + + @Test + public void testModuleInfoInWrongPlace(Path base) throws Exception { + Path moduleSrc = base.resolve("module-src"); + Path m = moduleSrc.resolve("m"); + + Path classes = base.resolve("classes"); + + Files.createDirectories(classes); + + tb.writeJavaFiles(m, "module m {}"); + + Path mi = m.resolve("module-info.java"); + Path f = m.resolve("F.java"); + + tb.moveFile(mi, f); + + String log = new JavacTask(tb) + .options("-XDrawDiagnostics", + "--module-source-path", moduleSrc.toString(), + "-processor", AP.class.getName()) + .outdir(classes) + .files(findJavaFiles(moduleSrc)) + .run(Task.Expect.FAIL) + .writeAll() + .getOutput(Task.OutputKind.DIRECT); + + + if (!log.contains("F.java:1:1: compiler.err.module.decl.sb.in.module-info.java")) + throw new AssertionError("Unexpected output: " + log); + } + + @SupportedAnnotationTypes("*") + public static final class AP extends AbstractProcessor { + + @Override + public boolean process(Set<? extends TypeElement> annot, RoundEnvironment env) { + return false; + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } + } +}
--- a/langtools/test/tools/javac/modules/PatchModulesTest.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/test/tools/javac/modules/PatchModulesTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -91,12 +91,28 @@ } @Test - public void testLastOneWins(Path base) throws Exception { + public void testDuplicates(Path base) throws Exception { test(asList("java.base=a", "java.compiler=b", "java.base=c"), - "{java.base=[c], java.compiler=[b]}"); + false, "--patch-module specified more than once for java.base"); + } + + @Test + public void testEmpty(Path base) throws Exception { + test(asList(""), + false, "no value for --patch-module option"); + } + + @Test + public void testInvalid(Path base) throws Exception { + test(asList("java.base/java.lang=."), + false, "bad value for --patch-module option: 'java.base/java.lang=.'"); } void test(List<String> patches, String expect) throws Exception { + test(patches, true, expect); + } + + void test(List<String> patches, boolean expectOK, String expect) throws Exception { JavacTool tool = (JavacTool) ToolProvider.getSystemJavaCompiler(); StringWriter sw = new StringWriter(); try (PrintWriter pw = new PrintWriter(sw)) { @@ -121,6 +137,17 @@ tb.out.println("Found: " + found); error("output not as expected"); } + } catch (IllegalArgumentException e) { + if (expectOK) { + error("unexpected exception: " + e); + throw e; + } + String found = e.getMessage(); + if (!found.equals(expect)) { + tb.out.println("Expect: " + expect); + tb.out.println("Found: " + found); + error("output not as expected"); + } } } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalClassesModel.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,73 @@ +/* + * 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. + */ + +/** + * @test + * @bug 8166700 + * @summary Check that local classes originating in static initializer can be loaded properly. + * @modules jdk.compiler + * @build LocalTest$1Local LocalTest$2Local LocalTest$3Local LocalTest$4Local LocalTest$5Local LocalTest + * @compile LocalClassesModel.java + * @compile/process/ref=LocalClassesModel.out -processor LocalClassesModel LocalTest$1Local LocalTest$2Local LocalTest$3Local LocalTest$4Local LocalTest$5Local LocalTest + */ + +import java.util.Set; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.util.ElementFilter; + +@SupportedAnnotationTypes("*") +public class LocalClassesModel extends AbstractProcessor { + + @Override + public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { + for (TypeElement root : ElementFilter.typesIn(roundEnv.getRootElements())) { + System.out.println(processingEnv.getElementUtils().getBinaryName(root)); + for (ExecutableElement constr : ElementFilter.constructorsIn(root.getEnclosedElements())) { + System.out.print(" ("); + boolean first = true; + for (VariableElement param : constr.getParameters()) { + if (!first) { + System.out.print(", "); + } + first = false; + System.out.print(param.asType().toString()); + } + System.out.println(")"); + } + } + + return false; + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latestSupported(); + } +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalClassesModel.out Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,12 @@ +LocalTest$1Local + () +LocalTest$2Local + (LocalTest) +LocalTest$3Local + () +LocalTest$4Local + (LocalTest) +LocalTest$5Local + (LocalTest) +LocalTest + ()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest$1Local.jcod Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,77 @@ +class LocalTest$1Local { + 0xCAFEBABE; + 0; // minor version + 52; // version + [] { // Constant Pool + ; // first element is empty + Method #3 #12; // #1 + class #13; // #2 + class #16; // #3 + Utf8 "<init>"; // #4 + Utf8 "()V"; // #5 + Utf8 "Code"; // #6 + Utf8 "LineNumberTable"; // #7 + Utf8 "SourceFile"; // #8 + Utf8 "LocalTest.java"; // #9 + Utf8 "EnclosingMethod"; // #10 + class #17; // #11 + NameAndType #4 #5; // #12 + Utf8 "LocalTest$1Local"; // #13 + Utf8 "Local"; // #14 + Utf8 "InnerClasses"; // #15 + Utf8 "java/lang/Object"; // #16 + Utf8 "LocalTest"; // #17 + } // Constant Pool + + 0x0020; // access + #2;// this_cpx + #3;// super_cpx + + [] { // Interfaces + } // Interfaces + + [] { // fields + } // fields + + [] { // methods + { // Member + 0x0000; // access + #4; // name_cpx + #5; // sig_cpx + [] { // Attributes + Attr(#6) { // Code + 1; // max_stack + 1; // max_locals + Bytes[]{ + 0x2AB70001B1; + }; + [] { // Traps + } // end Traps + [] { // Attributes + Attr(#7) { // LineNumberTable + [] { // LineNumberTable + 0 3; + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + } // methods + + [] { // Attributes + Attr(#8) { // SourceFile + #9; + } // end SourceFile + ; + Attr(#10) { // EnclosingMethod + #11 #0; + } // end EnclosingMethod + ; + Attr(#15) { // InnerClasses + [] { // InnerClasses + #2 #0 #14 0; + } + } // end InnerClasses + } // Attributes +} // end class LocalTest$1Local
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest$2Local.jcod Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,90 @@ +class LocalTest$2Local { + 0xCAFEBABE; + 0; // minor version + 52; // version + [] { // Constant Pool + ; // first element is empty + Field #3 #15; // #1 + Method #4 #16; // #2 + class #17; // #3 + class #20; // #4 + Utf8 "this$0"; // #5 + Utf8 "LLocalTest;"; // #6 + Utf8 "<init>"; // #7 + Utf8 "(LLocalTest;)V"; // #8 + Utf8 "Code"; // #9 + Utf8 "LineNumberTable"; // #10 + Utf8 "SourceFile"; // #11 + Utf8 "LocalTest.java"; // #12 + Utf8 "EnclosingMethod"; // #13 + class #21; // #14 + NameAndType #5 #6; // #15 + NameAndType #7 #22; // #16 + Utf8 "LocalTest$2Local"; // #17 + Utf8 "Local"; // #18 + Utf8 "InnerClasses"; // #19 + Utf8 "java/lang/Object"; // #20 + Utf8 "LocalTest"; // #21 + Utf8 "()V"; // #22 + } // Constant Pool + + 0x0020; // access + #3;// this_cpx + #4;// super_cpx + + [] { // Interfaces + } // Interfaces + + [] { // fields + { // Member + 0x1010; // access + #5; // name_cpx + #6; // sig_cpx + [] { // Attributes + } // Attributes + } // Member + } // fields + + [] { // methods + { // Member + 0x0000; // access + #7; // name_cpx + #8; // sig_cpx + [] { // Attributes + Attr(#9) { // Code + 2; // max_stack + 2; // max_locals + Bytes[]{ + 0x2A2BB500012AB700; + 0x02B1; + }; + [] { // Traps + } // end Traps + [] { // Attributes + Attr(#10) { // LineNumberTable + [] { // LineNumberTable + 0 6; + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + } // methods + + [] { // Attributes + Attr(#11) { // SourceFile + #12; + } // end SourceFile + ; + Attr(#13) { // EnclosingMethod + #14 #0; + } // end EnclosingMethod + ; + Attr(#19) { // InnerClasses + [] { // InnerClasses + #3 #0 #18 0; + } + } // end InnerClasses + } // Attributes +} // end class LocalTest$2Local
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest$3Local.jcod Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,79 @@ +class LocalTest$3Local { + 0xCAFEBABE; + 0; // minor version + 52; // version + [] { // Constant Pool + ; // first element is empty + Method #3 #13; // #1 + class #14; // #2 + class #17; // #3 + Utf8 "<init>"; // #4 + Utf8 "()V"; // #5 + Utf8 "Code"; // #6 + Utf8 "LineNumberTable"; // #7 + Utf8 "SourceFile"; // #8 + Utf8 "LocalTest.java"; // #9 + Utf8 "EnclosingMethod"; // #10 + class #18; // #11 + NameAndType #19 #5; // #12 + NameAndType #4 #5; // #13 + Utf8 "LocalTest$3Local"; // #14 + Utf8 "Local"; // #15 + Utf8 "InnerClasses"; // #16 + Utf8 "java/lang/Object"; // #17 + Utf8 "LocalTest"; // #18 + Utf8 "test1"; // #19 + } // Constant Pool + + 0x0020; // access + #2;// this_cpx + #3;// super_cpx + + [] { // Interfaces + } // Interfaces + + [] { // fields + } // fields + + [] { // methods + { // Member + 0x0000; // access + #4; // name_cpx + #5; // sig_cpx + [] { // Attributes + Attr(#6) { // Code + 1; // max_stack + 1; // max_locals + Bytes[]{ + 0x2AB70001B1; + }; + [] { // Traps + } // end Traps + [] { // Attributes + Attr(#7) { // LineNumberTable + [] { // LineNumberTable + 0 9; + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + } // methods + + [] { // Attributes + Attr(#8) { // SourceFile + #9; + } // end SourceFile + ; + Attr(#10) { // EnclosingMethod + #11 #12; + } // end EnclosingMethod + ; + Attr(#16) { // InnerClasses + [] { // InnerClasses + #2 #0 #15 0; + } + } // end InnerClasses + } // Attributes +} // end class LocalTest$3Local
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest$4Local.jcod Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,92 @@ +class LocalTest$4Local { + 0xCAFEBABE; + 0; // minor version + 52; // version + [] { // Constant Pool + ; // first element is empty + Field #3 #16; // #1 + Method #4 #17; // #2 + class #18; // #3 + class #21; // #4 + Utf8 "this$0"; // #5 + Utf8 "LLocalTest;"; // #6 + Utf8 "<init>"; // #7 + Utf8 "(LLocalTest;)V"; // #8 + Utf8 "Code"; // #9 + Utf8 "LineNumberTable"; // #10 + Utf8 "SourceFile"; // #11 + Utf8 "LocalTest.java"; // #12 + Utf8 "EnclosingMethod"; // #13 + class #22; // #14 + NameAndType #23 #24; // #15 + NameAndType #5 #6; // #16 + NameAndType #7 #24; // #17 + Utf8 "LocalTest$4Local"; // #18 + Utf8 "Local"; // #19 + Utf8 "InnerClasses"; // #20 + Utf8 "java/lang/Object"; // #21 + Utf8 "LocalTest"; // #22 + Utf8 "test2"; // #23 + Utf8 "()V"; // #24 + } // Constant Pool + + 0x0020; // access + #3;// this_cpx + #4;// super_cpx + + [] { // Interfaces + } // Interfaces + + [] { // fields + { // Member + 0x1010; // access + #5; // name_cpx + #6; // sig_cpx + [] { // Attributes + } // Attributes + } // Member + } // fields + + [] { // methods + { // Member + 0x0000; // access + #7; // name_cpx + #8; // sig_cpx + [] { // Attributes + Attr(#9) { // Code + 2; // max_stack + 2; // max_locals + Bytes[]{ + 0x2A2BB500012AB700; + 0x02B1; + }; + [] { // Traps + } // end Traps + [] { // Attributes + Attr(#10) { // LineNumberTable + [] { // LineNumberTable + 0 12; + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + } // methods + + [] { // Attributes + Attr(#11) { // SourceFile + #12; + } // end SourceFile + ; + Attr(#13) { // EnclosingMethod + #14 #15; + } // end EnclosingMethod + ; + Attr(#20) { // InnerClasses + [] { // InnerClasses + #3 #0 #19 0; + } + } // end InnerClasses + } // Attributes +} // end class LocalTest$4Local
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest$5Local.jcod Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,90 @@ +class LocalTest$5Local { + 0xCAFEBABE; + 0; // minor version + 52; // version + [] { // Constant Pool + ; // first element is empty + Field #3 #16; // #1 + Method #4 #15; // #2 + class #17; // #3 + class #20; // #4 + Utf8 "this$0"; // #5 + Utf8 "LLocalTest;"; // #6 + Utf8 "<init>"; // #7 + Utf8 "(LLocalTest;)V"; // #8 + Utf8 "Code"; // #9 + Utf8 "LineNumberTable"; // #10 + Utf8 "SourceFile"; // #11 + Utf8 "LocalTest.java"; // #12 + Utf8 "EnclosingMethod"; // #13 + class #21; // #14 + NameAndType #7 #22; // #15 + NameAndType #5 #6; // #16 + Utf8 "LocalTest$5Local"; // #17 + Utf8 "Local"; // #18 + Utf8 "InnerClasses"; // #19 + Utf8 "java/lang/Object"; // #20 + Utf8 "LocalTest"; // #21 + Utf8 "()V"; // #22 + } // Constant Pool + + 0x0020; // access + #3;// this_cpx + #4;// super_cpx + + [] { // Interfaces + } // Interfaces + + [] { // fields + { // Member + 0x1010; // access + #5; // name_cpx + #6; // sig_cpx + [] { // Attributes + } // Attributes + } // Member + } // fields + + [] { // methods + { // Member + 0x0000; // access + #7; // name_cpx + #8; // sig_cpx + [] { // Attributes + Attr(#9) { // Code + 2; // max_stack + 2; // max_locals + Bytes[]{ + 0x2A2BB500012AB700; + 0x02B1; + }; + [] { // Traps + } // end Traps + [] { // Attributes + Attr(#10) { // LineNumberTable + [] { // LineNumberTable + 0 15; + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + } // methods + + [] { // Attributes + Attr(#11) { // SourceFile + #12; + } // end SourceFile + ; + Attr(#13) { // EnclosingMethod + #14 #15; + } // end EnclosingMethod + ; + Attr(#19) { // InnerClasses + [] { // InnerClasses + #3 #0 #18 0; + } + } // end InnerClasses + } // Attributes +} // end class LocalTest$5Local
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest.jcod Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,160 @@ +class LocalTest { + 0xCAFEBABE; + 0; // minor version + 52; // version + [] { // Constant Pool + ; // first element is empty + Method #3 #20; // #1 + class #21; // #2 + class #22; // #3 + class #23; // #4 + Utf8 "Local"; // #5 + Utf8 "InnerClasses"; // #6 + class #24; // #7 + class #25; // #8 + class #26; // #9 + class #27; // #10 + Utf8 "test1"; // #11 + Utf8 "()V"; // #12 + Utf8 "Code"; // #13 + Utf8 "LineNumberTable"; // #14 + Utf8 "test2"; // #15 + Utf8 "<init>"; // #16 + Utf8 "<clinit>"; // #17 + Utf8 "SourceFile"; // #18 + Utf8 "LocalTest.java"; // #19 + NameAndType #16 #12; // #20 + Utf8 "LocalTest"; // #21 + Utf8 "java/lang/Object"; // #22 + Utf8 "LocalTest$5Local"; // #23 + Utf8 "LocalTest$4Local"; // #24 + Utf8 "LocalTest$3Local"; // #25 + Utf8 "LocalTest$2Local"; // #26 + Utf8 "LocalTest$1Local"; // #27 + } // Constant Pool + + 0x0021; // access + #2;// this_cpx + #3;// super_cpx + + [] { // Interfaces + } // Interfaces + + [] { // fields + } // fields + + [] { // methods + { // Member + 0x0008; // access + #11; // name_cpx + #12; // sig_cpx + [] { // Attributes + Attr(#13) { // Code + 0; // max_stack + 0; // max_locals + Bytes[]{ + 0xB1; + }; + [] { // Traps + } // end Traps + [] { // Attributes + Attr(#14) { // LineNumberTable + [] { // LineNumberTable + 0 10; + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + ; + { // Member + 0x0000; // access + #15; // name_cpx + #12; // sig_cpx + [] { // Attributes + Attr(#13) { // Code + 0; // max_stack + 1; // max_locals + Bytes[]{ + 0xB1; + }; + [] { // Traps + } // end Traps + [] { // Attributes + Attr(#14) { // LineNumberTable + [] { // LineNumberTable + 0 13; + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + ; + { // Member + 0x0000; // access + #16; // name_cpx + #12; // sig_cpx + [] { // Attributes + Attr(#13) { // Code + 1; // max_stack + 1; // max_locals + Bytes[]{ + 0x2AB70001B1; + }; + [] { // Traps + } // end Traps + [] { // Attributes + Attr(#14) { // LineNumberTable + [] { // LineNumberTable + 0 14; + 4 16; + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + ; + { // Member + 0x0008; // access + #17; // name_cpx + #12; // sig_cpx + [] { // Attributes + Attr(#13) { // Code + 0; // max_stack + 0; // max_locals + Bytes[]{ + 0xB1; + }; + [] { // Traps + } // end Traps + [] { // Attributes + Attr(#14) { // LineNumberTable + [] { // LineNumberTable + 0 4; + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + } // methods + + [] { // Attributes + Attr(#18) { // SourceFile + #19; + } // end SourceFile + ; + Attr(#6) { // InnerClasses + [] { // InnerClasses + #4 #0 #5 0; + #7 #0 #5 0; + #8 #0 #5 0; + #9 #0 #5 0; + #10 #0 #5 0; + } + } // end InnerClasses + } // Attributes +} // end class LocalTest
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/model/LocalClasses/LocalTest.orign Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,43 @@ +/* + * 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. + */ + +/**The jcod files are generated from this file, compiled by JDK 8 javac. + */ +public class LocalTest { + static { + class Local { } + } + { + class Local { } + } + static void test1() { + class Local { } + } + void test2() { + class Local { } + } + LocalTest() { + class Local { } + } +} +
--- a/langtools/test/tools/jdeps/DotFileTest.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/test/tools/jdeps/DotFileTest.java Tue Nov 22 10:48:24 2016 -0800 @@ -136,8 +136,6 @@ // with -P option List<String> argsWithDashP = new ArrayList<>(); - argsWithDashP.add("-dotoutput"); - argsWithDashP.add(dotoutput.toString()); argsWithDashP.add("-P"); argsWithDashP.addAll(args); @@ -162,8 +160,6 @@ // with -P option List<String> argsWithDashP = new ArrayList<>(); - argsWithDashP.add("-dotoutput"); - argsWithDashP.add(dotoutput.toString()); argsWithDashP.add("-P"); argsWithDashP.addAll(args);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/jdeps/Options.java Tue Nov 22 10:48:24 2016 -0800 @@ -0,0 +1,92 @@ +/* + * 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. + */ + +/* + * @test + * @bug 8168386 + * @summary Test option validation + * @modules jdk.jdeps + * @library lib + * @build JdepsRunner + * @run testng Options + */ + + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertTrue; + +public class Options { + private static final String TEST_CLASSES = System.getProperty("test.classes"); + + @DataProvider(name = "errors") + public Object[][] errors() { + return new Object[][]{ + { + new String[] { "-summary", "-v", TEST_CLASSES }, + "-v, -verbose cannot be used with -s, -summary option" + }, + { + new String[] { "-jdkinternal", "-summary", TEST_CLASSES }, + "-summary or -verbose cannot be used with -jdkinternals option" + }, + { + new String[] { "-jdkinternal", "-p", "java.lang", TEST_CLASSES }, + "--package, --regex, --require cannot be used with -jdkinternals option" + }, + { + new String[] { "--inverse", TEST_CLASSES }, + "--package (-p), --regex (-e), --require option must be specified" + }, + { + new String[] { "--inverse", "-R", TEST_CLASSES }, + "-R cannot be used with --inverse option" + }, + { + new String[] { "--generate-module-info", "dots", "-cp", TEST_CLASSES }, + "-classpath cannot be used with --generate-module-info option" + }, + { + new String[] { "--list-deps", "-summary", TEST_CLASSES }, + "--list-deps and --list-reduced-deps options are specified" + }, + { + new String[] { "--list-deps", "--list-reduced-deps", TEST_CLASSES }, + "--list-deps and --list-reduced-deps options are specified" + }, + }; + } + + @Test(dataProvider = "errors") + public void test(String[] options, String expected) { + jdepsError(options).outputContains(expected); + } + + + public static JdepsRunner jdepsError(String... args) { + JdepsRunner jdeps = new JdepsRunner(args); + assertTrue(jdeps.run(true) != 0); + return jdeps; + } +}
--- a/langtools/test/tools/jdeps/lib/JdepsRunner.java Mon Nov 14 10:00:15 2016 -0800 +++ b/langtools/test/tools/jdeps/lib/JdepsRunner.java Tue Nov 22 10:48:24 2016 -0800 @@ -75,7 +75,7 @@ } public boolean outputContains(String s) { - return stdout.toString().contains(s); + return stdout.toString().contains(s) || stderr.toString().contains(s); } public void printStdout(PrintStream stream) {