# HG changeset patch # User duke # Date 1499288980 -7200 # Node ID c61cc8a344569ca0024b81770661f26b2e819a20 # Parent 18569c523d38ad0c30ea57cb18fe95633359124a# Parent fb08f550b0c78651427fb41ae27c0a67c7140296 Merge diff -r 18569c523d38 -r c61cc8a34456 .hgtags-top-repo --- a/.hgtags-top-repo Sat Apr 08 03:25:14 2017 +0000 +++ b/.hgtags-top-repo Wed Jul 05 23:09:40 2017 +0200 @@ -405,3 +405,6 @@ fe8466adaef8178dba94be53c789a0aaa87d13bb jdk-9+159 4d29ee32d926ebc960072d51a3bc558f95c1cbad jdk-9+160 cda60babd152d889aba4d8f20a8f643ab151d3de jdk-9+161 +21b063d75b3edbffb9bebc8872d990920c4ae1e5 jdk-9+162 +c38c6b270ccc8e2b86d1631bcf42248241b54d2c jdk-9+163 +7810f75d016a52e32295c4233009de5ca90e31af jdk-9+164 diff -r 18569c523d38 -r c61cc8a34456 common/autoconf/basics.m4 --- a/common/autoconf/basics.m4 Sat Apr 08 03:25:14 2017 +0000 +++ b/common/autoconf/basics.m4 Wed Jul 05 23:09:40 2017 +0200 @@ -1098,6 +1098,7 @@ BASIC_PATH_PROGS(HG, hg) BASIC_PATH_PROGS(STAT, stat) BASIC_PATH_PROGS(TIME, time) + BASIC_PATH_PROGS(FLOCK, flock) # Dtrace is usually found in /usr/sbin on Solaris, but that directory may not # be in the user path. BASIC_PATH_PROGS(DTRACE, dtrace, $PATH:/usr/sbin) diff -r 18569c523d38 -r c61cc8a34456 common/autoconf/flags.m4 --- a/common/autoconf/flags.m4 Sat Apr 08 03:25:14 2017 +0000 +++ b/common/autoconf/flags.m4 Wed Jul 05 23:09:40 2017 +0200 @@ -355,7 +355,7 @@ SHARED_LIBRARY_FLAGS="-dynamiclib -compatibility_version 1.0.0 -current_version 1.0.0 $PICFLAG" JVM_CFLAGS="$JVM_CFLAGS $PICFLAG" fi - SET_EXECUTABLE_ORIGIN='-Wl,-rpath,@loader_path[$]1' + SET_EXECUTABLE_ORIGIN='-Wl,-rpath,@loader_path$(or [$]1,/.)' SET_SHARED_LIBRARY_ORIGIN="$SET_EXECUTABLE_ORIGIN" SET_SHARED_LIBRARY_NAME='-Wl,-install_name,@rpath/[$]1' SET_SHARED_LIBRARY_MAPFILE='-Wl,-exported_symbols_list,[$]1' @@ -375,7 +375,7 @@ # Linking is different on MacOSX PICFLAG='' SHARED_LIBRARY_FLAGS="-dynamiclib -compatibility_version 1.0.0 -current_version 1.0.0 $PICFLAG" - SET_EXECUTABLE_ORIGIN='-Wl,-rpath,@loader_path[$]1' + SET_EXECUTABLE_ORIGIN='-Wl,-rpath,@loader_path$(or [$]1,/.)' SET_SHARED_LIBRARY_ORIGIN="$SET_EXECUTABLE_ORIGIN" SET_SHARED_LIBRARY_NAME='-Wl,-install_name,@rpath/[$]1' SET_SHARED_LIBRARY_MAPFILE='-Wl,-exported_symbols_list,[$]1' diff -r 18569c523d38 -r c61cc8a34456 common/autoconf/generated-configure.sh --- a/common/autoconf/generated-configure.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/common/autoconf/generated-configure.sh Wed Jul 05 23:09:40 2017 +0200 @@ -932,6 +932,7 @@ IS_GNU_TIME PATCH DTRACE +FLOCK TIME STAT HG @@ -994,6 +995,7 @@ OPENJDK_TARGET_CPU_LEGACY_LIB OPENJDK_TARGET_CPU_LEGACY REQUIRED_OS_VERSION +REQUIRED_OS_ARCH REQUIRED_OS_NAME COMPILE_TYPE OPENJDK_TARGET_CPU_ENDIAN @@ -1292,6 +1294,7 @@ HG STAT TIME +FLOCK DTRACE PATCH DSYMUTIL @@ -2256,6 +2259,7 @@ HG Override default value for HG STAT Override default value for STAT TIME Override default value for TIME + FLOCK Override default value for FLOCK DTRACE Override default value for DTRACE PATCH Override default value for PATCH DSYMUTIL Override default value for DSYMUTIL @@ -5173,7 +5177,7 @@ #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1489410066 +DATE_WHEN_GENERATED=1490900744 ############################################################################### # @@ -16038,13 +16042,15 @@ fi fi if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then - REQUIRED_OS_NAME=Darwin + REQUIRED_OS_NAME="Mac OS X" REQUIRED_OS_VERSION=11.2 fi if test "x$OPENJDK_TARGET_OS" = "xaix"; then REQUIRED_OS_NAME=AIX REQUIRED_OS_VERSION=7.1 fi + REQUIRED_OS_ARCH=${OPENJDK_TARGET_CPU} + @@ -23056,6 +23062,203 @@ fi + + + # Publish this variable in the help. + + + if [ -z "${FLOCK+x}" ]; then + # The variable is not set by user, try to locate tool using the code snippet + for ac_prog in flock +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +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_FLOCK+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $FLOCK in + [\\/]* | ?:[\\/]*) + ac_cv_path_FLOCK="$FLOCK" # 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_FLOCK="$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 +FLOCK=$ac_cv_path_FLOCK +if test -n "$FLOCK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLOCK" >&5 +$as_echo "$FLOCK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$FLOCK" && break +done + + else + # The variable is set, but is it from the command line or the environment? + + # Try to remove the string !FLOCK! from our list. + try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!FLOCK!/} + 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 "xFLOCK" != xBASH; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of FLOCK from the environment. Use command line variables instead." >&5 +$as_echo "$as_me: WARNING: Ignoring value of FLOCK from the environment. Use command line variables instead." >&2;} + fi + # Try to locate tool using the code snippet + for ac_prog in flock +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +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_FLOCK+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $FLOCK in + [\\/]* | ?:[\\/]*) + ac_cv_path_FLOCK="$FLOCK" # 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_FLOCK="$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 +FLOCK=$ac_cv_path_FLOCK +if test -n "$FLOCK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLOCK" >&5 +$as_echo "$FLOCK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$FLOCK" && 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$FLOCK" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Setting user supplied tool FLOCK= (no value)" >&5 +$as_echo "$as_me: Setting user supplied tool FLOCK= (no value)" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FLOCK" >&5 +$as_echo_n "checking for FLOCK... " >&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="$FLOCK" + 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 FLOCK=$tool_basename" >&5 +$as_echo "$as_me: Will search for user supplied tool FLOCK=$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_FLOCK+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $FLOCK in + [\\/]* | ?:[\\/]*) + ac_cv_path_FLOCK="$FLOCK" # 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_FLOCK="$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 +FLOCK=$ac_cv_path_FLOCK +if test -n "$FLOCK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLOCK" >&5 +$as_echo "$FLOCK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$FLOCK" = 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 FLOCK=$tool_specified" >&5 +$as_echo "$as_me: Will use user supplied tool FLOCK=$tool_specified" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FLOCK" >&5 +$as_echo_n "checking for FLOCK... " >&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 FLOCK=$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 + + # Dtrace is usually found in /usr/sbin on Solaris, but that directory may not # be in the user path. @@ -49486,7 +49689,7 @@ SHARED_LIBRARY_FLAGS="-dynamiclib -compatibility_version 1.0.0 -current_version 1.0.0 $PICFLAG" JVM_CFLAGS="$JVM_CFLAGS $PICFLAG" fi - SET_EXECUTABLE_ORIGIN='-Wl,-rpath,@loader_path$1' + SET_EXECUTABLE_ORIGIN='-Wl,-rpath,@loader_path$(or $1,/.)' SET_SHARED_LIBRARY_ORIGIN="$SET_EXECUTABLE_ORIGIN" SET_SHARED_LIBRARY_NAME='-Wl,-install_name,@rpath/$1' SET_SHARED_LIBRARY_MAPFILE='-Wl,-exported_symbols_list,$1' @@ -49506,7 +49709,7 @@ # Linking is different on MacOSX PICFLAG='' SHARED_LIBRARY_FLAGS="-dynamiclib -compatibility_version 1.0.0 -current_version 1.0.0 $PICFLAG" - SET_EXECUTABLE_ORIGIN='-Wl,-rpath,@loader_path$1' + SET_EXECUTABLE_ORIGIN='-Wl,-rpath,@loader_path$(or $1,/.)' SET_SHARED_LIBRARY_ORIGIN="$SET_EXECUTABLE_ORIGIN" SET_SHARED_LIBRARY_NAME='-Wl,-install_name,@rpath/$1' SET_SHARED_LIBRARY_MAPFILE='-Wl,-exported_symbols_list,$1' diff -r 18569c523d38 -r c61cc8a34456 common/autoconf/platform.m4 --- a/common/autoconf/platform.m4 Sat Apr 08 03:25:14 2017 +0000 +++ b/common/autoconf/platform.m4 Wed Jul 05 23:09:40 2017 +0200 @@ -452,15 +452,17 @@ fi fi if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then - REQUIRED_OS_NAME=Darwin + REQUIRED_OS_NAME="Mac OS X" REQUIRED_OS_VERSION=11.2 fi if test "x$OPENJDK_TARGET_OS" = "xaix"; then REQUIRED_OS_NAME=AIX REQUIRED_OS_VERSION=7.1 fi + REQUIRED_OS_ARCH=${OPENJDK_TARGET_CPU} AC_SUBST(REQUIRED_OS_NAME) + AC_SUBST(REQUIRED_OS_ARCH) AC_SUBST(REQUIRED_OS_VERSION) ]) diff -r 18569c523d38 -r c61cc8a34456 common/autoconf/spec.gmk.in --- a/common/autoconf/spec.gmk.in Sat Apr 08 03:25:14 2017 +0000 +++ b/common/autoconf/spec.gmk.in Wed Jul 05 23:09:40 2017 +0200 @@ -48,7 +48,7 @@ # The default make arguments MAKE_ARGS = $(MAKE_LOG_FLAGS) -r -R -I $(TOPDIR)/make/common SPEC=$(SPEC) \ - MAKE_LOG_FLAGS="$(MAKE_LOG_FLAGS)" LOG_LEVEL=$(LOG_LEVEL) + MAKE_LOG_FLAGS="$(MAKE_LOG_FLAGS)" $(MAKE_LOG_VARS) OUTPUT_SYNC_SUPPORTED:=@OUTPUT_SYNC_SUPPORTED@ OUTPUT_SYNC:=@OUTPUT_SYNC@ @@ -101,8 +101,9 @@ OPENJDK_BUILD_CPU_BITS:=@OPENJDK_BUILD_CPU_BITS@ OPENJDK_BUILD_CPU_ENDIAN:=@OPENJDK_BUILD_CPU_ENDIAN@ -# Legacy OS values for use in release file. +# OS values for use in release file. REQUIRED_OS_NAME:=@REQUIRED_OS_NAME@ +REQUIRED_OS_ARCH:=@REQUIRED_OS_ARCH@ REQUIRED_OS_VERSION:=@REQUIRED_OS_VERSION@ LIBM:=@LIBM@ @@ -636,6 +637,7 @@ DSYMUTIL:=@DSYMUTIL@ FIND:=@FIND@ FIND_DELETE:=@FIND_DELETE@ +FLOCK:=@FLOCK@ ECHO:=@ECHO@ EGREP:=@EGREP@ FGREP:=@FGREP@ diff -r 18569c523d38 -r c61cc8a34456 common/bin/shell-profiler.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/bin/shell-profiler.sh Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,69 @@ +#!/bin/bash +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# Usage: sh shell-tracer.sh +# +# This shell script is supposed to be set as a replacement for SHELL in make, +# causing it to be called whenever make wants to execute shell commands. +# The is suitable for passing on to the old shell, +# typically beginning with -c. +# +# This script will run the shell command line and it will also store a simple +# log of the the time it takes to execute the command in the OUTPUT_FILE, using +# utility for time measure specified with TIME_CMD option. +# +# Type of time measure utility is specified with TIME_CMD_TYPE option. +# Recognized options values of TIME_CMD_TYPE option: "gnutime", "flock". + +TIME_CMD_TYPE="$1" +TIME_CMD="$2" +OUTPUT_FILE="$3" +shift +shift +shift +if [ "$TIME_CMD_TYPE" = "gnutime" ]; then + # Escape backslashes (\) and percent chars (%). See man for GNU 'time'. + msg=${@//\\/\\\\} + msg=${msg//%/%%} + "$TIME_CMD" -f "[TIME:%E] $msg" -a -o "$OUTPUT_FILE" "$@" +elif [ "$TIME_CMD_TYPE" = "flock" ]; then + # Emulated GNU 'time' with 'flock' and 'date'. + ts=`date +%s%3N` + "$@" + status=$? + ts2=`date +%s%3N` + millis=$((ts2 - ts)) + ms=$(($millis % 1000)) + seconds=$((millis / 1000)) + ss=$(($seconds % 60)) + minutes=$(($seconds / 60)) + mm=$(($minutes % 60)) + hh=$(($minutes / 60)): + [ $hh != "0:" ] || hh= + # Synchronize on this script. + flock -w 10 "$0" printf "[TIME:${hh}${mm}:${ss}.%.2s] %s\n" $ms "$*" >> "$OUTPUT_FILE" || true + exit $status +else + "$@" +fi diff -r 18569c523d38 -r c61cc8a34456 common/bin/shell-tracer.sh --- a/common/bin/shell-tracer.sh Sat Apr 08 03:25:14 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# Usage: sh shell-tracer.sh -# -# This shell script is supposed to be set as a replacement for SHELL in make, -# causing it to be called whenever make wants to execute shell commands. -# The is suitable for passing on to the old shell, -# typically beginning with -c. -# -# This script will make sure the shell command line is executed with -# OLD_SHELL -x, and it will also store a simple log of the the time it takes to -# execute the command in the OUTPUT_FILE, using the "time" utility as pointed -# to by TIME_CMD. If TIME_CMD is "-", no timestamp will be stored. - -TIME_CMD="$1" -OUTPUT_FILE="$2" -OLD_SHELL="$3" -shift -shift -shift -if [ "$TIME_CMD" != "-" ]; then -"$TIME_CMD" -f "[TIME:%E] $*" -a -o "$OUTPUT_FILE" "$OLD_SHELL" -x "$@" -else -"$OLD_SHELL" -x "$@" -fi diff -r 18569c523d38 -r c61cc8a34456 common/conf/jib-profiles.js --- a/common/conf/jib-profiles.js Sat Apr 08 03:25:14 2017 +0000 +++ b/common/conf/jib-profiles.js Wed Jul 05 23:09:40 2017 +0200 @@ -910,7 +910,7 @@ freetype: { organization: common.organization, ext: "tar.gz", - revision: "2.3.4+1.0", + revision: "2.7.1-v120+1.0", module: "freetype-" + input.target_platform } }; diff -r 18569c523d38 -r c61cc8a34456 corba/.hgtags --- a/corba/.hgtags Sat Apr 08 03:25:14 2017 +0000 +++ b/corba/.hgtags Wed Jul 05 23:09:40 2017 +0200 @@ -405,3 +405,6 @@ 6feea77d2083c99e44aa3e272d07b7fb3b801683 jdk-9+159 c7688f2fa07936b089ca0e9a0a0eff68ff37a542 jdk-9+160 18f02bc43fe96aef36791d0df7aca748485210cc jdk-9+161 +18ffcf99a3b4a10457853d94190e825bdf07e39b jdk-9+162 +493011dee80e51c2a2b064d049183c047df36d80 jdk-9+163 +965bbae3072702f7c0d95c240523b65e6bb19261 jdk-9+164 diff -r 18569c523d38 -r c61cc8a34456 corba/src/java.corba/share/classes/module-info.java --- a/corba/src/java.corba/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/corba/src/java.corba/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,6 +26,7 @@ /** * Defines the Java binding of the OMG CORBA APIs, and the RMI-IIOP API. * + * @moduleGraph * @since 9 */ @Deprecated(since="9", forRemoval=true) diff -r 18569c523d38 -r c61cc8a34456 corba/src/java.corba/share/classes/sun/corba/Bridge.java --- a/corba/src/java.corba/share/classes/sun/corba/Bridge.java Sat Apr 08 03:25:14 2017 +0000 +++ b/corba/src/java.corba/share/classes/sun/corba/Bridge.java Wed Jul 05 23:09:40 2017 +0200 @@ -59,10 +59,10 @@ * * The code that calls Bridge.get() must have the following Permissions: *
    - *
  • RuntimePermission "reflectionFactoryAccess"
  • *
  • BridgePermission "getBridge"
  • *
  • ReflectPermission "suppressAccessChecks"
  • - *
  • StackFramePermission "retainClassReference"
  • + *
  • RuntimePermission "getStackWalkerWithClassReference"
  • + *
  • RuntimePermission "reflectionFactoryAccess"
  • *
*

* All of these permissions are required to obtain and correctly initialize @@ -105,10 +105,10 @@ /** Fetch the Bridge singleton. This requires the following * permissions: *

    - *
  • RuntimePermission "reflectionFactoryAccess"
  • *
  • BridgePermission "getBridge"
  • *
  • ReflectPermission "suppressAccessChecks"
  • - *
  • StackFramePermission "retainClassReference"
  • + *
  • RuntimePermission "getStackWalkerWithClassReference"
  • + *
  • RuntimePermission "reflectionFactoryAccess"
  • *
* @return The singleton instance of the Bridge class * @throws SecurityException if the caller does not have the diff -r 18569c523d38 -r c61cc8a34456 hotspot/.hgtags --- a/hotspot/.hgtags Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/.hgtags Wed Jul 05 23:09:40 2017 +0200 @@ -565,3 +565,6 @@ 9211c2e89c1cd11ec2d5752b0f97131a7d7525c7 jdk-9+159 94b4e2e5331d38eab6a3639c3511b2e0715df0e9 jdk-9+160 191ffbdb3d7b734288daa7fb76b37a0a85dfe7eb jdk-9+161 +b01c519b715ef6f785d0631adee0a6537cf6c12e jdk-9+162 +983fe207555724d98f4876991e1cbafbcf2733e8 jdk-9+163 +0af429be8bbaeaaf0cb838e9af28c953dda6a9c8 jdk-9+164 diff -r 18569c523d38 -r c61cc8a34456 hotspot/make/gensrc/Gensrc-jdk.internal.vm.compiler.gmk --- a/hotspot/make/gensrc/Gensrc-jdk.internal.vm.compiler.gmk Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/make/gensrc/Gensrc-jdk.internal.vm.compiler.gmk Wed Jul 05 23:09:40 2017 +0200 @@ -81,6 +81,7 @@ PROCESSOR_PATH := $(call PathList, $(PROCESSOR_JARS)) ADD_EXPORTS := \ + --add-modules jdk.internal.vm.ci \ --add-exports jdk.internal.vm.ci/jdk.vm.ci.aarch64=ALL-UNNAMED \ --add-exports jdk.internal.vm.ci/jdk.vm.ci.amd64=ALL-UNNAMED \ --add-exports jdk.internal.vm.ci/jdk.vm.ci.code=ALL-UNNAMED \ diff -r 18569c523d38 -r c61cc8a34456 hotspot/make/lib/CompileJvm.gmk --- a/hotspot/make/lib/CompileJvm.gmk Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/make/lib/CompileJvm.gmk Wed Jul 05 23:09:40 2017 +0200 @@ -118,6 +118,12 @@ OPENJDK_TARGET_CPU_VM_VERSION := amd64 else ifeq ($(OPENJDK_TARGET_CPU), sparcv9) OPENJDK_TARGET_CPU_VM_VERSION := sparc +else ifeq ($(HOTSPOT_TARGET_CPU_ARCH), arm) + ifeq ($(OPENJDK_TARGET_CPU), aarch64) + # This sets the Oracle Aarch64 port to use arm64 + # while the original Aarch64 port uses aarch64 + OPENJDK_TARGET_CPU_VM_VERSION := arm64 + endif else OPENJDK_TARGET_CPU_VM_VERSION := $(OPENJDK_TARGET_CPU) endif diff -r 18569c523d38 -r c61cc8a34456 hotspot/make/test/JtregNative.gmk --- a/hotspot/make/test/JtregNative.gmk Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/make/test/JtregNative.gmk Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ # -# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -48,6 +48,8 @@ $(HOTSPOT_TOPDIR)/test/runtime/jni/PrivateInterfaceMethods \ $(HOTSPOT_TOPDIR)/test/runtime/jni/ToStringInInterfaceTest \ $(HOTSPOT_TOPDIR)/test/runtime/jni/CalleeSavedRegisters \ + $(HOTSPOT_TOPDIR)/test/runtime/jni/CallWithJNIWeak \ + $(HOTSPOT_TOPDIR)/test/runtime/jni/ReturnJNIWeak \ $(HOTSPOT_TOPDIR)/test/runtime/modules/getModuleJNI \ $(HOTSPOT_TOPDIR)/test/runtime/SameObject \ $(HOTSPOT_TOPDIR)/test/runtime/BoolReturn \ diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/aarch64/vm/aarch64.ad --- a/hotspot/src/cpu/aarch64/vm/aarch64.ad Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad Wed Jul 05 23:09:40 2017 +0200 @@ -15501,7 +15501,7 @@ %} instruct string_indexofUU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2, - iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr) + iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr) %{ predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU); match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2))); @@ -15520,7 +15520,7 @@ %} instruct string_indexofLL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2, - iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr) + iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr) %{ predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL); match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2))); @@ -15539,7 +15539,7 @@ %} instruct string_indexofUL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2, - iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr) + iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr) %{ predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL); match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2))); @@ -15558,7 +15558,7 @@ %} instruct string_indexofLU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2, - iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr) + iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr) %{ predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LU); match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2))); @@ -15577,8 +15577,8 @@ %} instruct string_indexof_conUU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, - immI_le_4 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2, - iRegI tmp3, iRegI tmp4, rFlagsReg cr) + immI_le_4 int_cnt2, iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, + iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr) %{ predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU); match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2))); @@ -15598,8 +15598,8 @@ %} instruct string_indexof_conLL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, - immI_le_4 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2, - iRegI tmp3, iRegI tmp4, rFlagsReg cr) + immI_le_4 int_cnt2, iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, + iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr) %{ predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL); match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2))); @@ -15619,8 +15619,8 @@ %} instruct string_indexof_conUL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, - immI_1 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2, - iRegI tmp3, iRegI tmp4, rFlagsReg cr) + immI_1 int_cnt2, iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, + iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr) %{ predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL); match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2))); @@ -15640,8 +15640,8 @@ %} instruct string_indexof_conLU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, - immI_1 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2, - iRegI tmp3, iRegI tmp4, rFlagsReg cr) + immI_1 int_cnt2, iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, + iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr) %{ predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LU); match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2))); @@ -15661,8 +15661,8 @@ %} instruct string_indexofU_char(iRegP_R1 str1, iRegI_R2 cnt1, iRegI_R3 ch, - iRegI_R0 result, iRegI tmp1, iRegI tmp2, - iRegI tmp3, rFlagsReg cr) + iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, + iRegINoSp tmp3, rFlagsReg cr) %{ match(Set result (StrIndexOfChar (Binary str1 cnt1) ch)); effect(USE_KILL str1, USE_KILL cnt1, USE_KILL ch, @@ -16101,7 +16101,7 @@ // ====================REDUCTION ARITHMETIC==================================== -instruct reduce_add2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegI tmp, iRegI tmp2) +instruct reduce_add2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegINoSp tmp, iRegINoSp tmp2) %{ match(Set dst (AddReductionVI src1 src2)); ins_cost(INSN_COST); @@ -16120,7 +16120,7 @@ ins_pipe(pipe_class_default); %} -instruct reduce_add4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegI tmp2) +instruct reduce_add4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegINoSp tmp2) %{ match(Set dst (AddReductionVI src1 src2)); ins_cost(INSN_COST); @@ -16138,7 +16138,7 @@ ins_pipe(pipe_class_default); %} -instruct reduce_mul2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegI tmp) +instruct reduce_mul2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegINoSp tmp) %{ match(Set dst (MulReductionVI src1 src2)); ins_cost(INSN_COST); @@ -16157,7 +16157,7 @@ ins_pipe(pipe_class_default); %} -instruct reduce_mul4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegI tmp2) +instruct reduce_mul4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegINoSp tmp2) %{ match(Set dst (MulReductionVI src1 src2)); ins_cost(INSN_COST); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/aarch64/vm/jniFastGetField_aarch64.cpp --- a/hotspot/src/cpu/aarch64/vm/jniFastGetField_aarch64.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/aarch64/vm/jniFastGetField_aarch64.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -82,6 +82,11 @@ __ eor(robj, robj, rcounter); // obj, since // robj ^ rcounter ^ rcounter == robj // robj is address dependent on rcounter. + + // If mask changes we need to ensure that the inverse is still encodable as an immediate + STATIC_ASSERT(JNIHandles::weak_tag_mask == 1); + __ andr(robj, robj, ~JNIHandles::weak_tag_mask); + __ ldr(robj, Address(robj, 0)); // *obj __ lsr(roffset, c_rarg2, 2); // offset diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp --- a/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, 2015, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -2052,13 +2052,31 @@ __ reset_last_Java_frame(false); - // Unpack oop result + // Unbox oop result, e.g. JNIHandles::resolve result. if (ret_type == T_OBJECT || ret_type == T_ARRAY) { - Label L; - __ cbz(r0, L); - __ ldr(r0, Address(r0, 0)); - __ bind(L); - __ verify_oop(r0); + Label done, not_weak; + __ cbz(r0, done); // Use NULL as-is. + STATIC_ASSERT(JNIHandles::weak_tag_mask == 1u); + __ tbz(r0, 0, not_weak); // Test for jweak tag. + // Resolve jweak. + __ ldr(r0, Address(r0, -JNIHandles::weak_tag_value)); + __ verify_oop(r0); +#if INCLUDE_ALL_GCS + if (UseG1GC) { + __ g1_write_barrier_pre(noreg /* obj */, + r0 /* pre_val */, + rthread /* thread */, + rscratch1 /* tmp */, + true /* tosca_live */, + true /* expand_call */); + } +#endif // INCLUDE_ALL_GCS + __ b(done); + __ bind(not_weak); + // Resolve (untagged) jobject. + __ ldr(r0, Address(r0, 0)); + __ verify_oop(r0); + __ bind(done); } if (CheckJNICalls) { diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/aarch64/vm/templateInterpreterGenerator_aarch64.cpp --- a/hotspot/src/cpu/aarch64/vm/templateInterpreterGenerator_aarch64.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/aarch64/vm/templateInterpreterGenerator_aarch64.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, Red Hat Inc. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -1399,13 +1399,32 @@ // and result handler will pick it up { - Label no_oop, store_result; + Label no_oop, not_weak, store_result; __ adr(t, ExternalAddress(AbstractInterpreter::result_handler(T_OBJECT))); __ cmp(t, result_handler); __ br(Assembler::NE, no_oop); - // retrieve result + // Unbox oop result, e.g. JNIHandles::resolve result. __ pop(ltos); - __ cbz(r0, store_result); + __ cbz(r0, store_result); // Use NULL as-is. + STATIC_ASSERT(JNIHandles::weak_tag_mask == 1u); + __ tbz(r0, 0, not_weak); // Test for jweak tag. + // Resolve jweak. + __ ldr(r0, Address(r0, -JNIHandles::weak_tag_value)); +#if INCLUDE_ALL_GCS + if (UseG1GC) { + __ enter(); // Barrier may call runtime. + __ g1_write_barrier_pre(noreg /* obj */, + r0 /* pre_val */, + rthread /* thread */, + t /* tmp */, + true /* tosca_live */, + true /* expand_call */); + __ leave(); + } +#endif // INCLUDE_ALL_GCS + __ b(store_result); + __ bind(not_weak); + // Resolve (untagged) jobject. __ ldr(r0, Address(r0, 0)); __ bind(store_result); __ str(r0, Address(rfp, frame::interpreter_frame_oop_temp_offset*wordSize)); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/arm/vm/interp_masm_arm.cpp --- a/hotspot/src/cpu/arm/vm/interp_masm_arm.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/arm/vm/interp_masm_arm.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -476,185 +476,6 @@ } ////////////////////////////////////////////////////////////////////////////////// -#if INCLUDE_ALL_GCS - -// G1 pre-barrier. -// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR). -// If store_addr != noreg, then previous value is loaded from [store_addr]; -// in such case store_addr and new_val registers are preserved; -// otherwise pre_val register is preserved. -void InterpreterMacroAssembler::g1_write_barrier_pre(Register store_addr, - Register new_val, - Register pre_val, - Register tmp1, - Register tmp2) { - Label done; - Label runtime; - - if (store_addr != noreg) { - assert_different_registers(store_addr, new_val, pre_val, tmp1, tmp2, noreg); - } else { - assert (new_val == noreg, "should be"); - assert_different_registers(pre_val, tmp1, tmp2, noreg); - } - - Address in_progress(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() + - SATBMarkQueue::byte_offset_of_active())); - Address index(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() + - SATBMarkQueue::byte_offset_of_index())); - Address buffer(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() + - SATBMarkQueue::byte_offset_of_buf())); - - // Is marking active? - assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "adjust this code"); - ldrb(tmp1, in_progress); - cbz(tmp1, done); - - // Do we need to load the previous value? - if (store_addr != noreg) { - load_heap_oop(pre_val, Address(store_addr, 0)); - } - - // Is the previous value null? - cbz(pre_val, done); - - // Can we store original value in the thread's buffer? - // Is index == 0? - // (The index field is typed as size_t.) - - ldr(tmp1, index); // tmp1 := *index_adr - ldr(tmp2, buffer); - - subs(tmp1, tmp1, wordSize); // tmp1 := tmp1 - wordSize - b(runtime, lt); // If negative, goto runtime - - str(tmp1, index); // *index_adr := tmp1 - - // Record the previous value - str(pre_val, Address(tmp2, tmp1)); - b(done); - - bind(runtime); - - // save the live input values -#ifdef AARCH64 - if (store_addr != noreg) { - raw_push(store_addr, new_val); - } else { - raw_push(pre_val, ZR); - } -#else - if (store_addr != noreg) { - // avoid raw_push to support any ordering of store_addr and new_val - push(RegisterSet(store_addr) | RegisterSet(new_val)); - } else { - push(pre_val); - } -#endif // AARCH64 - - if (pre_val != R0) { - mov(R0, pre_val); - } - mov(R1, Rthread); - - call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), R0, R1); - -#ifdef AARCH64 - if (store_addr != noreg) { - raw_pop(store_addr, new_val); - } else { - raw_pop(pre_val, ZR); - } -#else - if (store_addr != noreg) { - pop(RegisterSet(store_addr) | RegisterSet(new_val)); - } else { - pop(pre_val); - } -#endif // AARCH64 - - bind(done); -} - -// G1 post-barrier. -// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR). -void InterpreterMacroAssembler::g1_write_barrier_post(Register store_addr, - Register new_val, - Register tmp1, - Register tmp2, - Register tmp3) { - - Address queue_index(Rthread, in_bytes(JavaThread::dirty_card_queue_offset() + - DirtyCardQueue::byte_offset_of_index())); - Address buffer(Rthread, in_bytes(JavaThread::dirty_card_queue_offset() + - DirtyCardQueue::byte_offset_of_buf())); - - BarrierSet* bs = Universe::heap()->barrier_set(); - CardTableModRefBS* ct = (CardTableModRefBS*)bs; - Label done; - Label runtime; - - // Does store cross heap regions? - - eor(tmp1, store_addr, new_val); -#ifdef AARCH64 - logical_shift_right(tmp1, tmp1, HeapRegion::LogOfHRGrainBytes); - cbz(tmp1, done); -#else - movs(tmp1, AsmOperand(tmp1, lsr, HeapRegion::LogOfHRGrainBytes)); - b(done, eq); -#endif - - // crosses regions, storing NULL? - - cbz(new_val, done); - - // storing region crossing non-NULL, is card already dirty? - const Register card_addr = tmp1; - assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); - - mov_address(tmp2, (address)ct->byte_map_base, symbolic_Relocation::card_table_reference); - add(card_addr, tmp2, AsmOperand(store_addr, lsr, CardTableModRefBS::card_shift)); - - ldrb(tmp2, Address(card_addr)); - cmp(tmp2, (int)G1SATBCardTableModRefBS::g1_young_card_val()); - b(done, eq); - - membar(MacroAssembler::Membar_mask_bits(MacroAssembler::StoreLoad), tmp2); - - assert(CardTableModRefBS::dirty_card_val() == 0, "adjust this code"); - ldrb(tmp2, Address(card_addr)); - cbz(tmp2, done); - - // storing a region crossing, non-NULL oop, card is clean. - // dirty card and log. - - strb(zero_register(tmp2), Address(card_addr)); - - ldr(tmp2, queue_index); - ldr(tmp3, buffer); - - subs(tmp2, tmp2, wordSize); - b(runtime, lt); // go to runtime if now negative - - str(tmp2, queue_index); - - str(card_addr, Address(tmp3, tmp2)); - b(done); - - bind(runtime); - - if (card_addr != R0) { - mov(R0, card_addr); - } - mov(R1, Rthread); - call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), R0, R1); - - bind(done); -} - -#endif // INCLUDE_ALL_GCS -////////////////////////////////////////////////////////////////////////////////// // Java Expression Stack diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/arm/vm/interp_masm_arm.hpp --- a/hotspot/src/cpu/arm/vm/interp_masm_arm.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/arm/vm/interp_masm_arm.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -146,27 +146,6 @@ void set_card(Register card_table_base, Address card_table_addr, Register tmp); -#if INCLUDE_ALL_GCS - // G1 pre-barrier. - // Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR). - // If store_addr != noreg, then previous value is loaded from [store_addr]; - // in such case store_addr and new_val registers are preserved; - // otherwise pre_val register is preserved. - void g1_write_barrier_pre(Register store_addr, - Register new_val, - Register pre_val, - Register tmp1, - Register tmp2); - - // G1 post-barrier. - // Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR). - void g1_write_barrier_post(Register store_addr, - Register new_val, - Register tmp1, - Register tmp2, - Register tmp3); -#endif // INCLUDE_ALL_GCS - void pop_ptr(Register r); void pop_i(Register r = R0_tos); #ifdef AARCH64 diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/arm/vm/jniFastGetField_arm.cpp --- a/hotspot/src/cpu/arm/vm/jniFastGetField_arm.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/arm/vm/jniFastGetField_arm.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -119,6 +119,14 @@ __ ldr_s32(Rsafept_cnt, Address(Rsafepoint_counter_addr)); __ tbnz(Rsafept_cnt, 0, slow_case); +#ifdef AARCH64 + // If mask changes we need to ensure that the inverse is still encodable as an immediate + STATIC_ASSERT(JNIHandles::weak_tag_mask == 1); + __ andr(R1, R1, ~JNIHandles::weak_tag_mask); +#else + __ bic(R1, R1, JNIHandles::weak_tag_mask); +#endif + if (os::is_MP()) { // Address dependency restricts memory access ordering. It's cheaper than explicit LoadLoad barrier __ andr(Rtmp1, Rsafept_cnt, (unsigned)1); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/arm/vm/macroAssembler_arm.cpp --- a/hotspot/src/cpu/arm/vm/macroAssembler_arm.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/arm/vm/macroAssembler_arm.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2211,6 +2211,219 @@ b(done, eq); } + +void MacroAssembler::resolve_jobject(Register value, + Register tmp1, + Register tmp2) { + assert_different_registers(value, tmp1, tmp2); + Label done, not_weak; + cbz(value, done); // Use NULL as-is. + STATIC_ASSERT(JNIHandles::weak_tag_mask == 1u); + tbz(value, 0, not_weak); // Test for jweak tag. + // Resolve jweak. + ldr(value, Address(value, -JNIHandles::weak_tag_value)); + verify_oop(value); +#if INCLUDE_ALL_GCS + if (UseG1GC) { + g1_write_barrier_pre(noreg, // store_addr + noreg, // new_val + value, // pre_val + tmp1, // tmp1 + tmp2); // tmp2 + } +#endif // INCLUDE_ALL_GCS + b(done); + bind(not_weak); + // Resolve (untagged) jobject. + ldr(value, Address(value)); + verify_oop(value); + bind(done); +} + + +////////////////////////////////////////////////////////////////////////////////// + +#if INCLUDE_ALL_GCS + +// G1 pre-barrier. +// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR). +// If store_addr != noreg, then previous value is loaded from [store_addr]; +// in such case store_addr and new_val registers are preserved; +// otherwise pre_val register is preserved. +void MacroAssembler::g1_write_barrier_pre(Register store_addr, + Register new_val, + Register pre_val, + Register tmp1, + Register tmp2) { + Label done; + Label runtime; + + if (store_addr != noreg) { + assert_different_registers(store_addr, new_val, pre_val, tmp1, tmp2, noreg); + } else { + assert (new_val == noreg, "should be"); + assert_different_registers(pre_val, tmp1, tmp2, noreg); + } + + Address in_progress(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() + + SATBMarkQueue::byte_offset_of_active())); + Address index(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() + + SATBMarkQueue::byte_offset_of_index())); + Address buffer(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() + + SATBMarkQueue::byte_offset_of_buf())); + + // Is marking active? + assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "adjust this code"); + ldrb(tmp1, in_progress); + cbz(tmp1, done); + + // Do we need to load the previous value? + if (store_addr != noreg) { + load_heap_oop(pre_val, Address(store_addr, 0)); + } + + // Is the previous value null? + cbz(pre_val, done); + + // Can we store original value in the thread's buffer? + // Is index == 0? + // (The index field is typed as size_t.) + + ldr(tmp1, index); // tmp1 := *index_adr + ldr(tmp2, buffer); + + subs(tmp1, tmp1, wordSize); // tmp1 := tmp1 - wordSize + b(runtime, lt); // If negative, goto runtime + + str(tmp1, index); // *index_adr := tmp1 + + // Record the previous value + str(pre_val, Address(tmp2, tmp1)); + b(done); + + bind(runtime); + + // save the live input values +#ifdef AARCH64 + if (store_addr != noreg) { + raw_push(store_addr, new_val); + } else { + raw_push(pre_val, ZR); + } +#else + if (store_addr != noreg) { + // avoid raw_push to support any ordering of store_addr and new_val + push(RegisterSet(store_addr) | RegisterSet(new_val)); + } else { + push(pre_val); + } +#endif // AARCH64 + + if (pre_val != R0) { + mov(R0, pre_val); + } + mov(R1, Rthread); + + call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), R0, R1); + +#ifdef AARCH64 + if (store_addr != noreg) { + raw_pop(store_addr, new_val); + } else { + raw_pop(pre_val, ZR); + } +#else + if (store_addr != noreg) { + pop(RegisterSet(store_addr) | RegisterSet(new_val)); + } else { + pop(pre_val); + } +#endif // AARCH64 + + bind(done); +} + +// G1 post-barrier. +// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR). +void MacroAssembler::g1_write_barrier_post(Register store_addr, + Register new_val, + Register tmp1, + Register tmp2, + Register tmp3) { + + Address queue_index(Rthread, in_bytes(JavaThread::dirty_card_queue_offset() + + DirtyCardQueue::byte_offset_of_index())); + Address buffer(Rthread, in_bytes(JavaThread::dirty_card_queue_offset() + + DirtyCardQueue::byte_offset_of_buf())); + + BarrierSet* bs = Universe::heap()->barrier_set(); + CardTableModRefBS* ct = (CardTableModRefBS*)bs; + Label done; + Label runtime; + + // Does store cross heap regions? + + eor(tmp1, store_addr, new_val); +#ifdef AARCH64 + logical_shift_right(tmp1, tmp1, HeapRegion::LogOfHRGrainBytes); + cbz(tmp1, done); +#else + movs(tmp1, AsmOperand(tmp1, lsr, HeapRegion::LogOfHRGrainBytes)); + b(done, eq); +#endif + + // crosses regions, storing NULL? + + cbz(new_val, done); + + // storing region crossing non-NULL, is card already dirty? + const Register card_addr = tmp1; + assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); + + mov_address(tmp2, (address)ct->byte_map_base, symbolic_Relocation::card_table_reference); + add(card_addr, tmp2, AsmOperand(store_addr, lsr, CardTableModRefBS::card_shift)); + + ldrb(tmp2, Address(card_addr)); + cmp(tmp2, (int)G1SATBCardTableModRefBS::g1_young_card_val()); + b(done, eq); + + membar(MacroAssembler::Membar_mask_bits(MacroAssembler::StoreLoad), tmp2); + + assert(CardTableModRefBS::dirty_card_val() == 0, "adjust this code"); + ldrb(tmp2, Address(card_addr)); + cbz(tmp2, done); + + // storing a region crossing, non-NULL oop, card is clean. + // dirty card and log. + + strb(zero_register(tmp2), Address(card_addr)); + + ldr(tmp2, queue_index); + ldr(tmp3, buffer); + + subs(tmp2, tmp2, wordSize); + b(runtime, lt); // go to runtime if now negative + + str(tmp2, queue_index); + + str(card_addr, Address(tmp3, tmp2)); + b(done); + + bind(runtime); + + if (card_addr != R0) { + mov(R0, card_addr); + } + mov(R1, Rthread); + call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), R0, R1); + + bind(done); +} + +#endif // INCLUDE_ALL_GCS + +////////////////////////////////////////////////////////////////////////////////// + #ifdef AARCH64 void MacroAssembler::load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed) { diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/arm/vm/macroAssembler_arm.hpp --- a/hotspot/src/cpu/arm/vm/macroAssembler_arm.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/arm/vm/macroAssembler_arm.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -402,6 +402,29 @@ void biased_locking_enter_with_cas(Register obj_reg, Register old_mark_reg, Register new_mark_reg, Register tmp, Label& slow_case, int* counter_addr); + void resolve_jobject(Register value, Register tmp1, Register tmp2); + +#if INCLUDE_ALL_GCS + // G1 pre-barrier. + // Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR). + // If store_addr != noreg, then previous value is loaded from [store_addr]; + // in such case store_addr and new_val registers are preserved; + // otherwise pre_val register is preserved. + void g1_write_barrier_pre(Register store_addr, + Register new_val, + Register pre_val, + Register tmp1, + Register tmp2); + + // G1 post-barrier. + // Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR). + void g1_write_barrier_post(Register store_addr, + Register new_val, + Register tmp1, + Register tmp2, + Register tmp3); +#endif // INCLUDE_ALL_GCS + #ifndef AARCH64 void nop() { mov(R0, R0); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp --- a/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1732,14 +1732,7 @@ case T_FLOAT : // fall through case T_DOUBLE : /* nothing to do */ break; case T_OBJECT : // fall through - case T_ARRAY : { - Label L; - __ cbz(R0, L); - __ ldr(R0, Address(R0)); - __ verify_oop(R0); - __ bind(L); - break; - } + case T_ARRAY : break; // See JNIHandles::resolve below default: ShouldNotReachHere(); } @@ -1748,13 +1741,14 @@ if (CheckJNICalls) { __ str(__ zero_register(Rtemp), Address(Rthread, JavaThread::pending_jni_exception_check_fn_offset())); } +#endif // AARCH64 - // Unhandle the result + // Unbox oop result, e.g. JNIHandles::resolve value in R0. if (ret_type == T_OBJECT || ret_type == T_ARRAY) { - __ cmp(R0, 0); - __ ldr(R0, Address(R0), ne); + __ resolve_jobject(R0, // value + Rtemp, // tmp1 + R1_tmp); // tmp2 } -#endif // AARCH64 // Any exception pending? __ ldr(Rtemp, Address(Rthread, Thread::pending_exception_offset())); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/arm/vm/templateInterpreterGenerator_arm.cpp --- a/hotspot/src/cpu/arm/vm/templateInterpreterGenerator_arm.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/arm/vm/templateInterpreterGenerator_arm.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1240,28 +1240,25 @@ __ str(__ zero_register(Rtemp), Address(Rthread, JavaThread::pending_jni_exception_check_fn_offset())); } - // Unbox if the result is non-zero object + // Unbox oop result, e.g. JNIHandles::resolve result if it's an oop. + { + Label Lnot_oop; #ifdef AARCH64 - { - Label L, Lnull; __ mov_slow(Rtemp, AbstractInterpreter::result_handler(T_OBJECT)); __ cmp(Rresult_handler, Rtemp); - __ b(L, ne); - __ cbz(Rsaved_result, Lnull); - __ ldr(Rsaved_result, Address(Rsaved_result)); - __ bind(Lnull); - // Store oop on the stack for GC - __ str(Rsaved_result, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize)); - __ bind(L); + __ b(Lnot_oop, ne); +#else // !AARCH64 + // For ARM32, Rresult_handler is -1 for oop result, 0 otherwise. + __ cbz(Rresult_handler, Lnot_oop); +#endif // !AARCH64 + Register value = AARCH64_ONLY(Rsaved_result) NOT_AARCH64(Rsaved_result_lo); + __ resolve_jobject(value, // value + Rtemp, // tmp1 + R1_tmp); // tmp2 + // Store resolved result in frame for GC visibility. + __ str(value, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize)); + __ bind(Lnot_oop); } -#else - __ tst(Rsaved_result_lo, Rresult_handler); - __ ldr(Rsaved_result_lo, Address(Rsaved_result_lo), ne); - - // Store oop on the stack for GC - __ cmp(Rresult_handler, 0); - __ str(Rsaved_result_lo, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize), ne); -#endif // AARCH64 #ifdef AARCH64 // Restore SP (drop native parameters area), to keep SP in sync with extended_sp in frame diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/ppc/vm/frame_ppc.cpp --- a/hotspot/src/cpu/ppc/vm/frame_ppc.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/ppc/vm/frame_ppc.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2015 SAP SE. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2017 SAP SE. 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 @@ -171,10 +171,7 @@ switch (method->result_type()) { case T_OBJECT: case T_ARRAY: { - oop* obj_p = *(oop**)lresult; - oop obj = (obj_p == NULL) ? (oop)NULL : *obj_p; - assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check"); - *oop_result = obj; + *oop_result = JNIHandles::resolve(*(jobject*)lresult); break; } // We use std/stfd to store the values. diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp --- a/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,6 +1,6 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2016 SAP SE. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2017 SAP SE. 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 @@ -3033,6 +3033,34 @@ stbx(R0, Rtmp, Robj); } +// Kills R31 if value is a volatile register. +void MacroAssembler::resolve_jobject(Register value, Register tmp1, Register tmp2, bool needs_frame) { + Label done; + cmpdi(CCR0, value, 0); + beq(CCR0, done); // Use NULL as-is. + + clrrdi(tmp1, value, JNIHandles::weak_tag_size); +#if INCLUDE_ALL_GCS + if (UseG1GC) { andi_(tmp2, value, JNIHandles::weak_tag_mask); } +#endif + ld(value, 0, tmp1); // Resolve (untagged) jobject. + +#if INCLUDE_ALL_GCS + if (UseG1GC) { + Label not_weak; + beq(CCR0, not_weak); // Test for jweak tag. + verify_oop(value); + g1_write_barrier_pre(noreg, // obj + noreg, // offset + value, // pre_val + tmp1, tmp2, needs_frame); + bind(not_weak); + } +#endif // INCLUDE_ALL_GCS + verify_oop(value); + bind(done); +} + #if INCLUDE_ALL_GCS // General G1 pre-barrier generator. // Goal: record the previous value if it is not null. @@ -3094,7 +3122,7 @@ bind(runtime); - // VM call need frame to access(write) O register. + // May need to preserve LR. Also needed if current frame is not compatible with C calling convention. if (needs_frame) { save_LR_CR(Rtmp1); push_frame_reg_args(0, Rtmp2); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/ppc/vm/macroAssembler_ppc.hpp --- a/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2016 SAP SE. All rights reserved. + * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2017 SAP SE. 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 @@ -649,6 +649,8 @@ void card_write_barrier_post(Register Rstore_addr, Register Rnew_val, Register Rtmp); void card_table_write(jbyte* byte_map_base, Register Rtmp, Register Robj); + void resolve_jobject(Register value, Register tmp1, Register tmp2, bool needs_frame); + #if INCLUDE_ALL_GCS // General G1 pre-barrier generator. void g1_write_barrier_pre(Register Robj, RegisterOrConstant offset, Register Rpre_val, diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp --- a/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,6 +1,6 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2016 SAP SE. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2017 SAP SE. 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 @@ -2477,16 +2477,11 @@ __ reset_last_Java_frame(); - // Unpack oop result. + // Unbox oop result, e.g. JNIHandles::resolve value. // -------------------------------------------------------------------------- if (ret_type == T_OBJECT || ret_type == T_ARRAY) { - Label skip_unboxing; - __ cmpdi(CCR0, R3_RET, 0); - __ beq(CCR0, skip_unboxing); - __ ld(R3_RET, 0, R3_RET); - __ bind(skip_unboxing); - __ verify_oop(R3_RET); + __ resolve_jobject(R3_RET, r_temp_1, r_temp_2, /* needs_frame */ false); // kills R31 } if (CheckJNICalls) { diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp --- a/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2015, 2016 SAP SE. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017 SAP SE. 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 @@ -401,11 +401,8 @@ case T_LONG: break; case T_OBJECT: - // unbox result if not null - __ cmpdi(CCR0, R3_RET, 0); - __ beq(CCR0, done); - __ ld(R3_RET, 0, R3_RET); - __ verify_oop(R3_RET); + // JNIHandles::resolve result. + __ resolve_jobject(R3_RET, R11_scratch1, R12_scratch2, /* needs_frame */ true); // kills R31 break; case T_FLOAT: break; diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/s390/vm/macroAssembler_s390.cpp --- a/hotspot/src/cpu/s390/vm/macroAssembler_s390.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/s390/vm/macroAssembler_s390.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -3439,6 +3439,34 @@ z_mvi(0, store_addr, 0); // Store byte 0. } +void MacroAssembler::resolve_jobject(Register value, Register tmp1, Register tmp2) { + NearLabel Ldone; + z_ltgr(tmp1, value); + z_bre(Ldone); // Use NULL result as-is. + + z_nill(value, ~JNIHandles::weak_tag_mask); + z_lg(value, 0, value); // Resolve (untagged) jobject. + +#if INCLUDE_ALL_GCS + if (UseG1GC) { + NearLabel Lnot_weak; + z_tmll(tmp1, JNIHandles::weak_tag_mask); // Test for jweak tag. + z_braz(Lnot_weak); + verify_oop(value); + g1_write_barrier_pre(noreg /* obj */, + noreg /* offset */, + value /* pre_val */, + noreg /* val */, + tmp1 /* tmp1 */, + tmp2 /* tmp2 */, + true /* pre_val_needed */); + bind(Lnot_weak); + } +#endif // INCLUDE_ALL_GCS + verify_oop(value); + bind(Ldone); +} + #if INCLUDE_ALL_GCS //------------------------------------------------------ diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/s390/vm/macroAssembler_s390.hpp --- a/hotspot/src/cpu/s390/vm/macroAssembler_s390.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/s390/vm/macroAssembler_s390.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -726,6 +726,8 @@ // Write to card table for modification at store_addr - register is destroyed afterwards. void card_write_barrier_post(Register store_addr, Register tmp); + void resolve_jobject(Register value, Register tmp1, Register tmp2); + #if INCLUDE_ALL_GCS // General G1 pre-barrier generator. // Purpose: record the previous value if it is not null. diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp --- a/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2016 SAP SE. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017 SAP SE. 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 @@ -2272,13 +2272,9 @@ __ reset_last_Java_frame(); - // Unpack oop result + // Unpack oop result, e.g. JNIHandles::resolve result. if (ret_type == T_OBJECT || ret_type == T_ARRAY) { - NearLabel L; - __ compare64_and_branch(Z_RET, (RegisterOrConstant)0L, Assembler::bcondEqual, L); - __ z_lg(Z_RET, 0, Z_RET); - __ bind(L); - __ verify_oop(Z_RET); + __ resolve_jobject(Z_RET, /* tmp1 */ Z_R13, /* tmp2 */ Z_R7); } if (CheckJNICalls) { diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp --- a/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2016 SAP SE. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017 SAP SE. 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 @@ -1695,14 +1695,11 @@ // from the jni handle to z_ijava_state.oop_temp. This is // necessary, because we reset the jni handle block below. // NOTE: frame::interpreter_frame_result() depends on this, too. - { NearLabel no_oop_result, store_oop_result; + { NearLabel no_oop_result; __ load_absolute_address(Z_R1, AbstractInterpreter::result_handler(T_OBJECT)); __ compareU64_and_branch(Z_R1, Rresult_handler, Assembler::bcondNotEqual, no_oop_result); - __ compareU64_and_branch(Rlresult, (intptr_t)0L, Assembler::bcondEqual, store_oop_result); - __ z_lg(Rlresult, 0, Rlresult); // unbox - __ bind(store_oop_result); + __ resolve_jobject(Rlresult, /* tmp1 */ Rmethod, /* tmp2 */ Z_R1); __ z_stg(Rlresult, oop_tmp_offset, Z_fp); - __ verify_oop(Rlresult); __ bind(no_oop_result); } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/sparc/vm/jniFastGetField_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/jniFastGetField_sparc.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/sparc/vm/jniFastGetField_sparc.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -68,6 +68,7 @@ __ andcc (G4, 1, G0); __ br (Assembler::notZero, false, Assembler::pn, label1); __ delayed()->srl (O2, 2, O4); + __ andn (O1, JNIHandles::weak_tag_mask, O1); __ ld_ptr (O1, 0, O5); assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); @@ -147,6 +148,7 @@ __ andcc (G4, 1, G0); __ br (Assembler::notZero, false, Assembler::pn, label1); __ delayed()->srl (O2, 2, O4); + __ andn (O1, JNIHandles::weak_tag_mask, O1); __ ld_ptr (O1, 0, O5); __ add (O5, O4, O5); @@ -219,6 +221,7 @@ __ andcc (G4, 1, G0); __ br (Assembler::notZero, false, Assembler::pn, label1); __ delayed()->srl (O2, 2, O4); + __ andn (O1, JNIHandles::weak_tag_mask, O1); __ ld_ptr (O1, 0, O5); assert(count < LIST_CAPACITY, "LIST_CAPACITY too small"); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2754,15 +2754,30 @@ __ verify_thread(); // G2_thread must be correct __ reset_last_Java_frame(); - // Unpack oop result + // Unbox oop result, e.g. JNIHandles::resolve value in I0. if (ret_type == T_OBJECT || ret_type == T_ARRAY) { - Label L; - __ addcc(G0, I0, G0); - __ brx(Assembler::notZero, true, Assembler::pt, L); - __ delayed()->ld_ptr(I0, 0, I0); - __ mov(G0, I0); - __ bind(L); - __ verify_oop(I0); + Label done, not_weak; + __ br_null(I0, false, Assembler::pn, done); // Use NULL as-is. + __ delayed()->andcc(I0, JNIHandles::weak_tag_mask, G0); // Test for jweak + __ brx(Assembler::zero, true, Assembler::pt, not_weak); + __ delayed()->ld_ptr(I0, 0, I0); // Maybe resolve (untagged) jobject. + // Resolve jweak. + __ ld_ptr(I0, -JNIHandles::weak_tag_value, I0); +#if INCLUDE_ALL_GCS + if (UseG1GC) { + // Copy to O0 because macro doesn't allow pre_val in input reg. + __ mov(I0, O0); + __ g1_write_barrier_pre(noreg /* obj */, + noreg /* index */, + 0 /* offset */, + O0 /* pre_val */, + G3_scratch /* tmp */, + true /* preserve_o_regs */); + } +#endif // INCLUDE_ALL_GCS + __ bind(not_weak); + __ verify_oop(I0); + __ bind(done); } if (CheckJNICalls) { diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/sparc/vm/templateInterpreterGenerator_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/templateInterpreterGenerator_sparc.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/sparc/vm/templateInterpreterGenerator_sparc.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1516,11 +1516,23 @@ __ set((intptr_t)AbstractInterpreter::result_handler(T_OBJECT), G3_scratch); __ cmp_and_brx_short(G3_scratch, Lscratch, Assembler::notEqual, Assembler::pt, no_oop); - __ addcc(G0, O0, O0); - __ brx(Assembler::notZero, true, Assembler::pt, store_result); // if result is not NULL: - __ delayed()->ld_ptr(O0, 0, O0); // unbox it - __ mov(G0, O0); - + // Unbox oop result, e.g. JNIHandles::resolve value in O0. + __ br_null(O0, false, Assembler::pn, store_result); // Use NULL as-is. + __ delayed()->andcc(O0, JNIHandles::weak_tag_mask, G0); // Test for jweak + __ brx(Assembler::zero, true, Assembler::pt, store_result); + __ delayed()->ld_ptr(O0, 0, O0); // Maybe resolve (untagged) jobject. + // Resolve jweak. + __ ld_ptr(O0, -JNIHandles::weak_tag_value, O0); +#if INCLUDE_ALL_GCS + if (UseG1GC) { + __ g1_write_barrier_pre(noreg /* obj */, + noreg /* index */, + 0 /* offset */, + O0 /* pre_val */, + G3_scratch /* tmp */, + true /* preserve_o_regs */); + } +#endif // INCLUDE_ALL_GCS __ bind(store_result); // Store it where gc will look for it and result handler expects it. __ st_ptr(O0, FP, (frame::interpreter_frame_oop_temp_offset*wordSize) + STACK_BIAS); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/x86/vm/jniFastGetField_x86_32.cpp --- a/hotspot/src/cpu/x86/vm/jniFastGetField_x86_32.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/x86/vm/jniFastGetField_x86_32.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -85,6 +85,9 @@ __ movptr (rdx, Address(rsp, 2*wordSize)); // obj } __ movptr(rax, Address(rsp, 3*wordSize)); // jfieldID + + __ clear_jweak_tag(rdx); + __ movptr(rdx, Address(rdx, 0)); // *obj __ shrptr (rax, 2); // offset @@ -202,6 +205,9 @@ __ movptr(rdx, Address(rsp, 3*wordSize)); // obj } __ movptr(rsi, Address(rsp, 4*wordSize)); // jfieldID + + __ clear_jweak_tag(rdx); + __ movptr(rdx, Address(rdx, 0)); // *obj __ shrptr(rsi, 2); // offset @@ -291,6 +297,9 @@ __ movptr(rdx, Address(rsp, 2*wordSize)); // obj } __ movptr(rax, Address(rsp, 3*wordSize)); // jfieldID + + __ clear_jweak_tag(rdx); + __ movptr(rdx, Address(rdx, 0)); // *obj __ shrptr(rax, 2); // offset diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/x86/vm/jniFastGetField_x86_64.cpp --- a/hotspot/src/cpu/x86/vm/jniFastGetField_x86_64.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/x86/vm/jniFastGetField_x86_64.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -80,6 +80,9 @@ // robj ^ rcounter ^ rcounter == robj // robj is data dependent on rcounter. } + + __ clear_jweak_tag(robj); + __ movptr(robj, Address(robj, 0)); // *obj __ mov (roffset, c_rarg2); __ shrptr(roffset, 2); // offset @@ -178,6 +181,9 @@ // robj ^ rcounter ^ rcounter == robj // robj is data dependent on rcounter. } + + __ clear_jweak_tag(robj); + __ movptr(robj, Address(robj, 0)); // *obj __ mov (roffset, c_rarg2); __ shrptr(roffset, 2); // offset diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp --- a/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -5129,6 +5129,43 @@ } +void MacroAssembler::resolve_jobject(Register value, + Register thread, + Register tmp) { + assert_different_registers(value, thread, tmp); + Label done, not_weak; + testptr(value, value); + jcc(Assembler::zero, done); // Use NULL as-is. + testptr(value, JNIHandles::weak_tag_mask); // Test for jweak tag. + jcc(Assembler::zero, not_weak); + // Resolve jweak. + movptr(value, Address(value, -JNIHandles::weak_tag_value)); + verify_oop(value); +#if INCLUDE_ALL_GCS + if (UseG1GC) { + g1_write_barrier_pre(noreg /* obj */, + value /* pre_val */, + thread /* thread */, + tmp /* tmp */, + true /* tosca_live */, + true /* expand_call */); + } +#endif // INCLUDE_ALL_GCS + jmp(done); + bind(not_weak); + // Resolve (untagged) jobject. + movptr(value, Address(value, 0)); + verify_oop(value); + bind(done); +} + +void MacroAssembler::clear_jweak_tag(Register possibly_jweak) { + const int32_t inverted_jweak_mask = ~static_cast(JNIHandles::weak_tag_mask); + STATIC_ASSERT(inverted_jweak_mask == -2); // otherwise check this code + // The inverted mask is sign-extended + andptr(possibly_jweak, inverted_jweak_mask); +} + ////////////////////////////////////////////////////////////////////////////////// #if INCLUDE_ALL_GCS diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp --- a/hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -297,6 +297,9 @@ void store_check(Register obj); // store check for obj - register is destroyed afterwards void store_check(Register obj, Address dst); // same as above, dst is exact store location (reg. is destroyed) + void resolve_jobject(Register value, Register thread, Register tmp); + void clear_jweak_tag(Register possibly_jweak); + #if INCLUDE_ALL_GCS void g1_write_barrier_pre(Register obj, diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2226,14 +2226,11 @@ __ reset_last_Java_frame(thread, false); - // Unpack oop result + // Unbox oop result, e.g. JNIHandles::resolve value. if (ret_type == T_OBJECT || ret_type == T_ARRAY) { - Label L; - __ cmpptr(rax, (int32_t)NULL_WORD); - __ jcc(Assembler::equal, L); - __ movptr(rax, Address(rax, 0)); - __ bind(L); - __ verify_oop(rax); + __ resolve_jobject(rax /* value */, + thread /* thread */, + rcx /* tmp */); } if (CheckJNICalls) { diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2579,14 +2579,11 @@ __ reset_last_Java_frame(false); - // Unpack oop result + // Unbox oop result, e.g. JNIHandles::resolve value. if (ret_type == T_OBJECT || ret_type == T_ARRAY) { - Label L; - __ testptr(rax, rax); - __ jcc(Assembler::zero, L); - __ movptr(rax, Address(rax, 0)); - __ bind(L); - __ verify_oop(rax); + __ resolve_jobject(rax /* value */, + r15_thread /* thread */, + rcx /* tmp */); } if (CheckJNICalls) { diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/x86/vm/templateInterpreterGenerator_x86.cpp --- a/hotspot/src/cpu/x86/vm/templateInterpreterGenerator_x86.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/x86/vm/templateInterpreterGenerator_x86.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1193,16 +1193,16 @@ // and result handler will pick it up { - Label no_oop, store_result; + Label no_oop, not_weak, store_result; __ lea(t, ExternalAddress(AbstractInterpreter::result_handler(T_OBJECT))); __ cmpptr(t, Address(rbp, frame::interpreter_frame_result_handler_offset*wordSize)); __ jcc(Assembler::notEqual, no_oop); // retrieve result __ pop(ltos); - __ testptr(rax, rax); - __ jcc(Assembler::zero, store_result); - __ movptr(rax, Address(rax, 0)); - __ bind(store_result); + // Unbox oop result, e.g. JNIHandles::resolve value. + __ resolve_jobject(rax /* value */, + thread /* thread */, + t /* tmp */); __ movptr(Address(rbp, frame::interpreter_frame_oop_temp_offset*wordSize), rax); // keep stack depth as expected by pushing oop which will eventually be discarded __ push(ltos); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp --- a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright 2007, 2008, 2009, 2010, 2011 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -406,10 +406,12 @@ // oop_temp where the garbage collector can see it before // we release the handle it might be protected by. if (handler->result_type() == &ffi_type_pointer) { - if (result[0]) - istate->set_oop_temp(*(oop *) result[0]); - else + if (result[0] == 0) { istate->set_oop_temp(NULL); + } else { + jobject handle = reinterpret_cast(result[0]); + istate->set_oop_temp(JNIHandles::resolve(handle)); + } } // Reset handle block diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/Xusage.txt --- a/hotspot/src/share/vm/Xusage.txt Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/Xusage.txt Wed Jul 05 23:09:40 2017 +0200 @@ -12,7 +12,7 @@ -Xms set initial Java heap size -Xmx set maximum Java heap size -Xss set java thread stack size - -Xprof output cpu profiling data + -Xprof output cpu profiling data (deprecated) -Xfuture enable strictest checks, anticipating future default -Xrs reduce use of OS signals by Java/VM (see documentation) -Xcheck:jni perform additional checks for JNI functions diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/c1/c1_GraphBuilder.cpp --- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1540,7 +1540,7 @@ ciMethod* caller = state()->scope()->method(); ciMethodData* md = caller->method_data_or_null(); ciProfileData* data = md->bci_to_data(invoke_bci); - if (data->is_CallTypeData() || data->is_VirtualCallTypeData()) { + if (data != NULL && (data->is_CallTypeData() || data->is_VirtualCallTypeData())) { bool has_return = data->is_CallTypeData() ? ((ciCallTypeData*)data)->has_return() : ((ciVirtualCallTypeData*)data)->has_return(); // May not be true in case of an inlined call through a method handle intrinsic. if (has_return) { @@ -1758,7 +1758,7 @@ start = has_receiver ? 1 : 0; if (profile_arguments()) { ciProfileData* data = method()->method_data()->bci_to_data(bci()); - if (data->is_CallTypeData() || data->is_VirtualCallTypeData()) { + if (data != NULL && (data->is_CallTypeData() || data->is_VirtualCallTypeData())) { n = data->is_CallTypeData() ? data->as_CallTypeData()->number_of_arguments() : data->as_VirtualCallTypeData()->number_of_arguments(); } } @@ -4349,7 +4349,7 @@ } ciMethodData* md = m->method_data_or_null(); ciProfileData* data = md->bci_to_data(invoke_bci); - if (data->is_CallTypeData() || data->is_VirtualCallTypeData()) { + if (data != NULL && (data->is_CallTypeData() || data->is_VirtualCallTypeData())) { append(new ProfileReturnType(m , invoke_bci, callee, ret)); } } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/c1/c1_LIRGenerator.cpp --- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -3262,50 +3262,52 @@ int bci = x->bci_of_invoke(); ciMethodData* md = x->method()->method_data_or_null(); ciProfileData* data = md->bci_to_data(bci); - if ((data->is_CallTypeData() && data->as_CallTypeData()->has_arguments()) || - (data->is_VirtualCallTypeData() && data->as_VirtualCallTypeData()->has_arguments())) { - ByteSize extra = data->is_CallTypeData() ? CallTypeData::args_data_offset() : VirtualCallTypeData::args_data_offset(); - int base_offset = md->byte_offset_of_slot(data, extra); - LIR_Opr mdp = LIR_OprFact::illegalOpr; - ciTypeStackSlotEntries* args = data->is_CallTypeData() ? ((ciCallTypeData*)data)->args() : ((ciVirtualCallTypeData*)data)->args(); - - Bytecodes::Code bc = x->method()->java_code_at_bci(bci); - int start = 0; - int stop = data->is_CallTypeData() ? ((ciCallTypeData*)data)->number_of_arguments() : ((ciVirtualCallTypeData*)data)->number_of_arguments(); - if (x->callee()->is_loaded() && x->callee()->is_static() && Bytecodes::has_receiver(bc)) { - // first argument is not profiled at call (method handle invoke) - assert(x->method()->raw_code_at_bci(bci) == Bytecodes::_invokehandle, "invokehandle expected"); - start = 1; + if (data != NULL) { + if ((data->is_CallTypeData() && data->as_CallTypeData()->has_arguments()) || + (data->is_VirtualCallTypeData() && data->as_VirtualCallTypeData()->has_arguments())) { + ByteSize extra = data->is_CallTypeData() ? CallTypeData::args_data_offset() : VirtualCallTypeData::args_data_offset(); + int base_offset = md->byte_offset_of_slot(data, extra); + LIR_Opr mdp = LIR_OprFact::illegalOpr; + ciTypeStackSlotEntries* args = data->is_CallTypeData() ? ((ciCallTypeData*)data)->args() : ((ciVirtualCallTypeData*)data)->args(); + + Bytecodes::Code bc = x->method()->java_code_at_bci(bci); + int start = 0; + int stop = data->is_CallTypeData() ? ((ciCallTypeData*)data)->number_of_arguments() : ((ciVirtualCallTypeData*)data)->number_of_arguments(); + if (x->callee()->is_loaded() && x->callee()->is_static() && Bytecodes::has_receiver(bc)) { + // first argument is not profiled at call (method handle invoke) + assert(x->method()->raw_code_at_bci(bci) == Bytecodes::_invokehandle, "invokehandle expected"); + start = 1; + } + ciSignature* callee_signature = x->callee()->signature(); + // method handle call to virtual method + bool has_receiver = x->callee()->is_loaded() && !x->callee()->is_static() && !Bytecodes::has_receiver(bc); + ciSignatureStream callee_signature_stream(callee_signature, has_receiver ? x->callee()->holder() : NULL); + + bool ignored_will_link; + ciSignature* signature_at_call = NULL; + x->method()->get_method_at_bci(bci, ignored_will_link, &signature_at_call); + ciSignatureStream signature_at_call_stream(signature_at_call); + + // if called through method handle invoke, some arguments may have been popped + for (int i = 0; i < stop && i+start < x->nb_profiled_args(); i++) { + int off = in_bytes(TypeEntriesAtCall::argument_type_offset(i)) - in_bytes(TypeEntriesAtCall::args_data_offset()); + ciKlass* exact = profile_type(md, base_offset, off, + args->type(i), x->profiled_arg_at(i+start), mdp, + !x->arg_needs_null_check(i+start), + signature_at_call_stream.next_klass(), callee_signature_stream.next_klass()); + if (exact != NULL) { + md->set_argument_type(bci, i, exact); + } + } + } else { +#ifdef ASSERT + Bytecodes::Code code = x->method()->raw_code_at_bci(x->bci_of_invoke()); + int n = x->nb_profiled_args(); + assert(MethodData::profile_parameters() && (MethodData::profile_arguments_jsr292_only() || + (x->inlined() && ((code == Bytecodes::_invokedynamic && n <= 1) || (code == Bytecodes::_invokehandle && n <= 2)))), + "only at JSR292 bytecodes"); +#endif } - ciSignature* callee_signature = x->callee()->signature(); - // method handle call to virtual method - bool has_receiver = x->callee()->is_loaded() && !x->callee()->is_static() && !Bytecodes::has_receiver(bc); - ciSignatureStream callee_signature_stream(callee_signature, has_receiver ? x->callee()->holder() : NULL); - - bool ignored_will_link; - ciSignature* signature_at_call = NULL; - x->method()->get_method_at_bci(bci, ignored_will_link, &signature_at_call); - ciSignatureStream signature_at_call_stream(signature_at_call); - - // if called through method handle invoke, some arguments may have been popped - for (int i = 0; i < stop && i+start < x->nb_profiled_args(); i++) { - int off = in_bytes(TypeEntriesAtCall::argument_type_offset(i)) - in_bytes(TypeEntriesAtCall::args_data_offset()); - ciKlass* exact = profile_type(md, base_offset, off, - args->type(i), x->profiled_arg_at(i+start), mdp, - !x->arg_needs_null_check(i+start), - signature_at_call_stream.next_klass(), callee_signature_stream.next_klass()); - if (exact != NULL) { - md->set_argument_type(bci, i, exact); - } - } - } else { -#ifdef ASSERT - Bytecodes::Code code = x->method()->raw_code_at_bci(x->bci_of_invoke()); - int n = x->nb_profiled_args(); - assert(MethodData::profile_parameters() && (MethodData::profile_arguments_jsr292_only() || - (x->inlined() && ((code == Bytecodes::_invokedynamic && n <= 1) || (code == Bytecodes::_invokehandle && n <= 2)))), - "only at JSR292 bytecodes"); -#endif } } } @@ -3396,24 +3398,26 @@ int bci = x->bci_of_invoke(); ciMethodData* md = x->method()->method_data_or_null(); ciProfileData* data = md->bci_to_data(bci); - assert(data->is_CallTypeData() || data->is_VirtualCallTypeData(), "wrong profile data type"); - ciReturnTypeEntry* ret = data->is_CallTypeData() ? ((ciCallTypeData*)data)->ret() : ((ciVirtualCallTypeData*)data)->ret(); - LIR_Opr mdp = LIR_OprFact::illegalOpr; - - bool ignored_will_link; - ciSignature* signature_at_call = NULL; - x->method()->get_method_at_bci(bci, ignored_will_link, &signature_at_call); - - // The offset within the MDO of the entry to update may be too large - // to be used in load/store instructions on some platforms. So have - // profile_type() compute the address of the profile in a register. - ciKlass* exact = profile_type(md, md->byte_offset_of_slot(data, ret->type_offset()), 0, - ret->type(), x->ret(), mdp, - !x->needs_null_check(), - signature_at_call->return_type()->as_klass(), - x->callee()->signature()->return_type()->as_klass()); - if (exact != NULL) { - md->set_return_type(bci, exact); + if (data != NULL) { + assert(data->is_CallTypeData() || data->is_VirtualCallTypeData(), "wrong profile data type"); + ciReturnTypeEntry* ret = data->is_CallTypeData() ? ((ciCallTypeData*)data)->ret() : ((ciVirtualCallTypeData*)data)->ret(); + LIR_Opr mdp = LIR_OprFact::illegalOpr; + + bool ignored_will_link; + ciSignature* signature_at_call = NULL; + x->method()->get_method_at_bci(bci, ignored_will_link, &signature_at_call); + + // The offset within the MDO of the entry to update may be too large + // to be used in load/store instructions on some platforms. So have + // profile_type() compute the address of the profile in a register. + ciKlass* exact = profile_type(md, md->byte_offset_of_slot(data, ret->type_offset()), 0, + ret->type(), x->ret(), mdp, + !x->needs_null_check(), + signature_at_call->return_type()->as_klass(), + x->callee()->signature()->return_type()->as_klass()); + if (exact != NULL) { + md->set_return_type(bci, exact); + } } } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/ci/ciMethodData.cpp --- a/hotspot/src/share/vm/ci/ciMethodData.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/ci/ciMethodData.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -408,11 +408,13 @@ MethodData* mdo = get_MethodData(); if (mdo != NULL) { ProfileData* data = mdo->bci_to_data(bci); - if (data->is_CallTypeData()) { - data->as_CallTypeData()->set_argument_type(i, k->get_Klass()); - } else { - assert(data->is_VirtualCallTypeData(), "no arguments!"); - data->as_VirtualCallTypeData()->set_argument_type(i, k->get_Klass()); + if (data != NULL) { + if (data->is_CallTypeData()) { + data->as_CallTypeData()->set_argument_type(i, k->get_Klass()); + } else { + assert(data->is_VirtualCallTypeData(), "no arguments!"); + data->as_VirtualCallTypeData()->set_argument_type(i, k->get_Klass()); + } } } } @@ -430,11 +432,13 @@ MethodData* mdo = get_MethodData(); if (mdo != NULL) { ProfileData* data = mdo->bci_to_data(bci); - if (data->is_CallTypeData()) { - data->as_CallTypeData()->set_return_type(k->get_Klass()); - } else { - assert(data->is_VirtualCallTypeData(), "no arguments!"); - data->as_VirtualCallTypeData()->set_return_type(k->get_Klass()); + if (data != NULL) { + if (data->is_CallTypeData()) { + data->as_CallTypeData()->set_return_type(k->get_Klass()); + } else { + assert(data->is_VirtualCallTypeData(), "no arguments!"); + data->as_VirtualCallTypeData()->set_return_type(k->get_Klass()); + } } } } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/classfile/classFileParser.cpp --- a/hotspot/src/share/vm/classfile/classFileParser.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -105,6 +105,12 @@ #define JAVA_9_VERSION 53 +void ClassFileParser::set_class_bad_constant_seen(short bad_constant) { + assert((bad_constant == 19 || bad_constant == 20) && _major_version >= JAVA_9_VERSION, + "Unexpected bad constant pool entry"); + if (_bad_constant_seen == 0) _bad_constant_seen = bad_constant; +} + void ClassFileParser::parse_constant_pool_entries(const ClassFileStream* const stream, ConstantPool* cp, const int length, @@ -302,6 +308,18 @@ } break; } + case 19: + case 20: { + // Record that an error occurred in these two cases but keep parsing so + // that ACC_Module can be checked for in the access_flags. Need to + // throw NoClassDefFoundError in that case. + if (_major_version >= JAVA_9_VERSION) { + cfs->guarantee_more(3, CHECK); + cfs->get_u2_fast(); + set_class_bad_constant_seen(tag); + break; + } + } default: { classfile_parse_error("Unknown constant tag %u in class file %s", tag, @@ -359,14 +377,18 @@ #endif void ClassFileParser::parse_constant_pool(const ClassFileStream* const stream, - ConstantPool* const cp, - const int length, - TRAPS) { + ConstantPool* const cp, + const int length, + TRAPS) { assert(cp != NULL, "invariant"); assert(stream != NULL, "invariant"); // parsing constant pool entries parse_constant_pool_entries(stream, cp, length, CHECK); + if (class_bad_constant_seen() != 0) { + // a bad CP entry has been detected previously so stop parsing and just return. + return; + } int index = 1; // declared outside of loops for portability @@ -1244,6 +1266,10 @@ } } else if (_major_version >= JAVA_1_5_VERSION) { if (attribute_name == vmSymbols::tag_signature()) { + if (generic_signature_index != 0) { + classfile_parse_error( + "Multiple Signature attributes for field in class file %s", CHECK); + } if (attribute_length != 2) { classfile_parse_error( "Wrong size %u for field's Signature attribute in class file %s", @@ -2565,6 +2591,11 @@ } } else if (_major_version >= JAVA_1_5_VERSION) { if (method_attribute_name == vmSymbols::tag_signature()) { + if (generic_signature_index != 0) { + classfile_parse_error( + "Multiple Signature attributes for method in class file %s", + CHECK_NULL); + } if (method_attribute_length != 2) { classfile_parse_error( "Invalid Signature attribute length %u in class file %s", @@ -3284,6 +3315,10 @@ } } else if (_major_version >= JAVA_1_5_VERSION) { if (tag == vmSymbols::tag_signature()) { + if (_generic_signature_index != 0) { + classfile_parse_error( + "Multiple Signature attributes in class file %s", CHECK); + } if (attribute_length != 2) { classfile_parse_error( "Wrong Signature attribute length %u in class file %s", @@ -5558,6 +5593,7 @@ _protection_domain(protection_domain), _access_flags(), _pub_level(pub_level), + _bad_constant_seen(0), _synthetic_flag(false), _sde_length(false), _sde_buffer(NULL), @@ -5765,9 +5801,15 @@ verify_legal_class_modifiers(flags, CHECK); + short bad_constant = class_bad_constant_seen(); + if (bad_constant != 0) { + // Do not throw CFE until after the access_flags are checked because if + // ACC_MODULE is set in the access flags, then NCDFE must be thrown, not CFE. + classfile_parse_error("Unknown constant tag %u in class file %s", bad_constant, CHECK); + } + _access_flags.set_flags(flags); - // This class and superclass _this_class_index = stream->get_u2_fast(); check_property( diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/classfile/classFileParser.hpp --- a/hotspot/src/share/vm/classfile/classFileParser.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/classfile/classFileParser.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -122,6 +122,15 @@ // for tracing and notifications Publicity _pub_level; + // Used to keep track of whether a constant pool item 19 or 20 is found. These + // correspond to CONSTANT_Module and CONSTANT_Package tags and are not allowed + // in regular class files. For class file version >= 53, a CFE cannot be thrown + // immediately when these are seen because a NCDFE must be thrown if the class's + // access_flags have ACC_MODULE set. But, the access_flags haven't been looked + // at yet. So, the bad constant pool item is cached here. A value of zero + // means that no constant pool item 19 or 20 was found. + short _bad_constant_seen; + // class attributes parsed before the instance klass is created: bool _synthetic_flag; int _sde_length; @@ -161,6 +170,8 @@ void fill_instance_klass(InstanceKlass* ik, bool cf_changed_in_CFLH, TRAPS); void set_klass(InstanceKlass* instance); + void set_class_bad_constant_seen(short bad_constant); + short class_bad_constant_seen() { return _bad_constant_seen; } void set_class_synthetic_flag(bool x) { _synthetic_flag = x; } void set_class_sourcefile_index(u2 x) { _sourcefile_index = x; } void set_class_generic_signature_index(u2 x) { _generic_signature_index = x; } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/classfile/moduleEntry.hpp --- a/hotspot/src/share/vm/classfile/moduleEntry.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/classfile/moduleEntry.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,8 +36,8 @@ #include "utilities/ostream.hpp" #define UNNAMED_MODULE "Unnamed Module" -#define JAVAPKG "java/" -#define JAVAPKG_LEN 5 +#define JAVAPKG "java" +#define JAVAPKG_LEN 4 #define JAVA_BASE_NAME "java.base" class ModuleClosure; diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/classfile/modules.cpp --- a/hotspot/src/share/vm/classfile/modules.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/classfile/modules.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -325,7 +325,8 @@ // Only modules defined to either the boot or platform class loader, can define a "java/" package. if (!h_loader.is_null() && !SystemDictionary::is_platform_class_loader(h_loader) && - strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0) { + (strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0 && + (package_name[JAVAPKG_LEN] == '/' || package_name[JAVAPKG_LEN] == '\0'))) { const char* class_loader_name = SystemDictionary::loader_name(h_loader()); size_t pkg_len = strlen(package_name); char* pkg_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, pkg_len); @@ -748,7 +749,8 @@ // Only modules defined to either the boot or platform class loader, can define a "java/" package. if (!loader_data->is_the_null_class_loader_data() && !loader_data->is_platform_class_loader_data() && - strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0) { + (strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0 && + (package_name[JAVAPKG_LEN] == '/' || package_name[JAVAPKG_LEN] == '\0'))) { const char* class_loader_name = SystemDictionary::loader_name(loader_data); size_t pkg_len = strlen(package_name); char* pkg_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, pkg_len); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/classfile/stringTable.cpp --- a/hotspot/src/share/vm/classfile/stringTable.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/classfile/stringTable.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -96,10 +96,14 @@ // Pick hashing algorithm unsigned int StringTable::hash_string(const jchar* s, int len) { - return use_alternate_hashcode() ? AltHashing::murmur3_32(seed(), s, len) : + return use_alternate_hashcode() ? alt_hash_string(s, len) : java_lang_String::hash_code(s, len); } +unsigned int StringTable::alt_hash_string(const jchar* s, int len) { + return AltHashing::murmur3_32(seed(), s, len); +} + unsigned int StringTable::hash_string(oop string) { EXCEPTION_MARK; if (string == NULL) { @@ -117,11 +121,10 @@ } } -oop StringTable::lookup_shared(jchar* name, int len) { - // java_lang_String::hash_code() was used to compute hash values in the shared table. Don't - // use the hash value from StringTable::hash_string() as it might use alternate hashcode. - return _shared_table.lookup((const char*)name, - java_lang_String::hash_code(name, len), len); +oop StringTable::lookup_shared(jchar* name, int len, unsigned int hash) { + assert(hash == java_lang_String::hash_code(name, len), + "hash must be computed using java_lang_String::hash_code"); + return _shared_table.lookup((const char*)name, hash, len); } oop StringTable::lookup_in_main_table(int index, jchar* name, @@ -156,7 +159,7 @@ unsigned int hashValue; int index; if (use_alternate_hashcode()) { - hashValue = hash_string(name, len); + hashValue = alt_hash_string(name, len); index = hash_to_index(hashValue); } else { hashValue = hashValue_arg; @@ -199,12 +202,15 @@ } oop StringTable::lookup(jchar* name, int len) { - oop string = lookup_shared(name, len); + // shared table always uses java_lang_String::hash_code + unsigned int hash = java_lang_String::hash_code(name, len); + oop string = lookup_shared(name, len, hash); if (string != NULL) { return string; } - - unsigned int hash = hash_string(name, len); + if (use_alternate_hashcode()) { + hash = alt_hash_string(name, len); + } int index = the_table()->hash_to_index(hash); string = the_table()->lookup_in_main_table(index, name, len, hash); @@ -215,12 +221,15 @@ oop StringTable::intern(Handle string_or_null, jchar* name, int len, TRAPS) { - oop found_string = lookup_shared(name, len); + // shared table always uses java_lang_String::hash_code + unsigned int hashValue = java_lang_String::hash_code(name, len); + oop found_string = lookup_shared(name, len, hashValue); if (found_string != NULL) { return found_string; } - - unsigned int hashValue = hash_string(name, len); + if (use_alternate_hashcode()) { + hashValue = alt_hash_string(name, len); + } int index = the_table()->hash_to_index(hashValue); found_string = the_table()->lookup_in_main_table(index, name, len, hashValue); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/classfile/stringTable.hpp --- a/hotspot/src/share/vm/classfile/stringTable.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/classfile/stringTable.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ unsigned int hashValue, TRAPS); oop lookup_in_main_table(int index, jchar* chars, int length, unsigned int hashValue); - static oop lookup_shared(jchar* name, int len); + static oop lookup_shared(jchar* name, int len, unsigned int hash); // Apply the give oop closure to the entries to the buckets // in the range [start_idx, end_idx). @@ -65,6 +65,13 @@ // in the range [start_idx, end_idx). static void buckets_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int start_idx, int end_idx, int* processed, int* removed); + // Hashing algorithm, used as the hash value used by the + // StringTable for bucket selection and comparison (stored in the + // HashtableEntry structures). This is used in the String.intern() method. + static unsigned int hash_string(const jchar* s, int len); + static unsigned int hash_string(oop string); + static unsigned int alt_hash_string(const jchar* s, int len); + StringTable() : RehashableHashtable((int)StringTableSize, sizeof (HashtableEntry)) {} @@ -109,12 +116,6 @@ } static void possibly_parallel_oops_do(OopClosure* f); - // Hashing algorithm, used as the hash value used by the - // StringTable for bucket selection and comparison (stored in the - // HashtableEntry structures). This is used in the String.intern() method. - static unsigned int hash_string(const jchar* s, int len); - static unsigned int hash_string(oop string); - // Internal test. static void test_alt_hash() PRODUCT_RETURN; diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/classfile/vmSymbols.hpp --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -561,6 +561,7 @@ template(int_StringBuffer_signature, "(I)Ljava/lang/StringBuffer;") \ template(char_StringBuffer_signature, "(C)Ljava/lang/StringBuffer;") \ template(int_String_signature, "(I)Ljava/lang/String;") \ + template(boolean_boolean_int_signature, "(ZZ)I") \ template(codesource_permissioncollection_signature, "(Ljava/security/CodeSource;Ljava/security/PermissionCollection;)V") \ /* signature symbols needed by intrinsics */ \ VM_INTRINSICS_DO(VM_INTRINSIC_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, template, VM_ALIAS_IGNORE) \ diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/compiler/compilerDefinitions.cpp --- a/hotspot/src/share/vm/compiler/compilerDefinitions.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/compiler/compilerDefinitions.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -100,7 +100,9 @@ FLAG_SET_ERGO(size_t, MetaspaceSize, 12*M); } if (FLAG_IS_DEFAULT(MaxRAM)) { - FLAG_SET_ERGO(uint64_t, MaxRAM, 1ULL*G); + // Do not use FLAG_SET_ERGO to update MaxRAM, as this will impact + // heap setting done based on available phys_mem (see Arguments::set_heap_size). + FLAG_SET_DEFAULT(MaxRAM, 1ULL*G); } if (FLAG_IS_DEFAULT(CompileThreshold)) { FLAG_SET_ERGO(intx, CompileThreshold, 1500); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/oops/instanceKlass.cpp --- a/hotspot/src/share/vm/oops/instanceKlass.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -2456,22 +2456,24 @@ void InstanceKlass::check_prohibited_package(Symbol* class_name, Handle class_loader, TRAPS) { - ResourceMark rm(THREAD); if (!class_loader.is_null() && !SystemDictionary::is_platform_class_loader(class_loader) && - class_name != NULL && - strncmp(class_name->as_C_string(), JAVAPKG, JAVAPKG_LEN) == 0) { - TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK); - assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'"); - char* name = pkg_name->as_C_string(); - const char* class_loader_name = SystemDictionary::loader_name(class_loader()); - StringUtils::replace_no_expand(name, "/", "."); - const char* msg_text1 = "Class loader (instance of): "; - const char* msg_text2 = " tried to load prohibited package name: "; - size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(name) + 1; - char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len); - jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, name); - THROW_MSG(vmSymbols::java_lang_SecurityException(), message); + class_name != NULL) { + ResourceMark rm(THREAD); + char* name = class_name->as_C_string(); + if (strncmp(name, JAVAPKG, JAVAPKG_LEN) == 0 && name[JAVAPKG_LEN] == '/') { + TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK); + assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'"); + name = pkg_name->as_C_string(); + const char* class_loader_name = SystemDictionary::loader_name(class_loader()); + StringUtils::replace_no_expand(name, "/", "."); + const char* msg_text1 = "Class loader (instance of): "; + const char* msg_text2 = " tried to load prohibited package name: "; + size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(name) + 1; + char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len); + jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, name); + THROW_MSG(vmSymbols::java_lang_SecurityException(), message); + } } return; } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/opto/arraycopynode.cpp --- a/hotspot/src/share/vm/opto/arraycopynode.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/opto/arraycopynode.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -225,7 +225,6 @@ Node* dest = in(ArrayCopyNode::Dest); const Type* src_type = phase->type(src); const TypeAryPtr* ary_src = src_type->isa_aryptr(); - assert(ary_src != NULL, "should be an array copy/clone"); if (is_arraycopy() || is_copyofrange() || is_copyof()) { const Type* dest_type = phase->type(dest); @@ -286,7 +285,8 @@ copy_type = dest_elem; } else { - assert (is_clonebasic(), "should be"); + assert(ary_src != NULL, "should be a clone"); + assert(is_clonebasic(), "should be"); disjoint_bases = true; assert(src->is_AddP(), "should be base + off"); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/opto/callnode.cpp --- a/hotspot/src/share/vm/opto/callnode.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/opto/callnode.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -784,8 +784,8 @@ } // May modify (by reflection) if an boxing object is passed // as argument or returned. - if (returns_pointer() && (proj_out(TypeFunc::Parms) != NULL)) { - Node* proj = proj_out(TypeFunc::Parms); + Node* proj = returns_pointer() ? proj_out(TypeFunc::Parms) : NULL; + if (proj != NULL) { const TypeInstPtr* inst_t = phase->type(proj)->isa_instptr(); if ((inst_t != NULL) && (!inst_t->klass_is_exact() || (inst_t->klass() == boxing_klass))) { diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/opto/castnode.cpp --- a/hotspot/src/share/vm/opto/castnode.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/opto/castnode.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -225,7 +225,10 @@ } // Similar to ConvI2LNode::Ideal() for the same reasons - if (can_reshape && !phase->C->major_progress()) { + // Do not narrow the type of range check dependent CastIINodes to + // avoid corruption of the graph if a CastII is replaced by TOP but + // the corresponding range check is not removed. + if (can_reshape && !_range_check_dependency && !phase->C->major_progress()) { const TypeInt* this_type = this->type()->is_int(); const TypeInt* in_type = phase->type(in(1))->isa_int(); if (in_type != NULL && this_type != NULL && diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/opto/convertnode.cpp --- a/hotspot/src/share/vm/opto/convertnode.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/opto/convertnode.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -294,8 +294,7 @@ } #ifdef _LP64 - // Convert ConvI2L(AddI(x, y)) to AddL(ConvI2L(x), ConvI2L(y)) or - // ConvI2L(CastII(AddI(x, y))) to AddL(ConvI2L(CastII(x)), ConvI2L(CastII(y))), + // Convert ConvI2L(AddI(x, y)) to AddL(ConvI2L(x), ConvI2L(y)) // but only if x and y have subranges that cannot cause 32-bit overflow, // under the assumption that x+y is in my own subrange this->type(). @@ -319,13 +318,6 @@ Node* z = in(1); int op = z->Opcode(); - Node* ctrl = NULL; - if (op == Op_CastII && z->as_CastII()->has_range_check()) { - // Skip CastII node but save control dependency - ctrl = z->in(0); - z = z->in(1); - op = z->Opcode(); - } if (op == Op_AddI || op == Op_SubI) { Node* x = z->in(1); Node* y = z->in(2); @@ -385,8 +377,8 @@ } assert(rxlo == (int)rxlo && rxhi == (int)rxhi, "x should not overflow"); assert(rylo == (int)rylo && ryhi == (int)ryhi, "y should not overflow"); - Node* cx = phase->C->constrained_convI2L(phase, x, TypeInt::make(rxlo, rxhi, widen), ctrl); - Node* cy = phase->C->constrained_convI2L(phase, y, TypeInt::make(rylo, ryhi, widen), ctrl); + Node* cx = phase->C->constrained_convI2L(phase, x, TypeInt::make(rxlo, rxhi, widen), NULL); + Node* cy = phase->C->constrained_convI2L(phase, y, TypeInt::make(rylo, ryhi, widen), NULL); switch (op) { case Op_AddI: return new AddLNode(cx, cy); case Op_SubI: return new SubLNode(cx, cy); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/opto/ifnode.cpp --- a/hotspot/src/share/vm/opto/ifnode.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/opto/ifnode.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -249,6 +249,13 @@ predicate_proj = proj; } } + + // If all the defs of the phi are the same constant, we already have the desired end state. + // Skip the split that would create empty phi and region nodes. + if((r->req() - req_c) == 1) { + return NULL; + } + if (nb_predicate_proj > 1) { // Can happen in case of loop unswitching and when the loop is // optimized out: it's not a loop anymore so we don't care about @@ -1458,8 +1465,9 @@ // be skipped. For example, range check predicate has two checks // for lower and upper bounds. ProjNode* unc_proj = proj_out(1 - prev_dom->as_Proj()->_con)->as_Proj(); - if (unc_proj->is_uncommon_trap_proj(Deoptimization::Reason_predicate) != NULL) - prev_dom = idom; + if ((unc_proj != NULL) && (unc_proj->is_uncommon_trap_proj(Deoptimization::Reason_predicate) != NULL)) { + prev_dom = idom; + } // Now walk the current IfNode's projections. // Loop ends when 'this' has no more uses. diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/opto/lcm.cpp --- a/hotspot/src/share/vm/opto/lcm.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/opto/lcm.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -254,10 +254,12 @@ const TypePtr *adr_type = NULL; // Do not need this return value here const Node* base = mach->get_base_and_disp(offset, adr_type); if (base == NULL || base == NodeSentinel) { - // Narrow oop address doesn't have base, only index - if( val->bottom_type()->isa_narrowoop() && - MacroAssembler::needs_explicit_null_check(offset) ) - continue; // Give up if offset is beyond page size + // Narrow oop address doesn't have base, only index. + // Give up if offset is beyond page size or if heap base is not protected. + if (val->bottom_type()->isa_narrowoop() && + (MacroAssembler::needs_explicit_null_check(offset) || + !Universe::narrow_oop_use_implicit_null_checks())) + continue; // cannot reason about it; is probably not implicit null exception } else { const TypePtr* tptr; @@ -269,12 +271,17 @@ // only regular oops are expected here tptr = base->bottom_type()->is_ptr(); } - // Give up if offset is not a compile-time constant - if( offset == Type::OffsetBot || tptr->_offset == Type::OffsetBot ) + // Give up if offset is not a compile-time constant. + if (offset == Type::OffsetBot || tptr->_offset == Type::OffsetBot) continue; offset += tptr->_offset; // correct if base is offseted - if( MacroAssembler::needs_explicit_null_check(offset) ) - continue; // Give up is reference is beyond 4K page size + // Give up if reference is beyond page size. + if (MacroAssembler::needs_explicit_null_check(offset)) + continue; + // Give up if base is a decode node and the heap base is not protected. + if (base->is_Mach() && base->as_Mach()->ideal_Opcode() == Op_DecodeN && + !Universe::narrow_oop_use_implicit_null_checks()) + continue; } } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/opto/library_call.cpp --- a/hotspot/src/share/vm/opto/library_call.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/opto/library_call.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -2372,10 +2372,10 @@ // the barriers get omitted and the unsafe reference begins to "pollute" // the alias analysis of the rest of the graph, either Compile::can_alias // or Compile::must_alias will throw a diagnostic assert.) - bool need_mem_bar; + bool need_mem_bar = false; switch (kind) { case Relaxed: - need_mem_bar = mismatched || can_access_non_heap; + need_mem_bar = mismatched && !adr_type->isa_aryptr(); break; case Opaque: // Opaque uses CPUOrder membars for protection against code movement. diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/opto/loopTransform.cpp --- a/hotspot/src/share/vm/opto/loopTransform.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/opto/loopTransform.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -3174,6 +3174,11 @@ return false; } + Node* exit = head->loopexit()->proj_out(0); + if (exit == NULL) { + return false; + } + #ifndef PRODUCT if (TraceLoopOpts) { tty->print("ArrayFill "); @@ -3281,7 +3286,6 @@ */ // Redirect the old control and memory edges that are outside the loop. - Node* exit = head->loopexit()->proj_out(0); // Sometimes the memory phi of the head is used as the outgoing // state of the loop. It's safe in this case to replace it with the // result_mem. diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/opto/parse2.cpp --- a/hotspot/src/share/vm/opto/parse2.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/opto/parse2.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -826,6 +826,9 @@ ciMethodData* methodData = method()->method_data(); if (!methodData->is_mature()) return PROB_UNKNOWN; ciProfileData* data = methodData->bci_to_data(bci()); + if (data == NULL) { + return PROB_UNKNOWN; + } if (!data->is_JumpData()) return PROB_UNKNOWN; // get taken and not taken values @@ -917,8 +920,8 @@ // of the OSR-ed method, and we want to deopt to gather more stats. // If you have ANY counts, then this loop is simply 'cold' relative // to the OSR loop. - if (data->as_BranchData()->taken() + - data->as_BranchData()->not_taken() == 0 ) { + if (data == NULL || + (data->as_BranchData()->taken() + data->as_BranchData()->not_taken() == 0)) { // This is the only way to return PROB_UNKNOWN: return PROB_UNKNOWN; } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/opto/stringopts.cpp --- a/hotspot/src/share/vm/opto/stringopts.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/opto/stringopts.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -891,8 +891,9 @@ ctrl_path.push(cn); ctrl_path.push(cn->proj_out(0)); ctrl_path.push(cn->proj_out(0)->unique_out()); - if (cn->proj_out(0)->unique_out()->as_Catch()->proj_out(0) != NULL) { - ctrl_path.push(cn->proj_out(0)->unique_out()->as_Catch()->proj_out(0)); + Node* catchproj = cn->proj_out(0)->unique_out()->as_Catch()->proj_out(0); + if (catchproj != NULL) { + ctrl_path.push(catchproj); } } else { ShouldNotReachHere(); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/prims/jni.cpp --- a/hotspot/src/share/vm/prims/jni.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/prims/jni.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -935,8 +935,7 @@ inline void get_long() { _arguments->push_long(va_arg(_ap, jlong)); } inline void get_float() { _arguments->push_float((jfloat)va_arg(_ap, jdouble)); } // float is coerced to double w/ va_arg inline void get_double() { _arguments->push_double(va_arg(_ap, jdouble)); } - inline void get_object() { jobject l = va_arg(_ap, jobject); - _arguments->push_oop(Handle((oop *)l, false)); } + inline void get_object() { _arguments->push_jobject(va_arg(_ap, jobject)); } inline void set_ap(va_list rap) { va_copy(_ap, rap); @@ -1025,7 +1024,7 @@ inline void get_long() { _arguments->push_long((_ap++)->j); } inline void get_float() { _arguments->push_float((_ap++)->f); } inline void get_double() { _arguments->push_double((_ap++)->d);} - inline void get_object() { _arguments->push_oop(Handle((oop *)(_ap++)->l, false)); } + inline void get_object() { _arguments->push_jobject((_ap++)->l); } inline void set_ap(const jvalue *rap) { _ap = rap; } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/prims/jvmtiEnv.cpp --- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1796,6 +1796,13 @@ } } + if (initial_object != NULL) { + oop init_obj = JNIHandles::resolve_external_guard(initial_object); + if (init_obj == NULL) { + return JVMTI_ERROR_INVALID_OBJECT; + } + } + Thread *thread = Thread::current(); HandleMark hm(thread); KlassHandle kh (thread, k_oop); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/runtime/arguments.cpp --- a/hotspot/src/share/vm/runtime/arguments.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -2856,6 +2856,10 @@ if (res != JNI_OK) { return res; } + } else if (match_option(option, "--permit-illegal-access")) { + if (!create_property("jdk.module.permitIllegalAccess", "true", ExternalProperty)) { + return JNI_ENOMEM; + } // -agentlib and -agentpath } else if (match_option(option, "-agentlib:", &tail) || (is_absolute_path = match_option(option, "-agentpath:", &tail))) { @@ -3098,6 +3102,7 @@ // -Xprof } else if (match_option(option, "-Xprof")) { #if INCLUDE_FPROF + log_warning(arguments)("Option -Xprof was deprecated in version 9 and will likely be removed in a future release."); _has_profile = true; #else // INCLUDE_FPROF jio_fprintf(defaultStream::error_stream(), diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/runtime/java.cpp --- a/hotspot/src/share/vm/runtime/java.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/runtime/java.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -621,6 +621,13 @@ } } +void vm_exit_during_initialization() { + vm_notify_during_shutdown(NULL, NULL); + + // Failure during initialization, we don't want to dump core + vm_abort(false); +} + void vm_exit_during_initialization(Handle exception) { tty->print_cr("Error occurred during initialization of VM"); // If there are exceptions on this thread it must be cleared diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/runtime/java.hpp --- a/hotspot/src/share/vm/runtime/java.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/runtime/java.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,6 +45,7 @@ extern void notify_vm_shutdown(); // VM exit if error occurs during initialization of VM +extern void vm_exit_during_initialization(); extern void vm_exit_during_initialization(Handle exception); extern void vm_exit_during_initialization(Symbol* exception_name, const char* message); extern void vm_exit_during_initialization(const char* error, const char* message = NULL); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/runtime/javaCalls.cpp --- a/hotspot/src/share/vm/runtime/javaCalls.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/runtime/javaCalls.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -328,9 +328,9 @@ // Verify the arguments if (CheckJNICalls) { - args->verify(method, result->get_type(), thread); + args->verify(method, result->get_type()); } - else debug_only(args->verify(method, result->get_type(), thread)); + else debug_only(args->verify(method, result->get_type())); #if INCLUDE_JVMCI } #else @@ -442,12 +442,43 @@ //-------------------------------------------------------------------------------------- // Implementation of JavaCallArguments +inline bool is_value_state_indirect_oop(uint state) { + assert(state != JavaCallArguments::value_state_oop, + "Checking for handles after removal"); + assert(state < JavaCallArguments::value_state_limit, + "Invalid value state %u", state); + return state != JavaCallArguments::value_state_primitive; +} + +inline oop resolve_indirect_oop(intptr_t value, uint state) { + switch (state) { + case JavaCallArguments::value_state_handle: + { + oop* ptr = reinterpret_cast(value); + return Handle::raw_resolve(ptr); + } + + case JavaCallArguments::value_state_jobject: + { + jobject obj = reinterpret_cast(value); + return JNIHandles::resolve(obj); + } + + default: + ShouldNotReachHere(); + return NULL; + } +} + intptr_t* JavaCallArguments::parameters() { // First convert all handles to oops for(int i = 0; i < _size; i++) { - if (_is_oop[i]) { - // Handle conversion - _value[i] = cast_from_oop(Handle::raw_resolve((oop *)_value[i])); + uint state = _value_state[i]; + assert(state != value_state_oop, "Multiple handle conversions"); + if (is_value_state_indirect_oop(state)) { + oop obj = resolve_indirect_oop(_value[i], state); + _value[i] = cast_from_oop(obj); + _value_state[i] = value_state_oop; } } // Return argument vector @@ -457,30 +488,42 @@ class SignatureChekker : public SignatureIterator { private: - bool *_is_oop; - int _pos; + int _pos; BasicType _return_type; - intptr_t* _value; - Thread* _thread; + u_char* _value_state; + intptr_t* _value; public: bool _is_return; - SignatureChekker(Symbol* signature, BasicType return_type, bool is_static, bool* is_oop, intptr_t* value, Thread* thread) : SignatureIterator(signature) { - _is_oop = is_oop; - _is_return = false; - _return_type = return_type; - _pos = 0; - _value = value; - _thread = thread; - + SignatureChekker(Symbol* signature, + BasicType return_type, + bool is_static, + u_char* value_state, + intptr_t* value) : + SignatureIterator(signature), + _pos(0), + _return_type(return_type), + _value_state(value_state), + _value(value), + _is_return(false) + { if (!is_static) { check_value(true); // Receiver must be an oop } } void check_value(bool type) { - guarantee(_is_oop[_pos++] == type, "signature does not match pushed arguments"); + uint state = _value_state[_pos++]; + if (type) { + guarantee(is_value_state_indirect_oop(state), + "signature does not match pushed arguments: %u at %d", + state, _pos - 1); + } else { + guarantee(state == JavaCallArguments::value_state_primitive, + "signature does not match pushed arguments: %u at %d", + state, _pos - 1); + } } void check_doing_return(bool state) { _is_return = state; } @@ -515,24 +558,20 @@ return; } - // verify handle and the oop pointed to by handle - int p = _pos; - bool bad = false; - // If argument is oop - if (_is_oop[p]) { - intptr_t v = _value[p]; - if (v != 0 ) { - size_t t = (size_t)v; - bad = (t < (size_t)os::vm_page_size() ) || !Handle::raw_resolve((oop *)v)->is_oop_or_null(true); - if (CheckJNICalls && bad) { - ReportJNIFatalError((JavaThread*)_thread, "Bad JNI oop argument"); - } - } - // for the regular debug case. - assert(!bad, "Bad JNI oop argument"); + intptr_t v = _value[_pos]; + if (v != 0) { + // v is a "handle" referring to an oop, cast to integral type. + // There shouldn't be any handles in very low memory. + guarantee((size_t)v >= (size_t)os::vm_page_size(), + "Bad JNI oop argument %d: " PTR_FORMAT, _pos, v); + // Verify the pointee. + oop vv = resolve_indirect_oop(v, _value_state[_pos]); + guarantee(vv->is_oop_or_null(true), + "Bad JNI oop argument %d: " PTR_FORMAT " -> " PTR_FORMAT, + _pos, v, p2i(vv)); } - check_value(true); + check_value(true); // Verify value state. } void do_bool() { check_int(T_BOOLEAN); } @@ -549,8 +588,7 @@ }; -void JavaCallArguments::verify(const methodHandle& method, BasicType return_type, - Thread *thread) { +void JavaCallArguments::verify(const methodHandle& method, BasicType return_type) { guarantee(method->size_of_parameters() == size_of_parameters(), "wrong no. of arguments pushed"); // Treat T_OBJECT and T_ARRAY as the same @@ -559,7 +597,11 @@ // Check that oop information is correct Symbol* signature = method->signature(); - SignatureChekker sc(signature, return_type, method->is_static(),_is_oop, _value, thread); + SignatureChekker sc(signature, + return_type, + method->is_static(), + _value_state, + _value); sc.iterate_parameters(); sc.check_doing_return(true); sc.iterate_returntype(); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/runtime/javaCalls.hpp --- a/hotspot/src/share/vm/runtime/javaCalls.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/runtime/javaCalls.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -80,11 +80,11 @@ _default_size = 8 // Must be at least # of arguments in JavaCalls methods }; - intptr_t _value_buffer [_default_size + 1]; - bool _is_oop_buffer[_default_size + 1]; + intptr_t _value_buffer [_default_size + 1]; + u_char _value_state_buffer[_default_size + 1]; intptr_t* _value; - bool* _is_oop; + u_char* _value_state; int _size; int _max_size; bool _start_at_zero; // Support late setting of receiver @@ -92,8 +92,8 @@ void initialize() { // Starts at first element to support set_receiver. - _value = &_value_buffer[1]; - _is_oop = &_is_oop_buffer[1]; + _value = &_value_buffer[1]; + _value_state = &_value_state_buffer[1]; _max_size = _default_size; _size = 0; @@ -101,6 +101,23 @@ JVMCI_ONLY(_alternative_target = NULL;) } + // Helper for push_oop and the like. The value argument is a + // "handle" that refers to an oop. We record the address of the + // handle rather than the designated oop. The handle is later + // resolved to the oop by parameters(). This delays the exposure of + // naked oops until it is GC-safe. + template + inline int push_oop_impl(T handle, int size) { + // JNITypes::put_obj expects an oop value, so we play fast and + // loose with the type system. The cast from handle type to oop + // *must* use a C-style cast. In a product build it performs a + // reinterpret_cast. In a debug build (more accurately, in a + // CHECK_UNHANDLED_OOPS build) it performs a static_cast, invoking + // the debug-only oop class's conversion from void* constructor. + JNITypes::put_obj((oop)handle, _value, size); // Updates size. + return size; // Return the updated size. + } + public: JavaCallArguments() { initialize(); } @@ -111,11 +128,12 @@ JavaCallArguments(int max_size) { if (max_size > _default_size) { - _value = NEW_RESOURCE_ARRAY(intptr_t, max_size + 1); - _is_oop = NEW_RESOURCE_ARRAY(bool, max_size + 1); + _value = NEW_RESOURCE_ARRAY(intptr_t, max_size + 1); + _value_state = NEW_RESOURCE_ARRAY(u_char, max_size + 1); - // Reserve room for potential receiver in value and is_oop - _value++; _is_oop++; + // Reserve room for potential receiver in value and state + _value++; + _value_state++; _max_size = max_size; _size = 0; @@ -136,25 +154,52 @@ } #endif - inline void push_oop(Handle h) { _is_oop[_size] = true; - JNITypes::put_obj((oop)h.raw_value(), _value, _size); } + // The possible values for _value_state elements. + enum { + value_state_primitive, + value_state_oop, + value_state_handle, + value_state_jobject, + value_state_limit + }; - inline void push_int(int i) { _is_oop[_size] = false; - JNITypes::put_int(i, _value, _size); } + inline void push_oop(Handle h) { + _value_state[_size] = value_state_handle; + _size = push_oop_impl(h.raw_value(), _size); + } + + inline void push_jobject(jobject h) { + _value_state[_size] = value_state_jobject; + _size = push_oop_impl(h, _size); + } - inline void push_double(double d) { _is_oop[_size] = false; _is_oop[_size + 1] = false; - JNITypes::put_double(d, _value, _size); } + inline void push_int(int i) { + _value_state[_size] = value_state_primitive; + JNITypes::put_int(i, _value, _size); + } + + inline void push_double(double d) { + _value_state[_size] = value_state_primitive; + _value_state[_size + 1] = value_state_primitive; + JNITypes::put_double(d, _value, _size); + } - inline void push_long(jlong l) { _is_oop[_size] = false; _is_oop[_size + 1] = false; - JNITypes::put_long(l, _value, _size); } + inline void push_long(jlong l) { + _value_state[_size] = value_state_primitive; + _value_state[_size + 1] = value_state_primitive; + JNITypes::put_long(l, _value, _size); + } - inline void push_float(float f) { _is_oop[_size] = false; - JNITypes::put_float(f, _value, _size); } + inline void push_float(float f) { + _value_state[_size] = value_state_primitive; + JNITypes::put_float(f, _value, _size); + } // receiver Handle receiver() { assert(_size > 0, "must at least be one argument"); - assert(_is_oop[0], "first argument must be an oop"); + assert(_value_state[0] == value_state_handle, + "first argument must be an oop"); assert(_value[0] != 0, "receiver must be not-null"); return Handle((oop*)_value[0], false); } @@ -162,11 +207,11 @@ void set_receiver(Handle h) { assert(_start_at_zero == false, "can only be called once"); _start_at_zero = true; - _is_oop--; + _value_state--; _value--; _size++; - _is_oop[0] = true; - _value[0] = (intptr_t)h.raw_value(); + _value_state[0] = value_state_handle; + push_oop_impl(h.raw_value(), 0); } // Converts all Handles to oops, and returns a reference to parameter vector @@ -174,7 +219,7 @@ int size_of_parameters() const { return _size; } // Verify that pushed arguments fits a given method - void verify(const methodHandle& method, BasicType return_type, Thread *thread); + void verify(const methodHandle& method, BasicType return_type); }; // All calls to Java have to go via JavaCalls. Sets up the stack frame diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/runtime/jniHandles.cpp --- a/hotspot/src/share/vm/runtime/jniHandles.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/runtime/jniHandles.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,9 @@ #include "runtime/jniHandles.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/thread.inline.hpp" +#if INCLUDE_ALL_GCS +#include "gc/g1/g1SATBCardTableModRefBS.hpp" +#endif JNIHandleBlock* JNIHandles::_global_handles = NULL; JNIHandleBlock* JNIHandles::_weak_global_handles = NULL; @@ -92,28 +95,48 @@ jobject res = NULL; if (!obj.is_null()) { // ignore null handles - MutexLocker ml(JNIGlobalHandle_lock); - assert(Universe::heap()->is_in_reserved(obj()), "sanity check"); - res = _weak_global_handles->allocate_handle(obj()); + { + MutexLocker ml(JNIGlobalHandle_lock); + assert(Universe::heap()->is_in_reserved(obj()), "sanity check"); + res = _weak_global_handles->allocate_handle(obj()); + } + // Add weak tag. + assert(is_ptr_aligned(res, weak_tag_alignment), "invariant"); + char* tptr = reinterpret_cast(res) + weak_tag_value; + res = reinterpret_cast(tptr); } else { CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops()); } return res; } +template +oop JNIHandles::resolve_jweak(jweak handle) { + assert(is_jweak(handle), "precondition"); + oop result = jweak_ref(handle); + result = guard_value(result); +#if INCLUDE_ALL_GCS + if (result != NULL && UseG1GC) { + G1SATBCardTableModRefBS::enqueue(result); + } +#endif // INCLUDE_ALL_GCS + return result; +} + +template oop JNIHandles::resolve_jweak(jweak); +template oop JNIHandles::resolve_jweak(jweak); void JNIHandles::destroy_global(jobject handle) { if (handle != NULL) { assert(is_global_handle(handle), "Invalid delete of global JNI handle"); - *((oop*)handle) = deleted_handle(); // Mark the handle as deleted, allocate will reuse it + jobject_ref(handle) = deleted_handle(); } } void JNIHandles::destroy_weak_global(jobject handle) { if (handle != NULL) { - assert(!CheckJNICalls || is_weak_global_handle(handle), "Invalid delete of weak global JNI handle"); - *((oop*)handle) = deleted_handle(); // Mark the handle as deleted, allocate will reuse it + jweak_ref(handle) = deleted_handle(); } } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/runtime/jniHandles.hpp --- a/hotspot/src/share/vm/runtime/jniHandles.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/runtime/jniHandles.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,28 @@ static JNIHandleBlock* _weak_global_handles; // First weak global handle block static oop _deleted_handle; // Sentinel marking deleted handles + inline static bool is_jweak(jobject handle); + inline static oop& jobject_ref(jobject handle); // NOT jweak! + inline static oop& jweak_ref(jobject handle); + + template inline static oop guard_value(oop value); + template inline static oop resolve_impl(jobject handle); + template static oop resolve_jweak(jweak handle); + public: + // Low tag bit in jobject used to distinguish a jweak. jweak is + // type equivalent to jobject, but there are places where we need to + // be able to distinguish jweak values from other jobjects, and + // is_weak_global_handle is unsuitable for performance reasons. To + // provide such a test we add weak_tag_value to the (aligned) byte + // address designated by the jobject to produce the corresponding + // jweak. Accessing the value of a jobject must account for it + // being a possibly offset jweak. + static const uintptr_t weak_tag_size = 1; + static const uintptr_t weak_tag_alignment = (1u << weak_tag_size); + static const uintptr_t weak_tag_mask = weak_tag_alignment - 1; + static const int weak_tag_value = 1; + // Resolve handle into oop inline static oop resolve(jobject handle); // Resolve externally provided handle into oop with some guards @@ -176,36 +197,85 @@ #endif }; +inline bool JNIHandles::is_jweak(jobject handle) { + STATIC_ASSERT(weak_tag_size == 1); + STATIC_ASSERT(weak_tag_value == 1); + return (reinterpret_cast(handle) & weak_tag_mask) != 0; +} + +inline oop& JNIHandles::jobject_ref(jobject handle) { + assert(!is_jweak(handle), "precondition"); + return *reinterpret_cast(handle); +} + +inline oop& JNIHandles::jweak_ref(jobject handle) { + assert(is_jweak(handle), "precondition"); + char* ptr = reinterpret_cast(handle) - weak_tag_value; + return *reinterpret_cast(ptr); +} + +// external_guard is true if called from resolve_external_guard. +// Treat deleted (and possibly zapped) as NULL for external_guard, +// else as (asserted) error. +template +inline oop JNIHandles::guard_value(oop value) { + if (!external_guard) { + assert(value != badJNIHandle, "Pointing to zapped jni handle area"); + assert(value != deleted_handle(), "Used a deleted global handle"); + } else if ((value == badJNIHandle) || (value == deleted_handle())) { + value = NULL; + } + return value; +} + +// external_guard is true if called from resolve_external_guard. +template +inline oop JNIHandles::resolve_impl(jobject handle) { + assert(handle != NULL, "precondition"); + oop result; + if (is_jweak(handle)) { // Unlikely + result = resolve_jweak(handle); + } else { + result = jobject_ref(handle); + // Construction of jobjects canonicalize a null value into a null + // jobject, so for non-jweak the pointee should never be null. + assert(external_guard || result != NULL, + "Invalid value read from jni handle"); + result = guard_value(result); + } + return result; +} inline oop JNIHandles::resolve(jobject handle) { - oop result = (handle == NULL ? (oop)NULL : *(oop*)handle); - assert(result != NULL || (handle == NULL || !CheckJNICalls || is_weak_global_handle(handle)), "Invalid value read from jni handle"); - assert(result != badJNIHandle, "Pointing to zapped jni handle area"); + oop result = NULL; + if (handle != NULL) { + result = resolve_impl(handle); + } return result; -}; - +} +// Resolve some erroneous cases to NULL, rather than treating them as +// possibly unchecked errors. In particular, deleted handles are +// treated as NULL (though a deleted and later reallocated handle +// isn't detected). inline oop JNIHandles::resolve_external_guard(jobject handle) { - if (handle == NULL) return NULL; - oop result = *(oop*)handle; - if (result == NULL || result == badJNIHandle) return NULL; + oop result = NULL; + if (handle != NULL) { + result = resolve_impl(handle); + } return result; -}; - +} inline oop JNIHandles::resolve_non_null(jobject handle) { assert(handle != NULL, "JNI handle should not be null"); - oop result = *(oop*)handle; - assert(result != NULL, "Invalid value read from jni handle"); - assert(result != badJNIHandle, "Pointing to zapped jni handle area"); - // Don't let that private _deleted_handle object escape into the wild. - assert(result != deleted_handle(), "Used a deleted global handle."); + oop result = resolve_impl(handle); + assert(result != NULL, "NULL read from jni handle"); return result; -}; +} inline void JNIHandles::destroy_local(jobject handle) { if (handle != NULL) { - *((oop*)handle) = deleted_handle(); // Mark the handle as deleted, allocate will reuse it + jobject_ref(handle) = deleted_handle(); } } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/runtime/mutexLocker.cpp --- a/hotspot/src/share/vm/runtime/mutexLocker.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/runtime/mutexLocker.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -181,13 +181,13 @@ } if (UseG1GC) { - def(SATB_Q_FL_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never); - def(SATB_Q_CBL_mon , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_never); - def(Shared_SATB_Q_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never); + def(SATB_Q_FL_lock , PaddedMutex , special , true, Monitor::_safepoint_check_never); + def(SATB_Q_CBL_mon , PaddedMonitor, leaf - 1 , true, Monitor::_safepoint_check_never); + def(Shared_SATB_Q_lock , PaddedMutex , leaf - 1 , true, Monitor::_safepoint_check_never); - def(DirtyCardQ_FL_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never); - def(DirtyCardQ_CBL_mon , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_never); - def(Shared_DirtyCardQ_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never); + def(DirtyCardQ_FL_lock , PaddedMutex , special , true, Monitor::_safepoint_check_never); + def(DirtyCardQ_CBL_mon , PaddedMonitor, leaf - 1 , true, Monitor::_safepoint_check_never); + def(Shared_DirtyCardQ_lock , PaddedMutex , leaf - 1 , true, Monitor::_safepoint_check_never); def(FreeList_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_never); def(SecondaryFreeList_lock , PaddedMonitor, leaf , true, Monitor::_safepoint_check_never); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/runtime/thread.cpp --- a/hotspot/src/share/vm/runtime/thread.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/runtime/thread.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -3409,9 +3409,16 @@ Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_System(), true, CHECK); instanceKlassHandle klass (THREAD, k); - JavaValue result(T_VOID); + JavaValue result(T_INT); + JavaCallArguments args; + args.push_int(DisplayVMOutputToStderr); + args.push_int(log_is_enabled(Debug, init)); // print stack trace if exception thrown JavaCalls::call_static(&result, klass, vmSymbols::initPhase2_name(), - vmSymbols::void_method_signature(), CHECK); + vmSymbols::boolean_boolean_int_signature(), &args, CHECK); + if (result.get_jint() != JNI_OK) { + vm_exit_during_initialization(); // no message or exception + } + universe_post_module_init(); } diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/shark/sharkNativeWrapper.cpp --- a/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright 2009, 2010 Red Hat, Inc. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -300,6 +300,7 @@ not_null, merge); builder()->SetInsertPoint(not_null); +#error Needs to be updated for tagged jweak; see JNIHandles. Value *unboxed_result = builder()->CreateLoad(result); builder()->CreateBr(merge); diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/utilities/debug.hpp --- a/hotspot/src/share/vm/utilities/debug.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/utilities/debug.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -140,6 +140,9 @@ // For backward compatibility. #define assert(p, ...) vmassert(p, __VA_ARGS__) +#ifndef ASSERT +#define vmassert_status(p, status, msg) +#else // This version of vmassert is for use with checking return status from // library calls that return actual error values eg. EINVAL, // ENOMEM etc, rather than returning -1 and setting errno. @@ -155,6 +158,7 @@ BREAKPOINT; \ } \ } while (0) +#endif // For backward compatibility. #define assert_status(p, status, msg) vmassert_status(p, status, msg) diff -r 18569c523d38 -r c61cc8a34456 hotspot/src/share/vm/utilities/globalDefinitions_xlc.hpp --- a/hotspot/src/share/vm/utilities/globalDefinitions_xlc.hpp Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/src/share/vm/utilities/globalDefinitions_xlc.hpp Wed Jul 05 23:09:40 2017 +0200 @@ -1,6 +1,6 @@ /* * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2016 SAP SE. All rights reserved. + * Copyright (c) 2012, 2017 SAP SE. 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 @@ -153,6 +153,9 @@ // offset_of as it is defined for gcc. #define offset_of(klass,field) (size_t)((intx)&(((klass*)16)->field) - 16) +// AIX 5.3 has buggy __thread support. (see JDK-8176442). +#define USE_LIBRARY_BASED_TLS_ONLY 1 + #ifndef USE_LIBRARY_BASED_TLS_ONLY #define THREAD_LOCAL_DECL __thread #endif diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/ProblemList.txt --- a/hotspot/test/ProblemList.txt Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/test/ProblemList.txt Wed Jul 05 23:09:40 2017 +0200 @@ -79,7 +79,5 @@ # :hotspot_misc -testlibrary_tests/ctw/JarDirTest.java 8172457 windows-all - ############################################################################# diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/compiler/arraycopy/TestObjectArrayCopy.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/arraycopy/TestObjectArrayCopy.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2017, SAP SE 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 8176505 + * @summary Wrong assertion 'should be an array copy/clone' in arraycopynode.cpp + * + * @run main/othervm -Xbatch -XX:-UseOnStackReplacement compiler.arraycopy.TestObjectArrayCopy + * + * @author Volker Simonis + */ + +package compiler.arraycopy; + +public class TestObjectArrayCopy { + + public static boolean crash(Object src) { + String[] dst = new String[1]; + System.arraycopy(src, 0, dst, 0, 1); + return dst[0] == null; + } + + public static void main(String[] args) { + String[] sa = new String[1]; + for (int i = 0; i < 20_000; i++) { + crash(sa); + } + } +} diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/compiler/c2/TestNPEHeapBased.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/c2/TestNPEHeapBased.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017 SAP SE. 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 8176518 + * @summary Invalid ImplicitNullChecks when heap base not protected + * + * @run main/othervm -XX:ObjectAlignmentInBytes=16 -XX:HeapBaseMinAddress=64g + * -XX:-TieredCompilation -Xbatch + * compiler.c2.TestNPEHeapBased + * @requires vm.bits == "64" + */ + +package compiler.c2; +public class TestNPEHeapBased { + + TestNPEHeapBased instance = null; + int i = 0; + + public void set_i(int value) { + instance.i = value; + } + + + static final int loop_cnt = 200000; + + public static void main(String args[]){ + TestNPEHeapBased xyz = new TestNPEHeapBased(); + xyz.instance = xyz; + for (int x = 0; x < loop_cnt; x++) xyz.set_i(x); + xyz.instance = null; + try { + xyz.set_i(0); + } catch (NullPointerException npe) { + System.out.println("Got expected NullPointerException:"); + npe.printStackTrace(); + return; + } + throw new InternalError("NullPointerException is missing!"); + } + +} diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/compiler/loopopts/TestLoopPeeling.java --- a/hotspot/test/compiler/loopopts/TestLoopPeeling.java Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/test/compiler/loopopts/TestLoopPeeling.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8078262 + * @bug 8078262 8177095 * @summary Tests correct dominator information after loop peeling. * * @run main/othervm -Xcomp @@ -40,14 +40,16 @@ public static void main(String args[]) { TestLoopPeeling test = new TestLoopPeeling(); try { - test.testArrayAccess(0, 1); + test.testArrayAccess1(0, 1); + test.testArrayAccess2(0); + test.testArrayAccess3(0, false); test.testArrayAllocation(0, 1); } catch (Exception e) { // Ignore exceptions } } - public void testArrayAccess(int index, int inc) { + public void testArrayAccess1(int index, int inc) { int storeIndex = -1; for (; index < 10; index += inc) { @@ -63,7 +65,7 @@ if (index == 42) { // This store and the corresponding range check are moved out of the - // loop and both used after old loop and the peeled iteration exit. + // loop and both used after main loop and the peeled iteration exit. // For the peeled iteration, storeIndex is always -1 and the ConvI2L // is replaced by TOP. However, the range check is not folded because // we don't do the split if optimization in PhaseIdealLoop2. @@ -77,6 +79,44 @@ } } + public int testArrayAccess2(int index) { + // Load1 and the corresponding range check are moved out of the loop + // and both are used after the main loop and the peeled iteration exit. + // For the peeled iteration, storeIndex is always Integer.MIN_VALUE and + // for the main loop it is 0. Hence, the merging phi has type int:<=0. + // Load1 reads the array at index ConvI2L(CastII(AddI(storeIndex, -1))) + // where the CastII is range check dependent and has type int:>=0. + // The CastII gets pushed through the AddI and its type is changed to int:>=1 + // which does not overlap with the input type of storeIndex (int:<=0). + // The CastII is replaced by TOP causing a cascade of other eliminations. + // Since the control path through the range check CmpU(AddI(storeIndex, -1)) + // is not eliminated, the graph is in a corrupted state. We fail once we merge + // with the result of Load2 because we get data from a non-dominating region. + int storeIndex = Integer.MIN_VALUE; + for (; index < 10; ++index) { + if (index == 42) { + return array[storeIndex-1]; // Load1 + } + storeIndex = 0; + } + return array[42]; // Load2 + } + + public int testArrayAccess3(int index, boolean b) { + // Same as testArrayAccess2 but manifests as crash in register allocator. + int storeIndex = Integer.MIN_VALUE; + for (; index < 10; ++index) { + if (b) { + return 0; + } + if (index == 42) { + return array[storeIndex-1]; // Load1 + } + storeIndex = 0; + } + return array[42]; // Load2 + } + public byte[] testArrayAllocation(int index, int inc) { int allocationCount = -1; byte[] result; @@ -88,7 +128,7 @@ if (index == 42) { // This allocation and the corresponding size check are moved out of the - // loop and both used after old loop and the peeled iteration exit. + // loop and both used after main loop and the peeled iteration exit. // For the peeled iteration, allocationCount is always -1 and the ConvI2L // is replaced by TOP. However, the size check is not folded because // we don't do the split if optimization in PhaseIdealLoop2. diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/runtime/MinimalVM/JMX.java --- a/hotspot/test/runtime/MinimalVM/JMX.java Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/test/runtime/MinimalVM/JMX.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,9 +47,8 @@ .shouldContain("-Dcom.sun.management is not supported in this VM.") .shouldHaveExitValue(1); - pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), Long.toString(ProcessTools.getProcessId()), "VM.print_threads"}); + pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), "-l"}); new OutputAnalyzer(pb.start()) - .shouldContain("Could not find any processes matching ") - .shouldHaveExitValue(1); + .shouldNotMatch("^" + Long.toString(ProcessTools.getProcessId()) + "\\s+.*$"); } } diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/runtime/constantPool/ACCModule52.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/constantPool/ACCModule52.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import jdk.internal.org.objectweb.asm.*; + +/* + * @test + * @summary Test that the JVM ignores ACC_MODULE if it is set for a version + * 52 class file. + * @bug 8175383 + * @library /test/lib + * @modules java.base/jdk.internal.org.objectweb.asm + * @compile -XDignore.symbol.file ACCModule52.java + * @run main ACCModule52 + */ + +public class ACCModule52 { + + static final String CLASS_NAME = "ACCModule52Pkg"; + + public static void main(String[] args) throws Exception { + int ACC_MODULE = 0x8000; + ClassWriter cw = new ClassWriter(0); + cw.visit(Opcodes.V1_8, + Opcodes.ACC_INTERFACE + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC + ACC_MODULE, + CLASS_NAME, + null, + "java/lang/Object", + null); + + cw.visitEnd(); + byte[] bytes = cw.toByteArray(); + + + ClassLoader loader = new ClassLoader(ACCModule52.class.getClassLoader()) { + @Override + protected Class findClass(String cn)throws ClassNotFoundException { + if (cn.equals(CLASS_NAME)) { + Class superClass = super.defineClass(cn, bytes, 0, bytes.length); + } else { + throw new ClassNotFoundException(cn); + } + return null; + } + }; + + Class clazz = loader.loadClass(CLASS_NAME); + } +} diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/runtime/constantPool/ConstModule.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/constantPool/ConstModule.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import jdk.internal.org.objectweb.asm.*; + +/* + * @test + * @summary Test scenarios for constant pool CONSTANT_Module and CONSTANT_Package + * types, for class file versions 53 and 52, when ACC_MODULE is set and + * not set in the access_flags. + * @bug 8175383 + * @library /test/lib + * @modules java.base/jdk.internal.org.objectweb.asm + * @compile -XDignore.symbol.file ConstModule.java + * @run main ConstModule + */ + +public class ConstModule { + + static final int ACC_MODULE = 0x8000; + static final boolean MODULE_TEST = true; + static final boolean PACKAGE_TEST = false; + static final boolean CFE_EXCEPTION = true; + static final boolean NCDFE_EXCEPTION = false; + + public static void main(String[] args) throws Exception { + + // Test that the JVM throws CFE for constant pool CONSTANT_Module type, for + // class file version 53, when ACC_MODULE is not set in the access_flags. + ConstModule.write_and_load(Opcodes.V1_9, + Opcodes.ACC_INTERFACE + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC, + "jdk.fooMod", "FooMod", MODULE_TEST, CFE_EXCEPTION); + + // Test that the JVM throws NCDFE for constant pool CONSTANT_Module type, + // for class file version 53, when ACC_MODULE is set in the access_flags. + ConstModule.write_and_load(Opcodes.V1_9, + Opcodes.ACC_INTERFACE + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC + ACC_MODULE, + "jdk.fooModACC", "FooModACC", MODULE_TEST, NCDFE_EXCEPTION); + + // Test that the JVM throws CFE for constant pool CONSTANT_Module type, for + // class file version 52, even when ACC_MODULE is set in the access_flags. + ConstModule.write_and_load(Opcodes.V1_8, + Opcodes.ACC_INTERFACE + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC + ACC_MODULE, + "jdk.fooModACC52", "FooModACC52", MODULE_TEST, CFE_EXCEPTION); + + // Test that the JVM throws CFE for constant pool CONSTANT_Package type, for + // class file version 53, when ACC_MODULE is not set in the access_flags. + ConstModule.write_and_load(Opcodes.V1_9, + Opcodes.ACC_INTERFACE + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC, + "jdk.fooPkg", "FooPkg", PACKAGE_TEST, CFE_EXCEPTION); + + // Test that the JVM throws NCDFE for constant pool CONSTANT_Package type, + // for class file version 53, when ACC_MODULE is set in the access_flags. + ConstModule.write_and_load(Opcodes.V1_9, + Opcodes.ACC_INTERFACE + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC + ACC_MODULE, + "jdk.fooModACC", "FooModACC", PACKAGE_TEST, NCDFE_EXCEPTION); + + // Test that the JVM throws CFE for constant pool CONSTANT_Package type, for + // class file version 52, even when ACC_MODULE is set in the access_flags. + ConstModule.write_and_load(Opcodes.V1_8, + Opcodes.ACC_INTERFACE + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC + ACC_MODULE, + "jdk.fooModACC52", "FooModACC52", PACKAGE_TEST, CFE_EXCEPTION); + + } + + public static void write_and_load(int version, + int access_flags, + String attr, + String class_name, + boolean module_test, + boolean throwCFE) throws Exception { + ClassWriter cw = new ClassWriter(0); + cw.visit(version, + access_flags, + class_name, + null, + "java/lang/Object", + null); + + if (module_test) + cw.visitAttribute(new TestModuleAttribute(attr)); + else + cw.visitAttribute(new TestPackageAttribute(attr)); + + cw.visitEnd(); + byte[] bytes = cw.toByteArray(); + + + ClassLoader loader = new ClassLoader(ConstModule.class.getClassLoader()) { + @Override + protected Class findClass(String cn)throws ClassNotFoundException { + if (cn.equals(class_name)) { + try { + Class superClass = super.defineClass(cn, bytes, 0, bytes.length); + throw new RuntimeException("Expected ClassFormatError not thrown"); + } catch (java.lang.ClassFormatError e) { + if (!throwCFE) { + throw new RuntimeException("Unexpected ClassFormatError exception: " + e.getMessage()); + } + if (module_test && !e.getMessage().contains( + "Unknown constant tag 19 in class file")) { + throw new RuntimeException("Wrong ClassFormatError exception: " + e.getMessage()); + } else if (!module_test && !e.getMessage().contains( + "Unknown constant tag 20 in class file")) { + throw new RuntimeException("Wrong ClassFormatError exception: " + e.getMessage()); + } + } catch (java.lang.NoClassDefFoundError f) { + if (throwCFE) { + throw new RuntimeException("Unexpected NoClassDefFoundError exception: " + f.getMessage()); + } + if (!f.getMessage().contains( + "is not a class because access_flag ACC_MODULE is set")) { + throw new RuntimeException("Wrong NoClassDefFoundError exception: " + f.getMessage()); + } + } + } else { + throw new ClassNotFoundException(cn); + } + return null; + } + }; + + Class clazz = loader.loadClass(class_name); + } + + /** + * ConstModuleAttr attribute. + * + *
 {@code
+     *
+     * MainClass_attribute {
+     *   // index to CONSTANT_utf8_info structure in constant pool representing
+     *   // the string "ConstModuleAttr"
+     *   u2 attribute_name_index;
+     *   u4 attribute_length;
+     *
+     *   // index to CONSTANT_Module_info structure
+     *   u2 module_name_index
+     * }
+     *
+     * } 
+ */ + public static class TestModuleAttribute extends Attribute { + private final String moduleName; + + public TestModuleAttribute(String moduleName) { + super("ConstModuleAttr"); + this.moduleName = moduleName; + } + + public TestModuleAttribute() { + this(null); + } + + @Override + protected Attribute read(ClassReader cr, + int off, + int len, + char[] buf, + int codeOff, + Label[] labels) + { + String mn = cr.readModule(off, buf); + off += 2; + return new TestModuleAttribute(mn); + } + + @Override + protected ByteVector write(ClassWriter cw, + byte[] code, + int len, + int maxStack, + int maxLocals) + { + ByteVector attr = new ByteVector(); + attr.putShort(cw.newModule(moduleName)); + return attr; + } + } + + /** + * ConstPackageAttr attribute. + * + *
 {@code
+     *
+     * MainClass_attribute {
+     *   // index to CONSTANT_utf8_info structure in constant pool representing
+     *   // the string "ConstPackageAttr"
+     *   u2 attribute_name_index;
+     *   u4 attribute_length;
+     *
+     *   // index to CONSTANT_Package_info structure
+     *   u2 module_name_index
+     * }
+     *
+     * } 
+ */ + public static class TestPackageAttribute extends Attribute { + private final String packageName; + + public TestPackageAttribute(String packageName) { + super("ConstPackageAttr"); + this.packageName = packageName; + } + + public TestPackageAttribute() { + this(null); + } + + @Override + protected Attribute read(ClassReader cr, + int off, + int len, + char[] buf, + int codeOff, + Label[] labels) + { + String mn = cr.readPackage(off, buf); + off += 2; + return new TestPackageAttribute(mn); + } + + @Override + protected ByteVector write(ClassWriter cw, + byte[] code, + int len, + int maxStack, + int maxLocals) + { + ByteVector attr = new ByteVector(); + attr.putShort(cw.newPackage(packageName)); + return attr; + } + } +} diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/runtime/duplAttributes/DupSignatureAttrs.jcod --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/duplAttributes/DupSignatureAttrs.jcod Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,615 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// Class containing duplicate Signature attributes. Loading it should cause a +// ClassFormatError exception. +class DupClassSigAttrs { + 0xCAFEBABE; + 0; // minor version + 53; // version + [33] { // Constant Pool + ; // first element is empty + Method #6 #17; // #1 at 0x0A + Field #18 #19; // #2 at 0x0F + String #20; // #3 at 0x14 + Method #21 #22; // #4 at 0x17 + class #23; // #5 at 0x1C + class #24; // #6 at 0x1F + Utf8 ""; // #7 at 0x22 + Utf8 "()V"; // #8 at 0x2B + Utf8 "Code"; // #9 at 0x31 + Utf8 "LineNumberTable"; // #10 at 0x38 + Utf8 "main"; // #11 at 0x4A + Utf8 "([Ljava/lang/String;)V"; // #12 at 0x51 + Utf8 "Exceptions"; // #13 at 0x6A + class #25; // #14 at 0x77 + Utf8 "SourceFile"; // #15 at 0x7A + Utf8 "DupClassSigAttrs.java"; // #16 at 0x87 + NameAndType #7 #8; // #17 at 0x9F + class #26; // #18 at 0xA4 + NameAndType #27 #28; // #19 at 0xA7 + Utf8 "hi"; // #20 at 0xAC + class #29; // #21 at 0xB1 + NameAndType #30 #31; // #22 at 0xB4 + Utf8 "DupClassSigAttrs"; // #23 at 0xB9 + Utf8 "java/lang/Object"; // #24 at 0xCC + Utf8 "java/lang/Throwable"; // #25 at 0xDF + Utf8 "java/lang/System"; // #26 at 0xF5 + Utf8 "out"; // #27 at 0x0108 + Utf8 "Ljava/io/PrintStream;"; // #28 at 0x010E + Utf8 "java/io/PrintStream"; // #29 at 0x0126 + Utf8 "println"; // #30 at 0x013C + Utf8 "(Ljava/lang/String;)V"; // #31 at 0x0146 + Utf8 "Signature"; // #32 at 0x015E + } // Constant Pool + + 0x0021; // access + #5;// this_cpx + #6;// super_cpx + + [0] { // Interfaces + } // Interfaces + + [0] { // fields + } // fields + + [2] { // methods + { // Member at 0x0176 + 0x0001; // access + #7; // name_cpx + #8; // sig_cpx + [1] { // Attributes + Attr(#9, 29) { // Code at 0x017E + 1; // max_stack + 1; // max_locals + Bytes[5]{ + 0x2AB70001B1; + }; + [0] { // Traps + } // end Traps + [1] { // Attributes + Attr(#10, 6) { // LineNumberTable at 0x0195 + [1] { // LineNumberTable + 0 1; // at 0x01A1 + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + ; + { // Member at 0x01A1 + 0x0009; // access + #11; // name_cpx + #12; // sig_cpx + [2] { // Attributes + Attr(#9, 37) { // Code at 0x01A9 + 2; // max_stack + 1; // max_locals + Bytes[9]{ + 0xB200021203B60004; + 0xB1; + }; + [0] { // Traps + } // end Traps + [1] { // Attributes + Attr(#10, 10) { // LineNumberTable at 0x01C4 + [2] { // LineNumberTable + 0 4; // at 0x01D0 + 8 5; // at 0x01D4 + } + } // end LineNumberTable + } // Attributes + } // end Code + ; + Attr(#13, 4) { // Exceptions at 0x01D4 + [1] { // Exceptions + #14; // at 0x01DE + } + } // end Exceptions + } // Attributes + } // Member + } // methods + + [3] { // Attributes + Attr(#15, 2) { // SourceFile at 0x01E0 + #16; + } // end SourceFile + ; + Attr(#32, 2) { // Signature at 0x01E8 + #16; + } // end Signature + ; + Attr(#32, 2) { // *** Duplicate *** Signature at 0x01F0 + #16; + } // end Signature + } // Attributes +} // end class DupClassSigAttrs + + +// Class containing a method with duplicate Signature attributes. Loading it +// should cause a ClassFormatError exception. +class DupMthSigAttrs { + 0xCAFEBABE; + 0; // minor version + 53; // version + [33] { // Constant Pool + ; // first element is empty + Method #6 #17; // #1 at 0x0A + Field #18 #19; // #2 at 0x0F + String #20; // #3 at 0x14 + Method #21 #22; // #4 at 0x17 + class #23; // #5 at 0x1C + class #24; // #6 at 0x1F + Utf8 ""; // #7 at 0x22 + Utf8 "()V"; // #8 at 0x2B + Utf8 "Code"; // #9 at 0x31 + Utf8 "LineNumberTable"; // #10 at 0x38 + Utf8 "main"; // #11 at 0x4A + Utf8 "([Ljava/lang/String;)V"; // #12 at 0x51 + Utf8 "Exceptions"; // #13 at 0x6A + class #25; // #14 at 0x77 + Utf8 "SourceFile"; // #15 at 0x7A + Utf8 "DupMthSigAttrs.java"; // #16 at 0x87 + NameAndType #7 #8; // #17 at 0x9D + class #26; // #18 at 0xA2 + NameAndType #27 #28; // #19 at 0xA5 + Utf8 "hi"; // #20 at 0xAA + class #29; // #21 at 0xAF + NameAndType #30 #31; // #22 at 0xB2 + Utf8 "DupMthSigAttrs"; // #23 at 0xB7 + Utf8 "java/lang/Object"; // #24 at 0xC8 + Utf8 "java/lang/Throwable"; // #25 at 0xDB + Utf8 "java/lang/System"; // #26 at 0xF1 + Utf8 "out"; // #27 at 0x0104 + Utf8 "Ljava/io/PrintStream;"; // #28 at 0x010A + Utf8 "java/io/PrintStream"; // #29 at 0x0122 + Utf8 "println"; // #30 at 0x0138 + Utf8 "(Ljava/lang/String;)V"; // #31 at 0x0142 + Utf8 "Signature"; // #32 at 0x015A + } // Constant Pool + + 0x0021; // access + #5;// this_cpx + #6;// super_cpx + + [0] { // Interfaces + } // Interfaces + + [0] { // fields + } // fields + + [2] { // methods + { // Member at 0x0172 + 0x0001; // access + #7; // name_cpx + #8; // sig_cpx + [1] { // Attributes + Attr(#9, 29) { // Code at 0x017A + 1; // max_stack + 1; // max_locals + Bytes[5]{ + 0x2AB70001B1; + }; + [0] { // Traps + } // end Traps + [1] { // Attributes + Attr(#10, 6) { // LineNumberTable at 0x0191 + [1] { // LineNumberTable + 0 1; // at 0x019D + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + ; + { // Member at 0x019D + 0x0009; // access + #11; // name_cpx + #12; // sig_cpx + [4] { // Attributes + Attr(#9, 37) { // Code at 0x01A5 + 2; // max_stack + 1; // max_locals + Bytes[9]{ + 0xB200021203B60004; + 0xB1; + }; + [0] { // Traps + } // end Traps + [1] { // Attributes + Attr(#10, 10) { // LineNumberTable at 0x01C0 + [2] { // LineNumberTable + 0 4; // at 0x01CC + 8 5; // at 0x01D0 + } + } // end LineNumberTable + } // Attributes + } // end Code + ; + Attr(#32, 2) { // Signature at 0x01D0 + #16; + } // end Signature + ; + Attr(#13, 4) { // Exceptions at 0x01D8 + [1] { // Exceptions + #14; // at 0x01E2 + } + } // end Exceptions + ; + Attr(#32, 2) { // *** Duplicate *** Signature at 0x01E2 + #16; + } // end Signature + } // Attributes + } // Member + } // methods + + [1] { // Attributes + Attr(#15, 2) { // SourceFile at 0x01EC + #16; + } // end SourceFile + } // Attributes +} // end class DupMthSigAttrs + + +// Class containing a field with duplicate Signature attributes. Loading it +// should cause a ClassFormatError exception. +class DupFldSigAttrs { + 0xCAFEBABE; + 0; // minor version + 53; // version + [42] { // Constant Pool + ; // first element is empty + Method #9 #23; // #1 at 0x0A + Field #24 #25; // #2 at 0x0F + Field #8 #26; // #3 at 0x14 + Method #27 #28; // #4 at 0x19 + class #29; // #5 at 0x1E + String #30; // #6 at 0x21 + Method #5 #31; // #7 at 0x24 + class #32; // #8 at 0x29 + class #33; // #9 at 0x2C + Utf8 "str"; // #10 at 0x2F + Utf8 "Ljava/lang/String;"; // #11 at 0x35 + Utf8 ""; // #12 at 0x4A + Utf8 "()V"; // #13 at 0x53 + Utf8 "Code"; // #14 at 0x59 + Utf8 "LineNumberTable"; // #15 at 0x60 + Utf8 "main"; // #16 at 0x72 + Utf8 "([Ljava/lang/String;)V"; // #17 at 0x79 + Utf8 "Exceptions"; // #18 at 0x92 + class #34; // #19 at 0x9F + Utf8 ""; // #20 at 0xA2 + Utf8 "SourceFile"; // #21 at 0xAD + Utf8 "DupFldSigAttrs.java"; // #22 at 0xBA + NameAndType #12 #13; // #23 at 0xD0 + class #35; // #24 at 0xD5 + NameAndType #36 #37; // #25 at 0xD8 + NameAndType #10 #11; // #26 at 0xDD + class #38; // #27 at 0xE2 + NameAndType #39 #40; // #28 at 0xE5 + Utf8 "java/lang/String"; // #29 at 0xEA + Utf8 "Hi"; // #30 at 0xFD + NameAndType #12 #40; // #31 at 0x0102 + Utf8 "DupFldSigAttrs"; // #32 at 0x0107 + Utf8 "java/lang/Object"; // #33 at 0x0118 + Utf8 "java/lang/Throwable"; // #34 at 0x012B + Utf8 "java/lang/System"; // #35 at 0x0141 + Utf8 "out"; // #36 at 0x0154 + Utf8 "Ljava/io/PrintStream;"; // #37 at 0x015A + Utf8 "java/io/PrintStream"; // #38 at 0x0172 + Utf8 "println"; // #39 at 0x0188 + Utf8 "(Ljava/lang/String;)V"; // #40 at 0x0192 + Utf8 "Signature"; // #41 at 0x01AA + } // Constant Pool + + 0x0021; // access + #8;// this_cpx + #9;// super_cpx + + [0] { // Interfaces + } // Interfaces + + [1] { // fields + { // Member at 0x01C0 + 0x0008; // access + #10; // name_cpx + #11; // sig_cpx + [2] { // Attributes + Attr(#41, 2) { // Signature at 0x01C8 + #16; + } // end Signature + ; + Attr(#41, 2) { // *** Duplicate *** Signature at 0x01D0 + #16; + } // end Signature + } // Attributes + } // Member + } // fields + + [3] { // methods + { // Member at 0x01DA + 0x0001; // access + #12; // name_cpx + #13; // sig_cpx + [1] { // Attributes + Attr(#14, 29) { // Code at 0x01E2 + 1; // max_stack + 1; // max_locals + Bytes[5]{ + 0x2AB70001B1; + }; + [0] { // Traps + } // end Traps + [1] { // Attributes + Attr(#15, 6) { // LineNumberTable at 0x01F9 + [1] { // LineNumberTable + 0 1; // at 0x0205 + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + ; + { // Member at 0x0205 + 0x0009; // access + #16; // name_cpx + #17; // sig_cpx + [2] { // Attributes + Attr(#14, 38) { // Code at 0x020D + 2; // max_stack + 1; // max_locals + Bytes[10]{ + 0xB20002B20003B600; + 0x04B1; + }; + [0] { // Traps + } // end Traps + [1] { // Attributes + Attr(#15, 10) { // LineNumberTable at 0x0229 + [2] { // LineNumberTable + 0 6; // at 0x0235 + 9 7; // at 0x0239 + } + } // end LineNumberTable + } // Attributes + } // end Code + ; + Attr(#18, 4) { // Exceptions at 0x0239 + [1] { // Exceptions + #19; // at 0x0243 + } + } // end Exceptions + } // Attributes + } // Member + ; + { // Member at 0x0243 + 0x0008; // access + #20; // name_cpx + #13; // sig_cpx + [1] { // Attributes + Attr(#14, 37) { // Code at 0x024B + 3; // max_stack + 0; // max_locals + Bytes[13]{ + 0xBB0005591206B700; + 0x07B30003B1; + }; + [0] { // Traps + } // end Traps + [1] { // Attributes + Attr(#15, 6) { // LineNumberTable at 0x026A + [1] { // LineNumberTable + 0 3; // at 0x0276 + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + } // methods + + [1] { // Attributes + Attr(#21, 2) { // SourceFile at 0x0278 + #22; + } // end SourceFile + } // Attributes +} // end class DupFldSigAttrs + + +// Class containing a Signature attribute and a field and methods with Signature +// attributes. Since neither the class nor any of its fields or methods have +// duplicate Signature attributes, loading this class should not cause a +// ClassFormatError exception. +class OkaySigAttrs { + 0xCAFEBABE; + 0; // minor version + 53; // version + [42] { // Constant Pool + ; // first element is empty + Method #9 #23; // #1 at 0x0A + Field #24 #25; // #2 at 0x0F + Field #8 #26; // #3 at 0x14 + Method #27 #28; // #4 at 0x19 + class #29; // #5 at 0x1E + String #30; // #6 at 0x21 + Method #5 #31; // #7 at 0x24 + class #32; // #8 at 0x29 + class #33; // #9 at 0x2C + Utf8 "str"; // #10 at 0x2F + Utf8 "Ljava/lang/String;"; // #11 at 0x35 + Utf8 ""; // #12 at 0x4A + Utf8 "()V"; // #13 at 0x53 + Utf8 "Code"; // #14 at 0x59 + Utf8 "LineNumberTable"; // #15 at 0x60 + Utf8 "main"; // #16 at 0x72 + Utf8 "([Ljava/lang/String;)V"; // #17 at 0x79 + Utf8 "Exceptions"; // #18 at 0x92 + class #34; // #19 at 0x9F + Utf8 ""; // #20 at 0xA2 + Utf8 "SourceFile"; // #21 at 0xAD + Utf8 "OkaySigAttrs.java"; // #22 at 0xBA + NameAndType #12 #13; // #23 at 0xCE + class #35; // #24 at 0xD3 + NameAndType #36 #37; // #25 at 0xD6 + NameAndType #10 #11; // #26 at 0xDB + class #38; // #27 at 0xE0 + NameAndType #39 #40; // #28 at 0xE3 + Utf8 "java/lang/String"; // #29 at 0xE8 + Utf8 "Hi"; // #30 at 0xFB + NameAndType #12 #40; // #31 at 0x0100 + Utf8 "OkaySigAttrs"; // #32 at 0x0105 + Utf8 "java/lang/Object"; // #33 at 0x0114 + Utf8 "java/lang/Throwable"; // #34 at 0x0127 + Utf8 "java/lang/System"; // #35 at 0x013D + Utf8 "out"; // #36 at 0x0150 + Utf8 "Ljava/io/PrintStream;"; // #37 at 0x0156 + Utf8 "java/io/PrintStream"; // #38 at 0x016E + Utf8 "println"; // #39 at 0x0184 + Utf8 "(Ljava/lang/String;)V"; // #40 at 0x018E + Utf8 "Signature"; // #41 at 0x01A6 + } // Constant Pool + + 0x0021; // access + #8;// this_cpx + #9;// super_cpx + + [0] { // Interfaces + } // Interfaces + + [1] { // fields + { // Member at 0x01BC + 0x0008; // access + #10; // name_cpx + #11; // sig_cpx + [1] { // Attributes + Attr(#41, 2) { // Signature at 0x01C4 + #16; + } // end Signature + } // Attributes + } // Member + } // fields + + [3] { // methods + { // Member at 0x01CE + 0x0001; // access + #12; // name_cpx + #13; // sig_cpx + [2] { // Attributes + Attr(#14, 29) { // Code at 0x01D6 + 1; // max_stack + 1; // max_locals + Bytes[5]{ + 0x2AB70001B1; + }; + [0] { // Traps + } // end Traps + [1] { // Attributes + Attr(#15, 6) { // LineNumberTable at 0x01ED + [1] { // LineNumberTable + 0 1; // at 0x01F9 + } + } // end LineNumberTable + } // Attributes + } // end Code + ; + Attr(#41, 2) { // Signature at 0x01F9 + #16; + } // end Signature + } // Attributes + } // Member + ; + { // Member at 0x0201 + 0x0009; // access + #16; // name_cpx + #17; // sig_cpx + [3] { // Attributes + Attr(#14, 38) { // Code at 0x0209 + 2; // max_stack + 1; // max_locals + Bytes[10]{ + 0xB20002B20003B600; + 0x04B1; + }; + [0] { // Traps + } // end Traps + [1] { // Attributes + Attr(#15, 10) { // LineNumberTable at 0x0225 + [2] { // LineNumberTable + 0 6; // at 0x0231 + 9 7; // at 0x0235 + } + } // end LineNumberTable + } // Attributes + } // end Code + ; + Attr(#41, 2) { // Signature at 0x0235 + #16; + } // end Signature + ; + Attr(#18, 4) { // Exceptions at 0x023D + [1] { // Exceptions + #19; // at 0x0247 + } + } // end Exceptions + } // Attributes + } // Member + ; + { // Member at 0x0247 + 0x0008; // access + #20; // name_cpx + #13; // sig_cpx + [1] { // Attributes + Attr(#14, 37) { // Code at 0x024F + 3; // max_stack + 0; // max_locals + Bytes[13]{ + 0xBB0005591206B700; + 0x07B30003B1; + }; + [0] { // Traps + } // end Traps + [1] { // Attributes + Attr(#15, 6) { // LineNumberTable at 0x026E + [1] { // LineNumberTable + 0 3; // at 0x027A + } + } // end LineNumberTable + } // Attributes + } // end Code + } // Attributes + } // Member + } // methods + + [2] { // Attributes + Attr(#21, 2) { // SourceFile at 0x027C + #22; + } // end SourceFile + ; + Attr(#41, 2) { // Signature at 0x0284 + #16; + } // end Signature + } // Attributes +} // end class OkaySigAttrs diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/runtime/duplAttributes/TestDupSignatureAttr.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/duplAttributes/TestDupSignatureAttr.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8176147 + * @summary Throw ClassFormatError exception for multiple Signature attributes + * @compile DupSignatureAttrs.jcod + * @run main TestDupSignatureAttr + */ + +public class TestDupSignatureAttr { + public static void main(String args[]) throws Throwable { + + System.out.println("Regression test for bug 8176147"); + + String[] badClasses = new String[] { + "DupClassSigAttrs", + "DupMthSigAttrs", + "DupFldSigAttrs", + }; + String[] messages = new String[] { + "Multiple Signature attributes in class file", + "Multiple Signature attributes for method", + "Multiple Signature attributes for field", + }; + + for (int x = 0; x < badClasses.length; x++) { + try { + Class newClass = Class.forName(badClasses[x]); + throw new RuntimeException("Expected ClassFormatError exception not thrown"); + } catch (java.lang.ClassFormatError e) { + if (!e.getMessage().contains(messages[x])) { + throw new RuntimeException("Wrong ClassFormatError exception thrown: " + + e.getMessage()); + } + } + } + + // Multiple Signature attributes but no duplicates. + Class newClass = Class.forName("OkaySigAttrs"); + } +} diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/runtime/jni/CallWithJNIWeak/CallWithJNIWeak.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/jni/CallWithJNIWeak/CallWithJNIWeak.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8166188 + * @summary Test call of native function with JNI weak global ref. + * @modules java.base + * @run main/othervm/native CallWithJNIWeak + */ + +public class CallWithJNIWeak { + static { + System.loadLibrary("CallWithJNIWeak"); + } + + private static native void testJNIFieldAccessors(CallWithJNIWeak o); + + // The field initializations must be kept in sync with the JNI code + // which reads verifies the values of these fields. + private int i = 1; + private long j = 2; + private boolean z = true; + private char c = 'a'; + private short s = 3; + private float f = 1.0f; + private double d = 2.0; + private Object l; + + private CallWithJNIWeak() { + this.l = this; + } + + private native void weakReceiverTest0(); + private void weakReceiverTest() { + weakReceiverTest0(); + } + + private synchronized void synchonizedWeakReceiverTest() { + this.notifyAll(); + } + + + private static native void runTests(CallWithJNIWeak o); + + public static void main(String[] args) { + CallWithJNIWeak w = new CallWithJNIWeak(); + for (int i = 0; i < 20000; i++) { + runTests(w); + } + } +} diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/runtime/jni/CallWithJNIWeak/libCallWithJNIWeak.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/jni/CallWithJNIWeak/libCallWithJNIWeak.c Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include + +/* + * Class: CallWithJNIWeak + * Method: testJNIFieldAccessors + * Signature: (LCallWithJNIWeak;)V + */ +JNIEXPORT void JNICALL +Java_CallWithJNIWeak_testJNIFieldAccessors(JNIEnv *env, jclass clazz, jobject this) { + // Make sure that we have a weak reference to the receiver + + jweak self = (*env)->NewWeakGlobalRef(env, this); + + jclass this_class = (*env)->GetObjectClass(env, self); + + jclass exception = (*env)->FindClass(env, "java/lang/RuntimeException"); + + jfieldID id_i = (*env)->GetFieldID(env, this_class, "i", "I"); + jfieldID id_j = (*env)->GetFieldID(env, this_class, "j", "J"); + jfieldID id_z = (*env)->GetFieldID(env, this_class, "z", "Z"); + jfieldID id_c = (*env)->GetFieldID(env, this_class, "c", "C"); + jfieldID id_s = (*env)->GetFieldID(env, this_class, "s", "S"); + jfieldID id_f = (*env)->GetFieldID(env, this_class, "f", "F"); + jfieldID id_d = (*env)->GetFieldID(env, this_class, "d", "D"); + jfieldID id_l = (*env)->GetFieldID(env, this_class, "l", "Ljava/lang/Object;"); + jvalue v; + +#define CHECK(variable, expected) \ + do { \ + if ((variable) != (expected)) { \ + (*env)->ThrowNew(env, exception, #variable" != " #expected); \ + return; \ + } \ + } while(0) + + // The values checked below must be kept in sync with the Java source file. + + v.i = (*env)->GetIntField(env, self, id_i); + CHECK(v.i, 1); + + v.j = (*env)->GetLongField(env, self, id_j); + CHECK(v.j, 2); + + v.z = (*env)->GetBooleanField(env, self, id_z); + CHECK(v.z, JNI_TRUE); + + v.c = (*env)->GetCharField(env, self, id_c); + CHECK(v.c, 'a'); + + v.s = (*env)->GetShortField(env, self, id_s); + CHECK(v.s, 3); + + v.f = (*env)->GetFloatField(env, self, id_f); + CHECK(v.f, 1.0f); + + v.d = (*env)->GetDoubleField(env, self, id_d); + CHECK(v.d, 2.0); + +#undef CHECK + + v.l = (*env)->GetObjectField(env, self, id_l); + if (v.l == NULL) { + (*env)->ThrowNew(env, exception, "Object field was null"); + return; + } + { + jclass clz = (*env)->GetObjectClass(env, v.l); + if (!(*env)->IsSameObject(env, clazz, clz)) { + (*env)->ThrowNew(env, exception, "Bad object class"); + } + } + + (*env)->DeleteWeakGlobalRef(env, self); +} + +/* + * Class: CallWithJNIWeak + * Method: runTests + * Signature: (LCallWithJNIWeak;)V + */ +JNIEXPORT void JNICALL +Java_CallWithJNIWeak_runTests(JNIEnv *env, jclass clazz, jobject this) { + jweak that = (*env)->NewWeakGlobalRef(env, this); + { + jmethodID method = (*env)->GetStaticMethodID(env, + clazz, "testJNIFieldAccessors", "(LCallWithJNIWeak;)V"); + (*env)->CallStaticVoidMethod(env, clazz, method, that); + if ((*env)->ExceptionCheck(env)) { + return; + } + } + + { + jmethodID method = (*env)->GetMethodID(env, clazz, "weakReceiverTest", "()V"); + (*env)->CallVoidMethod(env, that, method); + if ((*env)->ExceptionCheck(env)) { + return; + } + } + + { + jmethodID method = (*env)->GetMethodID(env, clazz, "synchonizedWeakReceiverTest", "()V"); + (*env)->CallVoidMethod(env, that, method); + if ((*env)->ExceptionCheck(env)) { + return; + } + } + (*env)->DeleteWeakGlobalRef(env, that); +} + +/* + * Class: CallWithJNIWeak + * Method: weakReceiverTest0 + * Signature: ()V + */ +JNIEXPORT void JNICALL +Java_CallWithJNIWeak_weakReceiverTest0(JNIEnv *env, jobject obj) { + (*env)->GetObjectClass(env, obj); +} diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/runtime/jni/ReturnJNIWeak/ReturnJNIWeak.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/jni/ReturnJNIWeak/ReturnJNIWeak.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8166188 + * @requires vm.opt.ExplicitGCInvokesConcurrent != true + * @summary Test return of JNI weak global refs from native calls. + * @modules java.base + * @run main/othervm/native -Xint ReturnJNIWeak + * @run main/othervm/native -Xcomp ReturnJNIWeak + */ + +public final class ReturnJNIWeak { + + static { + System.loadLibrary("ReturnJNIWeak"); + } + + private static final class TestObject { + public final int value; + + public TestObject(int value) { + this.value = value; + } + } + + private static volatile TestObject testObject = null; + + private static native void registerObject(Object o); + private static native void unregisterObject(); + private static native Object getObject(); + + // Create the test object and record it both strongly and weakly. + private static void remember(int value) { + TestObject o = new TestObject(value); + registerObject(o); + testObject = o; + } + + // Remove both strong and weak references to the current test object. + private static void forget() { + unregisterObject(); + testObject = null; + } + + // Verify the weakly recorded object + private static void checkValue(int value) throws Exception { + Object o = getObject(); + if (o == null) { + throw new RuntimeException("Weak reference unexpectedly null"); + } + TestObject t = (TestObject)o; + if (t.value != value) { + throw new RuntimeException("Incorrect value"); + } + } + + // Verify we can create a weak reference and get it back. + private static void testSanity() throws Exception { + System.out.println("running testSanity"); + int value = 5; + try { + remember(value); + checkValue(value); + } finally { + forget(); + } + } + + // Verify weak ref value survives across collection if strong ref exists. + private static void testSurvival() throws Exception { + System.out.println("running testSurvival"); + int value = 10; + try { + remember(value); + checkValue(value); + System.gc(); + // Verify weak ref still has expected value. + checkValue(value); + } finally { + forget(); + } + } + + // Verify weak ref cleared if no strong ref exists. + private static void testClear() throws Exception { + System.out.println("running testClear"); + int value = 15; + try { + remember(value); + checkValue(value); + // Verify still good. + checkValue(value); + // Drop reference. + testObject = null; + System.gc(); + // Verify weak ref cleared as expected. + Object recorded = getObject(); + if (recorded != null) { + throw new RuntimeException("expected clear"); + } + } finally { + forget(); + } + } + + public static void main(String[] args) throws Exception { + testSanity(); + testSurvival(); + testClear(); + } +} diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/runtime/jni/ReturnJNIWeak/libReturnJNIWeak.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/runtime/jni/ReturnJNIWeak/libReturnJNIWeak.c Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * Native support for ReturnJNIWeak test. + */ + +#include "jni.h" + +static jweak registered = NULL; + +JNIEXPORT void JNICALL +Java_ReturnJNIWeak_registerObject(JNIEnv* env, + jclass jclazz, + jobject value) { + // assert registered == NULL + registered = (*env)->NewWeakGlobalRef(env, value); +} + +JNIEXPORT void JNICALL +Java_ReturnJNIWeak_unregisterObject(JNIEnv* env, jclass jclazz) { + if (registered != NULL) { + (*env)->DeleteWeakGlobalRef(env, registered); + registered = NULL; + } +} + +JNIEXPORT jobject JNICALL +Java_ReturnJNIWeak_getObject(JNIEnv* env, jclass jclazz) { + // assert registered != NULL + return registered; +} diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java --- a/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,7 @@ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( "-D" + prop + "=" + value, "-version"); OutputAnalyzer output = new OutputAnalyzer(pb.start()); - output.shouldContain("java version "); + output.shouldContain(" version "); output.shouldHaveExitValue(0); // Ensure that the property and its value aren't available. diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/serviceability/jvmti/GetNamedModule/libGetNamedModuleTest.c --- a/hotspot/test/serviceability/jvmti/GetNamedModule/libGetNamedModuleTest.c Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/test/serviceability/jvmti/GetNamedModule/libGetNamedModuleTest.c Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -183,7 +183,7 @@ err = (*jvmti)->GetNamedModule(jvmti, loader, pkg_name, module_ptr); if (err != JVMTI_ERROR_NONE) { printf(" Error in GetNamedModule for package \"%s\": %s (%d)\n", - pkg_name, TranslateError(err), err); + name, TranslateError(err), err); return err; } printf(" returned module: %p\n", *module_ptr); diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/test_env.sh --- a/hotspot/test/test_env.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/test/test_env.sh Wed Jul 05 23:09:40 2017 +0200 @@ -214,6 +214,11 @@ then VM_CPU="aarch64" fi +grep "arm64" vm_version.out > ${NULL} +if [ $? = 0 ] +then + VM_CPU="aarch64" +fi export VM_TYPE VM_BITS VM_OS VM_CPU echo "VM_TYPE=${VM_TYPE}" echo "VM_BITS=${VM_BITS}" diff -r 18569c523d38 -r c61cc8a34456 hotspot/test/testlibrary_tests/ctw/CtwTest.java --- a/hotspot/test/testlibrary_tests/ctw/CtwTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/hotspot/test/testlibrary_tests/ctw/CtwTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -37,6 +37,7 @@ import java.nio.file.StandardCopyOption; import java.nio.charset.Charset; +import jdk.test.lib.Platform; import jdk.test.lib.JDKToolFinder; import jdk.test.lib.process.OutputAnalyzer; import jdk.test.lib.process.ProcessTools; @@ -93,7 +94,12 @@ // concat CTW_COMMAND and args w/o 0th element String[] cmd = Arrays.copyOf(CTW_COMMAND, CTW_COMMAND.length + args.length - 1); System.arraycopy(args, 1, cmd, CTW_COMMAND.length, args.length - 1); - + if (Platform.isWindows()) { + // '*' has to be escaped on windows + for (int i = 0; i < cmd.length; ++i) { + cmd[i] = cmd[i].replace("*", "\"*\""); + } + } ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, cmd); OutputAnalyzer output = new OutputAnalyzer(pb.start()); dump(output, "compile"); diff -r 18569c523d38 -r c61cc8a34456 jaxp/.hgtags --- a/jaxp/.hgtags Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/.hgtags Wed Jul 05 23:09:40 2017 +0200 @@ -405,3 +405,6 @@ 5695854e8831d0c088ab0ecf83b367ec16c9760a jdk-9+159 fb8f2c8e15295120ff0f281dc057cfffb309e90e jdk-9+160 51b63f1b8001a48a16805b43babc3af7b314d501 jdk-9+161 +d02b6fbcab06c59a5f5a4a6736bd4ec6d2567855 jdk-9+162 +92a38c75cd277d8b11f4382511a62087044659a1 jdk-9+163 +6dc790a4e8310c86712cfdf7561a9820818546e6 jdk-9+164 diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java Wed Jul 05 23:09:40 2017 +0200 @@ -486,7 +486,7 @@ ModuleDescriptor descriptor = ModuleDescriptor.newModule(mn, Set.of(ModuleDescriptor.Modifier.SYNTHETIC)) .requires("java.xml") - .exports(pn) + .exports(pn, Set.of("java.xml")) .build(); Module m = createModule(descriptor, loader); diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogImpl.java --- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogImpl.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogImpl.java Wed Jul 05 23:09:40 2017 +0200 @@ -88,6 +88,7 @@ /** * Construct a Catalog with specified URI. * + * @param f the features object * @param uris the uri(s) to one or more catalogs * @throws CatalogException If an error happens while parsing the specified * catalog file. @@ -100,6 +101,7 @@ * Construct a Catalog with specified URI. * * @param parent The parent catalog + * @param f the features object * @param uris the uri(s) to one or more catalogs * @throws CatalogException If an error happens while parsing the specified * catalog file. @@ -137,7 +139,7 @@ for (String temp : catalogFile) { uri = URI.create(temp); start++; - if (verifyCatalogFile(uri)) { + if (verifyCatalogFile(null, uri)) { systemId = temp; try { baseURI = new URL(systemId); @@ -169,12 +171,14 @@ parse(systemId); } + setCatalog(this); + //save this catalog before loading the next loadedCatalogs.put(systemId, this); //Load delegate and alternative catalogs if defer is false. if (!isDeferred()) { - loadDelegateCatalogs(); + loadDelegateCatalogs(this); loadNextCatalogs(); } } @@ -365,14 +369,16 @@ //Check those specified in nextCatalogs if (nextCatalogs != null) { while (c == null && nextCatalogIndex < nextCatalogs.size()) { - c = getCatalog(nextCatalogs.get(nextCatalogIndex++).getCatalogURI()); + c = getCatalog(catalog, + nextCatalogs.get(nextCatalogIndex++).getCatalogURI()); } } //Check the input list if (c == null && inputFiles != null) { while (c == null && inputFilesIndex < inputFiles.size()) { - c = getCatalog(URI.create(inputFiles.get(inputFilesIndex++))); + c = getCatalog(null, + URI.create(inputFiles.get(inputFilesIndex++))); } } @@ -408,14 +414,14 @@ //loads catalogs specified in nextCatalogs if (nextCatalogs != null) { nextCatalogs.stream().forEach((next) -> { - getCatalog(next.getCatalogURI()); + getCatalog(this, next.getCatalogURI()); }); } //loads catalogs from the input list if (inputFiles != null) { inputFiles.stream().forEach((uri) -> { - getCatalog(URI.create(uri)); + getCatalog(null, URI.create(uri)); }); } } @@ -423,17 +429,19 @@ /** * Returns a Catalog object by the specified path. * - * @param path the path to a catalog + * @param parent the parent catalog for the alternative catalogs to be loaded. + * It will be null if the ones to be loaded are from the input list. + * @param uri the path to a catalog * @return a Catalog object */ - Catalog getCatalog(URI uri) { + Catalog getCatalog(CatalogImpl parent, URI uri) { if (uri == null) { return null; } CatalogImpl c = null; - if (verifyCatalogFile(uri)) { + if (verifyCatalogFile(parent, uri)) { c = getLoadedCatalog(uri.toASCIIString()); if (c == null) { c = new CatalogImpl(this, features, uri); @@ -459,6 +467,6 @@ * @return a count of all loaded catalogs */ int loadedCatalogCount() { - return loadedCatalogs.size() + delegateCatalogs.size(); + return loadedCatalogs.size(); } } diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogMessages.properties --- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogMessages.properties Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/CatalogMessages.properties Wed Jul 05 23:09:40 2017 +0200 @@ -1,4 +1,4 @@ -# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -21,25 +21,32 @@ # or visit www.oracle.com if you need additional information or have any # questions. -# Messages for message reporting -BadMessageKey = The error message corresponding to the message key can not be found. -FormatFailed = An internal error occurred while formatting the following message:\n +# General errors +BadMessageKey = JAXP09000001: The error message corresponding to the message key can not be found. +FormatFailed = JAXP09000002: An internal error occurred while formatting the following message:\n +OtherError = JAXP09000003: Unexpected error. -#invalid catalog file -InvalidCatalog = The document element of a catalog must be catalog. -InvalidEntryType = The entry type ''{0}'' is not valid. -CircularReference = Circular reference is not allowed: ''{0}''. +# Implementation restriction +CircularReference = JAXP09010001: Circular reference is not allowed: ''{0}''. -#errors -UriNotAbsolute = The specified URI ''{0}'' is not absolute. -UriNotValidUrl = The specified URI ''{0}'' is not a valid URL. -InvalidArgument = The specified argument ''{0}'' (case sensitive) for ''{1}'' is not valid. -NullArgument = The argument ''{0}'' can not be null. -InvalidPath = The path ''{0}'' is invalid. -ParserConf = Unexpected error while configuring a SAX parser. -ParsingFailed = Failed to parse the catalog file. -NoCatalogFound = No Catalog is specified. -NoMatchFound = No match found for publicId ''{0}'' and systemId ''{1}''. -NoMatchURIFound = No match found for href ''{0}'' and base ''{1}''. -FailedCreatingURI = Can not construct URI using href ''{0}'' and base ''{1}''. -OtherError = Unexpected error. \ No newline at end of file +# Input or configuration errors +InvalidCatalog = JAXP09020001: The document element of a catalog must be catalog. +InvalidEntryType = JAXP09020002: The entry type ''{0}'' is not valid. +UriNotAbsolute = JAXP09020003: The specified URI ''{0}'' is not absolute. +UriNotValidUrl = JAXP09020004: The specified URI ''{0}'' is not a valid URL. +InvalidArgument = JAXP09020005: The specified argument ''{0}'' (case sensitive) for ''{1}'' is not valid. +NullArgument = JAXP09020006: The argument ''{0}'' can not be null. +InvalidPath = JAXP09020007: The path ''{0}'' is invalid. + + +# Parsing errors +ParserConf = JAXP09030001: Unexpected error while configuring a SAX parser. +ParsingFailed = JAXP09030002: Failed to parse the catalog file. +NoCatalogFound = JAXP09030003: No Catalog is specified. + + +# Resolving errors +NoMatchFound = JAXP09040001: No match found for publicId ''{0}'' and systemId ''{1}''. +NoMatchURIFound = JAXP09040002: No match found for href ''{0}'' and base ''{1}''. +FailedCreatingURI = JAXP09040003: Can not construct URI using href ''{0}'' and base ''{1}''. + diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/javax/xml/catalog/GroupEntry.java --- a/jaxp/src/java.xml/share/classes/javax/xml/catalog/GroupEntry.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/javax/xml/catalog/GroupEntry.java Wed Jul 05 23:09:40 2017 +0200 @@ -135,7 +135,8 @@ /** * Constructs a GroupEntry * - * @param type The type of the entry + * @param type the type of the entry + * @param parent the parent Catalog */ public GroupEntry(CatalogEntryType type, CatalogImpl parent) { super(type); @@ -165,9 +166,9 @@ } /** * Constructs a group entry. - * @param catalog The catalog this GroupEntry belongs - * @param base The baseURI attribute - * @param attributes The attributes + * @param catalog the catalog this GroupEntry belongs to + * @param base the baseURI attribute + * @param attributes the attributes */ public GroupEntry(CatalogImpl catalog, String base, String... attributes) { super(CatalogEntryType.GROUP, base); @@ -176,6 +177,15 @@ } /** + * Sets the catalog for this GroupEntry. + * + * @param catalog the catalog this GroupEntry belongs to + */ + void setCatalog(CatalogImpl catalog) { + this.catalog = catalog; + } + + /** * Adds an entry. * * @param entry The entry to be added. @@ -382,10 +392,9 @@ /** * Matches delegatePublic or delegateSystem against the specified id * - * @param isSystem The flag to indicate whether the delegate is system or - * public - * @param id The system or public id to be matched - * @return The URI string if a mapping is found, or null otherwise. + * @param type the type of the Catalog entry + * @param id the system or public id to be matched + * @return the URI string if a mapping is found, or null otherwise. */ private String matchDelegate(CatalogEntryType type, String id) { String match = null; @@ -412,7 +421,7 @@ //Check delegate Catalogs if (catalogId != null) { - Catalog delegateCatalog = loadCatalog(catalogId); + Catalog delegateCatalog = loadDelegateCatalog(catalog, catalogId); if (delegateCatalog != null) { if (type == CatalogEntryType.DELEGATESYSTEM) { @@ -430,30 +439,34 @@ /** * Loads all delegate catalogs. + * + * @param parent the parent catalog of the delegate catalogs */ - void loadDelegateCatalogs() { + void loadDelegateCatalogs(CatalogImpl parent) { entries.stream() .filter((entry) -> (entry.type == CatalogEntryType.DELEGATESYSTEM || entry.type == CatalogEntryType.DELEGATEPUBLIC || entry.type == CatalogEntryType.DELEGATEURI)) .map((entry) -> (AltCatalog)entry) .forEach((altCatalog) -> { - loadCatalog(altCatalog.getCatalogURI()); + loadDelegateCatalog(parent, altCatalog.getCatalogURI()); }); } /** * Loads a delegate catalog by the catalogId specified. - * @param catalogId the catalog Id + * + * @param parent the parent catalog of the delegate catalog + * @param catalogURI the URI to the catalog */ - Catalog loadCatalog(URI catalogURI) { + Catalog loadDelegateCatalog(CatalogImpl parent, URI catalogURI) { CatalogImpl delegateCatalog = null; if (catalogURI != null) { String catalogId = catalogURI.toASCIIString(); - delegateCatalog = getLoadedCatalog(catalogId); - if (delegateCatalog == null) { - if (verifyCatalogFile(catalogURI)) { - delegateCatalog = new CatalogImpl(catalog, features, catalogURI); + if (verifyCatalogFile(parent, catalogURI)) { + delegateCatalog = getLoadedCatalog(catalogId); + if (delegateCatalog == null) { + delegateCatalog = new CatalogImpl(parent, features, catalogURI); delegateCatalog.load(); delegateCatalogs.put(catalogId, delegateCatalog); } @@ -473,7 +486,7 @@ CatalogImpl getLoadedCatalog(String catalogId) { CatalogImpl c = null; - //checl delegate Catalogs + //check delegate Catalogs c = delegateCatalogs.get(catalogId); if (c == null) { //check other loaded Catalogs @@ -492,11 +505,12 @@ * Verifies that the catalog represented by the catalogId has not been * searched or is not circularly referenced. * - * @param catalogId The URI to a catalog + * @param parent the parent of the catalog to be loaded + * @param catalogURI the URI to the catalog * @throws CatalogException if circular reference is found. * @return true if the catalogId passed verification, false otherwise */ - final boolean verifyCatalogFile(URI catalogURI) { + final boolean verifyCatalogFile(CatalogImpl parent, URI catalogURI) { if (catalogURI == null) { return false; } @@ -508,7 +522,7 @@ } String catalogId = catalogURI.toASCIIString(); - if (catalogsSearched.contains(catalogId) || isCircular(catalogId)) { + if (catalogsSearched.contains(catalogId) || isCircular(parent, catalogId)) { CatalogMessages.reportRunTimeError(CatalogMessages.ERR_CIRCULAR_REFERENCE, new Object[]{CatalogMessages.sanitize(catalogId)}); } @@ -518,10 +532,13 @@ /** * Checks whether the catalog is circularly referenced + * + * @param parent the parent of the catalog to be loaded * @param systemId the system identifier of the catalog to be loaded * @return true if is circular, false otherwise */ - boolean isCircular(String systemId) { + boolean isCircular(CatalogImpl parent, String systemId) { + // first, check the parent of the catalog to be loaded if (parent == null) { return false; } @@ -530,6 +547,7 @@ return true; } - return parent.isCircular(systemId); + // next, check parent's parent + return parent.isCircular(parent.parent, systemId); } } diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/javax/xml/stream/FactoryFinder.java --- a/jaxp/src/java.xml/share/classes/javax/xml/stream/FactoryFinder.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/javax/xml/stream/FactoryFinder.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -270,7 +270,7 @@ "Failed to read factoryId '" + factoryId + "'", se); } - // Try read $java.home/lib/stax.properties followed by + // Try read $java.home/conf/stax.properties followed by // $java.home/conf/jaxp.properties if former not present String configFile = null; try { @@ -278,7 +278,7 @@ synchronized (cacheProps) { if (firstTime) { configFile = ss.getSystemProperty("java.home") + File.separator + - "lib" + File.separator + "stax.properties"; + "conf" + File.separator + "stax.properties"; final File fStax = new File(configFile); firstTime = false; if (ss.doesFileExist(fStax)) { diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/javax/xml/stream/XMLEventFactory.java --- a/jaxp/src/java.xml/share/classes/javax/xml/stream/XMLEventFactory.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/javax/xml/stream/XMLEventFactory.java Wed Jul 05 23:09:40 2017 +0200 @@ -155,7 +155,7 @@ * #newFactory(java.lang.String, java.lang.ClassLoader)} * method defines no changes in behavior. */ - @Deprecated(since="7") + @Deprecated(since="1.7") public static XMLEventFactory newInstance(String factoryId, ClassLoader classLoader) throws FactoryConfigurationError { diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/javax/xml/stream/XMLInputFactory.java --- a/jaxp/src/java.xml/share/classes/javax/xml/stream/XMLInputFactory.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/javax/xml/stream/XMLInputFactory.java Wed Jul 05 23:09:40 2017 +0200 @@ -222,7 +222,7 @@ * java.util.ServiceConfigurationError service configuration error} or if * the implementation is not available or cannot be instantiated. */ - @Deprecated(since="7") + @Deprecated(since="1.7") public static XMLInputFactory newFactory() throws FactoryConfigurationError { @@ -244,7 +244,7 @@ * #newFactory(java.lang.String, java.lang.ClassLoader)} method * defines no changes in behavior. */ - @Deprecated(since="7") + @Deprecated(since="1.7") public static XMLInputFactory newInstance(String factoryId, ClassLoader classLoader) throws FactoryConfigurationError { diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/javax/xml/stream/XMLOutputFactory.java --- a/jaxp/src/java.xml/share/classes/javax/xml/stream/XMLOutputFactory.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/javax/xml/stream/XMLOutputFactory.java Wed Jul 05 23:09:40 2017 +0200 @@ -222,7 +222,7 @@ * Use the new method {@link #newFactory(java.lang.String, * java.lang.ClassLoader)} instead. */ - @Deprecated(since="7") + @Deprecated(since="1.7") public static XMLInputFactory newInstance(String factoryId, ClassLoader classLoader) throws FactoryConfigurationError { diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathFactoryFinder.java --- a/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathFactoryFinder.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathFactoryFinder.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -176,9 +176,9 @@ String javah = ss.getSystemProperty( "java.home" ); String configFile = javah + File.separator + - "lib" + File.separator + "jaxp.properties"; + "conf" + File.separator + "jaxp.properties"; - // try to read from $java.home/lib/jaxp.properties + // try to read from $java.home/conf/jaxp.properties try { if(firstTime){ synchronized(cacheProps){ @@ -193,7 +193,7 @@ } } final String factoryClassName = cacheProps.getProperty(propertyName); - debugPrintln(()->"found " + factoryClassName + " in $java.home/jaxp.properties"); + debugPrintln(()->"found " + factoryClassName + " in $java.home/conf/jaxp.properties"); if (factoryClassName != null) { xpathFactory = createInstance(factoryClassName, true); diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/module-info.java --- a/jaxp/src/java.xml/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,6 +27,7 @@ * Defines the Java API for XML Processing (JAXP), the Streaming API for XML (StAX), * the Simple API for XML (SAX), and the W3C Document Object Model (DOM) API. * + * @moduleGraph * @since 9 */ module java.xml { diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/org/xml/sax/AttributeList.java --- a/jaxp/src/java.xml/share/classes/org/xml/sax/AttributeList.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/org/xml/sax/AttributeList.java Wed Jul 05 23:09:40 2017 +0200 @@ -93,7 +93,7 @@ * @see org.xml.sax.DocumentHandler#startElement startElement * @see org.xml.sax.helpers.AttributeListImpl AttributeListImpl */ -@Deprecated(since="5") +@Deprecated(since="1.5") public interface AttributeList { diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/org/xml/sax/DocumentHandler.java --- a/jaxp/src/java.xml/share/classes/org/xml/sax/DocumentHandler.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/org/xml/sax/DocumentHandler.java Wed Jul 05 23:09:40 2017 +0200 @@ -68,7 +68,7 @@ * @see org.xml.sax.Locator * @see org.xml.sax.HandlerBase */ -@Deprecated(since="5") +@Deprecated(since="1.5") public interface DocumentHandler { diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/org/xml/sax/Parser.java --- a/jaxp/src/java.xml/share/classes/org/xml/sax/Parser.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/org/xml/sax/Parser.java Wed Jul 05 23:09:40 2017 +0200 @@ -73,7 +73,7 @@ * @see org.xml.sax.HandlerBase * @see org.xml.sax.InputSource */ -@Deprecated(since="5") +@Deprecated(since="1.5") public interface Parser { diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/classes/org/xml/sax/helpers/ParserFactory.java --- a/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/ParserFactory.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/org/xml/sax/helpers/ParserFactory.java Wed Jul 05 23:09:40 2017 +0200 @@ -64,7 +64,7 @@ * @version 2.0.1 (sax2r2) */ @SuppressWarnings( "deprecation" ) -@Deprecated(since="5") +@Deprecated(since="1.5") public class ParserFactory { private static SecuritySupport ss = new SecuritySupport(); diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/legal/bcel.md --- a/jaxp/src/java.xml/share/legal/bcel.md Sat Apr 08 03:25:14 2017 +0000 +++ b/jaxp/src/java.xml/share/legal/bcel.md Wed Jul 05 23:09:40 2017 +0200 @@ -1,6 +1,6 @@ -## Apache Byte Code Engineering Library v5.2 +## Apache Byte Code Engineering Library (BCEL) v5.2 -### Notice +### Apache BCEL Notice
 
     =========================================================================
diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/legal/dom.md
--- a/jaxp/src/java.xml/share/legal/dom.md	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxp/src/java.xml/share/legal/dom.md	Wed Jul 05 23:09:40 2017 +0200
@@ -1,6 +1,6 @@
-## DOM Level 3 core specification, v1.0
+## DOM Level 3 Core Specification v1.0
 
-## W3C License
+### W3C License
 
 
 W3C SOFTWARE NOTICE AND LICENSE
diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/legal/xalan.md
--- a/jaxp/src/java.xml/share/legal/xalan.md	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxp/src/java.xml/share/legal/xalan.md	Wed Jul 05 23:09:40 2017 +0200
@@ -1,6 +1,6 @@
 ## Apache Xalan v2.7.1
 
-### Notice
+### Apache Xalan Notice
 
 
     ======================================================================================
diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/legal/xerces.md
--- a/jaxp/src/java.xml/share/legal/xerces.md	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxp/src/java.xml/share/legal/xerces.md	Wed Jul 05 23:09:40 2017 +0200
@@ -1,7 +1,7 @@
 ## Apache Xerces v2.11.0
 
-### Notice
-
+### Apache Xerces Notice
+
     =========================================================================
     == NOTICE file corresponding to section 4(d) of the Apache License, ==
     == Version 2.0, in this case for the Apache Xerces Java distribution. ==
@@ -17,6 +17,7 @@
     - voluntary contributions made by Paul Eng on behalf of the
     Apache Software Foundation that were originally developed at iClick, Inc.,
     software copyright (c) 1999.
+
### Apache 2.0 License
diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/java.xml/share/legal/xmlresolver.md
--- a/jaxp/src/java.xml/share/legal/xmlresolver.md	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxp/src/java.xml/share/legal/xmlresolver.md	Wed Jul 05 23:09:40 2017 +0200
@@ -1,6 +1,6 @@
 ## Apache XML Resolver Library v1.2
 
-### Notice
+### Apache XML Resolver Notice
 
 
 Apache XML Commons Resolver
diff -r 18569c523d38 -r c61cc8a34456 jaxp/src/jdk.xml.dom/share/classes/module-info.java
--- a/jaxp/src/jdk.xml.dom/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxp/src/jdk.xml.dom/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
@@ -27,6 +27,7 @@
  * Defines the subset of the W3C Document Object Model (DOM) API that is not part
  * of the Java SE API.
  *
+ * @moduleGraph
  * @since 9
  */
 module jdk.xml.dom {
diff -r 18569c523d38 -r c61cc8a34456 jaxp/test/javax/xml/jaxp/functional/catalog/DeferFeatureTest.java
--- a/jaxp/test/javax/xml/jaxp/functional/catalog/DeferFeatureTest.java	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxp/test/javax/xml/jaxp/functional/catalog/DeferFeatureTest.java	Wed Jul 05 23:09:40 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,14 +27,16 @@
 import static catalog.CatalogTestUtils.DEFER_TRUE;
 import static catalog.CatalogTestUtils.getCatalogPath;
 import static javax.xml.catalog.CatalogFeatures.Feature.DEFER;
-import static javax.xml.catalog.CatalogManager.catalog;
 import static jaxp.library.JAXPTestUtilities.runWithAllPerm;
 import static jaxp.library.JAXPTestUtilities.tryRunWithAllPerm;
 
 import java.lang.reflect.Method;
 
 import javax.xml.catalog.Catalog;
+import javax.xml.catalog.CatalogException;
 import javax.xml.catalog.CatalogFeatures;
+import javax.xml.catalog.CatalogManager;
+import javax.xml.catalog.CatalogResolver;
 
 import org.testng.Assert;
 import org.testng.annotations.DataProvider;
@@ -43,7 +45,7 @@
 
 /*
  * @test
- * @bug 8077931
+ * @bug 8077931 8176405
  * @library /javax/xml/jaxp/libs
  * @modules java.xml/javax.xml.catalog:open
  * @run testng/othervm -DrunSecMngr=true catalog.DeferFeatureTest
@@ -61,6 +63,18 @@
         Assert.assertEquals(loadedCatalogCount(catalog), catalogCount);
     }
 
+    @Test(dataProvider = "testDeferFeatureByResolve")
+    public void testDeferFeatureByResolve(Catalog catalog, int catalogCount)
+            throws Exception {
+        CatalogResolver cr = createResolver(catalog);
+        // trigger loading alternative catalogs
+        try {
+            cr.resolveEntity("-//REMOTE//DTD ALICE DOCALICE", "http://remote/dtd/alice/");
+        } catch (CatalogException ce) {}
+
+        Assert.assertEquals(loadedCatalogCount(catalog), catalogCount);
+    }
+
     @DataProvider(name = "catalog-countOfLoadedCatalogFile")
     public Object[][] data() {
         return new Object[][]{
@@ -73,12 +87,23 @@
             {createCatalog(createDeferFeature(DEFER_FALSE)), 4}};
     }
 
+    @DataProvider(name = "testDeferFeatureByResolve")
+    public Object[][] getData() {
+        return new Object[][]{
+            {createCatalog(createDeferFeature(DEFER_TRUE)), 4}
+        };
+    }
+
     private CatalogFeatures createDeferFeature(String defer) {
         return CatalogFeatures.builder().with(DEFER, defer).build();
     }
 
     private Catalog createCatalog(CatalogFeatures feature) {
-        return catalog(feature, getCatalogPath("deferFeature.xml"));
+        return CatalogManager.catalog(feature, getCatalogPath("deferFeature.xml"));
+    }
+
+    private CatalogResolver createResolver(Catalog catalog) {
+        return CatalogManager.catalogResolver(catalog);
     }
 
     private int loadedCatalogCount(Catalog catalog) throws Exception {
diff -r 18569c523d38 -r c61cc8a34456 jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogTest.java
--- a/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogTest.java	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxp/test/javax/xml/jaxp/unittest/catalog/CatalogTest.java	Wed Jul 05 23:09:40 2017 +0200
@@ -88,35 +88,6 @@
     }
 
     /*
-     * @bug 8162431
-     * Verifies that circular references are caught and
-     * CatalogException is thrown.
-     */
-    @Test(dataProvider = "getFeatures", expectedExceptions = CatalogException.class)
-    public void testCircularRef(CatalogFeatures cf, String xml) throws Exception {
-        CatalogResolver catalogResolver = CatalogManager.catalogResolver(
-                cf,
-                getClass().getResource(xml).toURI());
-        catalogResolver.resolve("anyuri", "");
-    }
-
-    /*
-       DataProvider: used to verify circular reference
-        Data columns: CatalogFeatures, catalog
-     */
-    @DataProvider(name = "getFeatures")
-    public Object[][] getFeatures() {
-        String self = "catalogReferCircle-itself.xml";
-        String left = "catalogReferCircle-left.xml";
-        return new Object[][]{
-            {CatalogFeatures.builder().with(CatalogFeatures.Feature.DEFER, "false").build(), self},
-            {CatalogFeatures.defaults(), self},
-            {CatalogFeatures.builder().with(CatalogFeatures.Feature.DEFER, "false").build(), left},
-            {CatalogFeatures.defaults(), left}
-        };
-    }
-
-    /*
      * @bug 8163232
      * Verifies that the CatalogResolver supports the following XML Resolvers:
           javax.xml.stream.XMLResolver
@@ -437,7 +408,10 @@
     public void resolveWithPrefer(String prefer, String cfile, String publicId,
             String systemId, String expected) throws Exception {
         URI catalogFile = getClass().getResource(cfile).toURI();
-        CatalogFeatures f = CatalogFeatures.builder().with(CatalogFeatures.Feature.PREFER, prefer).with(CatalogFeatures.Feature.RESOLVE, "ignore").build();
+        CatalogFeatures f = CatalogFeatures.builder()
+                .with(CatalogFeatures.Feature.PREFER, prefer)
+                .with(CatalogFeatures.Feature.RESOLVE, "ignore")
+                .build();
         CatalogResolver catalogResolver = CatalogManager.catalogResolver(f, catalogFile);
         String result = catalogResolver.resolveEntity(publicId, systemId).getSystemId();
         Assert.assertEquals(expected, result);
@@ -452,7 +426,9 @@
     @Test(dataProvider = "invalidAltCatalogs", expectedExceptions = CatalogException.class)
     public void testDeferAltCatalogs(String file) throws Exception {
         URI catalogFile = getClass().getResource(file).toURI();
-        CatalogFeatures features = CatalogFeatures.builder().with(CatalogFeatures.Feature.DEFER, "true").build();
+        CatalogFeatures features = CatalogFeatures.builder().
+                with(CatalogFeatures.Feature.DEFER, "true")
+                .build();
         /*
           Since the defer attribute is set to false in the specified catalog file,
           the parent catalog will try to load the alt catalog, which will fail
@@ -471,11 +447,17 @@
         URI catalogFile = getClass().getResource("JDK8146237_catalog.xml").toURI();
 
         try {
-            CatalogFeatures features = CatalogFeatures.builder().with(CatalogFeatures.Feature.PREFER, "system").build();
+            CatalogFeatures features = CatalogFeatures.builder()
+                    .with(CatalogFeatures.Feature.PREFER, "system")
+                    .build();
             Catalog catalog = CatalogManager.catalog(features, catalogFile);
             CatalogResolver catalogResolver = CatalogManager.catalogResolver(catalog);
-            String actualSystemId = catalogResolver.resolveEntity("-//FOO//DTD XML Dummy V0.0//EN", "http://www.oracle.com/alt1sys.dtd").getSystemId();
-            Assert.assertTrue(actualSystemId.contains("dummy.dtd"), "Resulting id should contain dummy.dtd, indicating a match by publicId");
+            String actualSystemId = catalogResolver.resolveEntity(
+                    "-//FOO//DTD XML Dummy V0.0//EN",
+                    "http://www.oracle.com/alt1sys.dtd")
+                    .getSystemId();
+            Assert.assertTrue(actualSystemId.contains("dummy.dtd"),
+                    "Resulting id should contain dummy.dtd, indicating a match by publicId");
 
         } catch (Exception e) {
             Assert.fail(e.getMessage());
@@ -572,20 +554,21 @@
     */
     @Test
     public void testInvalidCatalog() throws Exception {
+        String expectedMsgId = "JAXP09040001";
         URI catalog = getClass().getResource("catalog_invalid.xml").toURI();
 
-        String test = "testInvalidCatalog";
         try {
-            CatalogResolver resolver = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalog);
-            String actualSystemId = resolver.resolveEntity(null, "http://remote/xml/dtd/sys/alice/docAlice.dtd").getSystemId();
+            CatalogResolver resolver = CatalogManager.catalogResolver(
+                    CatalogFeatures.defaults(), catalog);
+            String actualSystemId = resolver.resolveEntity(
+                    null,
+                    "http://remote/xml/dtd/sys/alice/docAlice.dtd")
+                    .getSystemId();
         } catch (Exception e) {
             String msg = e.getMessage();
             if (msg != null) {
-                if (msg.contains("No match found for publicId")) {
-                    Assert.assertEquals(msg, "No match found for publicId 'null' and systemId 'http://remote/xml/dtd/sys/alice/docAlice.dtd'.");
-                    System.out.println(test + ": expected [No match found for publicId 'null' and systemId 'http://remote/xml/dtd/sys/alice/docAlice.dtd'.]");
-                    System.out.println("actual [" + msg + "]");
-                }
+                Assert.assertTrue(msg.contains(expectedMsgId),
+                        "Message shall contain the corrent message ID " + expectedMsgId);
             }
         }
     }
@@ -607,7 +590,10 @@
         String test = "testInvalidCatalog";
         try {
             CatalogResolver resolver = CatalogManager.catalogResolver(f);
-            String actualSystemId = resolver.resolveEntity(null, "http://remote/xml/dtd/sys/alice/docAlice.dtd").getSystemId();
+            String actualSystemId = resolver.resolveEntity(
+                    null,
+                    "http://remote/xml/dtd/sys/alice/docAlice.dtd")
+                    .getSystemId();
             System.out.println("testIgnoreInvalidCatalog: expected [null]");
             System.out.println("testIgnoreInvalidCatalog: expected [null]");
             System.out.println("actual [" + actualSystemId + "]");
@@ -628,7 +614,11 @@
     @DataProvider(name = "resolveUri")
     public Object[][] getDataForUriResolver() {
         return new Object[][]{
-            {"uri.xml", "urn:publicid:-:Acme,+Inc.:DTD+Book+Version+1.0", null, "http://local/base/dtd/book.dtd", "Uri in publicId namespace is incorrectly unwrapped"},
+            {"uri.xml",
+                "urn:publicid:-:Acme,+Inc.:DTD+Book+Version+1.0",
+                null,
+                "http://local/base/dtd/book.dtd",
+                "Uri in publicId namespace is incorrectly unwrapped"},
         };
     }
 
@@ -654,7 +644,13 @@
     public Object[][] getDataForMatchingBothIds() {
         String expected = "http://www.groupxmlbase.com/dtds/rewrite.dtd";
         return new Object[][]{
-            {"rewriteSystem_id.xml", "system", "http://www.sys00test.com/rewrite.dtd", "PUB-404", expected, expected, "Relative rewriteSystem with xml:base at group level failed"},
+            {"rewriteSystem_id.xml",
+                "system",
+                "http://www.sys00test.com/rewrite.dtd",
+                "PUB-404",
+                expected,
+                expected,
+                "Relative rewriteSystem with xml:base at group level failed"},
         };
     }
 
diff -r 18569c523d38 -r c61cc8a34456 jaxp/test/javax/xml/jaxp/unittest/catalog/catalogReferCircle-itself.xml
--- a/jaxp/test/javax/xml/jaxp/unittest/catalog/catalogReferCircle-itself.xml	Sat Apr 08 03:25:14 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-
-
-
-    
-
-
diff -r 18569c523d38 -r c61cc8a34456 jaxp/test/javax/xml/jaxp/unittest/catalog/catalogReferCircle-left.xml
--- a/jaxp/test/javax/xml/jaxp/unittest/catalog/catalogReferCircle-left.xml	Sat Apr 08 03:25:14 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-
-
-
-    
-
-
diff -r 18569c523d38 -r c61cc8a34456 jaxp/test/javax/xml/jaxp/unittest/catalog/catalogReferCircle-right.xml
--- a/jaxp/test/javax/xml/jaxp/unittest/catalog/catalogReferCircle-right.xml	Sat Apr 08 03:25:14 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-
-
-
-    
-
-
diff -r 18569c523d38 -r c61cc8a34456 jaxws/.hgtags
--- a/jaxws/.hgtags	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxws/.hgtags	Wed Jul 05 23:09:40 2017 +0200
@@ -408,3 +408,6 @@
 0ea34706c7fa5cd71accd493eb4f54262e4a5f4e jdk-9+159
 6bff08fd5d217549aec10a20007378e52099be6c jdk-9+160
 7d5352c54fc802b3301d8433b6b2b2a92b616630 jdk-9+161
+b8aebe5292f23689f97cb8e66a9f327834dd43e6 jdk-9+162
+3890f96e8995be8c84f330d1f65269b03ac36b24 jdk-9+163
+1a52de2da827459e866fd736f9e9c62eb2ecd6bb jdk-9+164
diff -r 18569c523d38 -r c61cc8a34456 jaxws/src/java.activation/share/classes/module-info.java
--- a/jaxws/src/java.activation/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxws/src/java.activation/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,8 +26,10 @@
 /**
  * Defines the JavaBeans Activation Framework (JAF) API.
  *
+ * @moduleGraph
  * @since 9
  */
+@Deprecated(since="9", forRemoval=true)
 module java.activation {
     requires transitive java.datatransfer;
     requires java.logging;
diff -r 18569c523d38 -r c61cc8a34456 jaxws/src/java.xml.bind/share/classes/module-info.java
--- a/jaxws/src/java.xml.bind/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxws/src/java.xml.bind/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
@@ -26,8 +26,10 @@
 /**
  * Defines the Java Architecture for XML Binding (JAXB) API.
  *
+ * @moduleGraph
  * @since 9
  */
+@Deprecated(since="9", forRemoval=true)
 module java.xml.bind {
     requires transitive java.activation;
     requires transitive java.xml;
diff -r 18569c523d38 -r c61cc8a34456 jaxws/src/java.xml.ws.annotation/share/classes/module-info.java
--- a/jaxws/src/java.xml.ws.annotation/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxws/src/java.xml.ws.annotation/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
@@ -27,8 +27,10 @@
  * Defines a subset of the Common Annotations API to support programs running
  * on the Java SE Platform.
  *
+ * @moduleGraph
  * @since 9
  */
+@Deprecated(since="9", forRemoval=true)
 module java.xml.ws.annotation {
     exports javax.annotation;
 }
diff -r 18569c523d38 -r c61cc8a34456 jaxws/src/java.xml.ws/share/classes/module-info.java
--- a/jaxws/src/java.xml.ws/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxws/src/java.xml.ws/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
@@ -27,8 +27,10 @@
  * Defines the Java API for XML-Based Web Services (JAX-WS), and
  * the Web Services Metadata API.
  *
+ * @moduleGraph
  * @since 9
  */
+@Deprecated(since="9", forRemoval=true)
 module java.xml.ws {
     requires transitive java.activation;
     requires transitive java.xml;
diff -r 18569c523d38 -r c61cc8a34456 jaxws/src/jdk.xml.bind/share/legal/xmlresolver.md
--- a/jaxws/src/jdk.xml.bind/share/legal/xmlresolver.md	Sat Apr 08 03:25:14 2017 +0000
+++ b/jaxws/src/jdk.xml.bind/share/legal/xmlresolver.md	Wed Jul 05 23:09:40 2017 +0200
@@ -1,6 +1,6 @@
 ## Apache XML Resolver Library v1.2
 
-### Notice
+### Apache XML Resolver Notice
 
 
 Apache XML Commons Resolver
diff -r 18569c523d38 -r c61cc8a34456 jdk/.hgtags
--- a/jdk/.hgtags	Sat Apr 08 03:25:14 2017 +0000
+++ b/jdk/.hgtags	Wed Jul 05 23:09:40 2017 +0200
@@ -405,3 +405,6 @@
 49b54a4d9e84b7ba956b8c27fced5035465146ae jdk-9+159
 cac788454598b95d8b0153c021a7fae3cd7e6fda jdk-9+160
 09b92d3067a38ee07bc14efa336b14790c93f7e7 jdk-9+161
+f6bf027e88e9a4dd19f721001a7af00157af42c4 jdk-9+162
+50171f8c47961710cbf87aead6f03fa431d8d240 jdk-9+163
+6dea581453d7c0e767e3169cfec8b423a381e71d jdk-9+164
diff -r 18569c523d38 -r c61cc8a34456 jdk/make/GenerateModuleSummary.gmk
--- a/jdk/make/GenerateModuleSummary.gmk	Sat Apr 08 03:25:14 2017 +0000
+++ b/jdk/make/GenerateModuleSummary.gmk	Wed Jul 05 23:09:40 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,7 @@
 include ModuleTools.gmk
 
 GENGRAPHS_DIR := $(IMAGES_OUTPUTDIR)/gengraphs
-SPEC_DOTFILES_DIR := $(IMAGES_OUTPUTDIR)/spec-dotfiles
+SPEC_DOTFILES_DIR := $(GENGRAPHS_DIR)/spec-dotfiles
 TOOLS_MODULE_SRCDIR := $(JDK_TOPDIR)/make/src/classes/build/tools/jigsaw
 
 $(GENGRAPHS_DIR)/jdk.dot: $(BUILD_JIGSAW_TOOLS)
diff -r 18569c523d38 -r c61cc8a34456 jdk/make/ModuleTools.gmk
--- a/jdk/make/ModuleTools.gmk	Sat Apr 08 03:25:14 2017 +0000
+++ b/jdk/make/ModuleTools.gmk	Wed Jul 05 23:09:40 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -23,8 +23,9 @@
 # questions.
 #
 
-include $(SPEC)
-include MakeBase.gmk
+ifndef _MODULE_TOOLS_GMK
+_MODULE_TOOLS_GMK := 1
+
 include JavaCompilation.gmk
 
 TOOLS_CLASSES_DIR := $(BUILDTOOLS_OUTPUTDIR)/tools_jigsaw_classes
@@ -32,7 +33,7 @@
 # To avoid reevaluating the compilation setup for the tools each time this file
 # is included, the actual compilation is handled by CompileModuleTools.gmk. The
 # following trick is used to be able to declare a dependency on the built tools.
-BUILD_TOOLS_JDK := $(call SetupJavaCompilationCompileTarget, \
+BUILD_JIGSAW_TOOLS := $(call SetupJavaCompilationCompileTarget, \
     BUILD_JIGSAW_TOOLS, $(TOOLS_CLASSES_DIR))
 
 TOOL_GENGRAPHS := $(BUILD_JAVA) -esa -ea -cp $(TOOLS_CLASSES_DIR) \
@@ -47,3 +48,5 @@
     -cp $(TOOLS_CLASSES_DIR) \
     --add-exports java.base/jdk.internal.module=ALL-UNNAMED \
     build.tools.jigsaw.AddPackagesAttribute
+
+endif # _MODULE_TOOLS_GMK
diff -r 18569c523d38 -r c61cc8a34456 jdk/make/copy/Copy-java.base.gmk
--- a/jdk/make/copy/Copy-java.base.gmk	Sat Apr 08 03:25:14 2017 +0000
+++ b/jdk/make/copy/Copy-java.base.gmk	Wed Jul 05 23:09:40 2017 +0200
@@ -235,8 +235,10 @@
 
 # JDK license and assembly exception files to be packaged in JMOD
 
-JDK_LICENSE ?= $(TOPDIR)/LICENSE
-JDK_NOTICE  ?= $(TOPDIR)/ASSEMBLY_EXCEPTION
+# The license files may not be present if the source has been obtained using a
+# different license.
+JDK_LICENSE ?= $(wildcard $(TOPDIR)/LICENSE)
+JDK_NOTICE  ?= $(wildcard $(TOPDIR)/ASSEMBLY_EXCEPTION)
 
 $(eval $(call SetupCopyFiles, COPY_JDK_NOTICES, \
     FILES := $(JDK_LICENSE) $(JDK_NOTICE), \
@@ -245,4 +247,3 @@
 ))
 
 TARGETS += $(COPY_JDK_NOTICES)
-
diff -r 18569c523d38 -r c61cc8a34456 jdk/make/mapfiles/libjava/mapfile-vers
--- a/jdk/make/mapfiles/libjava/mapfile-vers	Sat Apr 08 03:25:14 2017 +0000
+++ b/jdk/make/mapfiles/libjava/mapfile-vers	Wed Jul 05 23:09:40 2017 +0200
@@ -128,7 +128,6 @@
 		Java_java_lang_Class_isInstance;
 		Java_java_lang_Class_registerNatives;
 		Java_java_lang_ClassLoader_findBootstrapClass;
-		Java_java_lang_ClassLoader_defineClass0;
 		Java_java_lang_ClassLoader_defineClass1;
 		Java_java_lang_ClassLoader_defineClass2;
 		Java_java_lang_ClassLoader_findBuiltinLib;
diff -r 18569c523d38 -r c61cc8a34456 jdk/make/src/classes/build/tools/jigsaw/GenGraphs.java
--- a/jdk/make/src/classes/build/tools/jigsaw/GenGraphs.java	Sat Apr 08 03:25:14 2017 +0000
+++ b/jdk/make/src/classes/build/tools/jigsaw/GenGraphs.java	Wed Jul 05 23:09:40 2017 +0200
@@ -26,7 +26,6 @@
 package build.tools.jigsaw;
 
 import com.sun.tools.jdeps.ModuleDotGraph;
-import com.sun.tools.jdeps.ModuleDotGraph.DotGraphBuilder;
 
 import java.io.IOException;
 import java.lang.module.Configuration;
@@ -36,10 +35,15 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * Generate the DOT file for a module graph for each module in the JDK
@@ -50,13 +54,19 @@
     public static void main(String[] args) throws Exception {
         Path dir = null;
         boolean spec = false;
+        Properties props = null;
         for (int i=0; i < args.length; i++) {
             String arg = args[i];
             if (arg.equals("--spec")) {
                 spec = true;
+            } else if (arg.equals("--dot-attributes")) {
+                if (i++ == args.length) {
+                    throw new IllegalArgumentException("Missing argument: --dot-attributes option");
+                }
+                props = new Properties();
+                props.load(Files.newInputStream(Paths.get(args[i])));
             } else if (arg.equals("--output")) {
-                i++;
-                dir = i < args.length ? Paths.get(args[i]) : null;
+                dir = ++i < args.length ? Paths.get(args[i]) : null;
             } else if (arg.startsWith("-")) {
                 throw new IllegalArgumentException("Invalid option: " + arg);
             }
@@ -67,11 +77,14 @@
             System.exit(1);
         }
 
-        // setup and configure the dot graph attributes
-        initDotGraphAttributes();
         Files.createDirectories(dir);
-
-        GenGraphs genGraphs = new GenGraphs(dir, spec);
+        ModuleGraphAttributes attributes;
+        if (props != null) {
+            attributes = new ModuleGraphAttributes(props);
+        } else {
+            attributes = new ModuleGraphAttributes();
+        }
+        GenGraphs genGraphs = new GenGraphs(dir, spec, attributes);
 
         // print dot file for each module
         Map configurations = new HashMap<>();
@@ -99,49 +112,149 @@
         genGraphs.genDotFiles(configurations);
     }
 
-    static void initDotGraphAttributes() {
-        int h = 1000;
-        DotGraphBuilder.weight("java.se", "java.sql.rowset", h * 10);
-        DotGraphBuilder.weight("java.sql.rowset", "java.sql", h * 10);
-        DotGraphBuilder.weight("java.sql", "java.xml", h * 10);
-        DotGraphBuilder.weight("java.xml", "java.base", h * 10);
+    /**
+     * Custom dot file attributes.
+     */
+    static class ModuleGraphAttributes implements ModuleDotGraph.Attributes {
+        static Map DEFAULT_ATTRIBUTES = Map.of(
+            "ranksep", "0.6",
+            "fontsize", "12",
+            "fontcolor", BLACK,
+            "fontname", "DejaVuSans",
+            "arrowsize", "1",
+            "arrowwidth", "2",
+            "arrowcolor", DARK_GRAY,
+            // custom
+            "requiresMandatedColor", LIGHT_GRAY,
+            "javaSubgraphColor", ORANGE,
+            "jdkSubgraphColor", BLUE
+        );
+
+        final Map weights = new HashMap<>();
+        final List> ranks = new ArrayList<>();
+        final Map attrs;
+        ModuleGraphAttributes(Map attrs) {
+            int h = 1000;
+            weight("java.se", "java.sql.rowset", h * 10);
+            weight("java.sql.rowset", "java.sql", h * 10);
+            weight("java.sql", "java.xml", h * 10);
+            weight("java.xml", "java.base", h * 10);
+
+            ranks.add(Set.of("java.logging", "java.scripting", "java.xml"));
+            ranks.add(Set.of("java.sql"));
+            ranks.add(Set.of("java.compiler", "java.instrument"));
+            ranks.add(Set.of("java.desktop", "java.management"));
+            ranks.add(Set.of("java.corba", "java.xml.ws"));
+            ranks.add(Set.of("java.xml.bind", "java.xml.ws.annotation"));
+
+            this.attrs = attrs;
+        }
+
+        ModuleGraphAttributes() {
+            this(DEFAULT_ATTRIBUTES);
+        }
+        ModuleGraphAttributes(Properties props) {
+            this(toAttributes(props));
+        }
+
+        @Override
+        public double rankSep() {
+            return Double.valueOf(attrs.get("ranksep"));
+        }
+
+        @Override
+        public int fontSize() {
+            return Integer.valueOf(attrs.get("fontsize"));
+        }
+
+        @Override
+        public String fontName() {
+            return attrs.get("fontname");
+        }
 
-        DotGraphBuilder.sameRankNodes(Set.of("java.logging", "java.scripting", "java.xml"));
-        DotGraphBuilder.sameRankNodes(Set.of("java.sql"));
-        DotGraphBuilder.sameRankNodes(Set.of("java.compiler", "java.instrument"));
-        DotGraphBuilder.sameRankNodes(Set.of("java.desktop", "java.management"));
-        DotGraphBuilder.sameRankNodes(Set.of("java.corba", "java.xml.ws"));
-        DotGraphBuilder.sameRankNodes(Set.of("java.xml.bind", "java.xml.ws.annotation"));
-        DotGraphBuilder.setRankSep(0.7);
-        DotGraphBuilder.setFontSize(12);
-        DotGraphBuilder.setArrowSize(1);
-        DotGraphBuilder.setArrowWidth(2);
+        @Override
+        public String fontColor() {
+            return attrs.get("fontcolor");
+        }
+
+        @Override
+        public int arrowSize() {
+            return Integer.valueOf(attrs.get("arrowsize"));
+        }
+
+        @Override
+        public int arrowWidth() {
+            return Integer.valueOf(attrs.get("arrowwidth"));
+        }
+
+        @Override
+        public String arrowColor() {
+            return attrs.get("arrowcolor");
+        }
+
+        @Override
+        public List> ranks() {
+            return ranks;
+        }
+
+        @Override
+        public String requiresMandatedColor() {
+            return attrs.get("requiresMandatedColor");
+        }
+
+        @Override
+        public String javaSubgraphColor() {
+            return attrs.get("javaSubgraphColor");
+        }
+
+        @Override
+        public String jdkSubgraphColor() {
+            return attrs.get("jdkSubgraphColor");
+        }
+
+        @Override
+        public int weightOf(String s, String t) {
+            int w = weights.getOrDefault(s + ":" + t, 1);
+            if (w != 1)
+                return w;
+            if (s.startsWith("java.") && t.startsWith("java."))
+                return 10;
+            return 1;
+        }
+
+        public void weight(String s, String t, int w) {
+            weights.put(s + ":" + t, w);
+        }
+
+        static Map toAttributes(Properties props) {
+            return DEFAULT_ATTRIBUTES.keySet().stream()
+                .collect(Collectors.toMap(Function.identity(),
+                    k -> props.getProperty(k, DEFAULT_ATTRIBUTES.get(k))));
+        }
     }
 
     private final Path dir;
     private final boolean spec;
-    GenGraphs(Path dir, boolean spec) {
+    private final ModuleGraphAttributes attributes;
+    GenGraphs(Path dir, boolean spec, ModuleGraphAttributes attributes) {
         this.dir = dir;
         this.spec = spec;
+        this.attributes = attributes;
     }
 
     void genDotFiles(Map configurations) throws IOException {
         ModuleDotGraph dotGraph = new ModuleDotGraph(configurations, spec);
-        dotGraph.genDotFiles(dir);
+        dotGraph.genDotFiles(dir, attributes);
     }
 
+    /**
+     * Returns true for any name if generating graph for non-spec;
+     * otherwise, returns true except "jdk" and name with "jdk.internal." prefix
+     */
     boolean accept(String name, ModuleDescriptor descriptor) {
-        if (!spec) return true;
-
-        if (name.equals("jdk"))
-            return false;
-
-        if (name.equals("java.se") || name.equals("java.se.ee"))
+        if (!spec)
             return true;
 
-        // only the module that has exported API
-        return descriptor.exports().stream()
-                         .filter(e -> !e.isQualified())
-                         .findAny().isPresent();
+        return !name.equals("jdk") && !name.startsWith("jdk.internal.");
     }
-}
\ No newline at end of file
+}
diff -r 18569c523d38 -r c61cc8a34456 jdk/make/src/classes/build/tools/jigsaw/javadoc-graphs.properties
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/src/classes/build/tools/jigsaw/javadoc-graphs.properties	Wed Jul 05 23:09:40 2017 +0200
@@ -0,0 +1,2 @@
+arrowcolor=#999999
+requiresMandatedColor=#999999
diff -r 18569c523d38 -r c61cc8a34456 jdk/make/src/classes/build/tools/taglet/Incubating.java
--- a/jdk/make/src/classes/build/tools/taglet/Incubating.java	Sat Apr 08 03:25:14 2017 +0000
+++ b/jdk/make/src/classes/build/tools/taglet/Incubating.java	Wed Jul 05 23:09:40 2017 +0200
@@ -28,6 +28,7 @@
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Set;
+import javax.lang.model.element.Element;
 import com.sun.source.doctree.DocTree;
 import jdk.javadoc.doclet.Taglet;
 import static jdk.javadoc.doclet.Taglet.Location.*;
@@ -59,7 +60,7 @@
                 + " Will be removed in a future release.";
 
     @Override
-    public String toString(List tags) {
+    public String toString(List tags, Element elem) {
         return MESSAGE;
     }
 }
diff -r 18569c523d38 -r c61cc8a34456 jdk/make/src/classes/build/tools/taglet/ModuleGraph.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/src/classes/build/tools/taglet/ModuleGraph.java	Wed Jul 05 23:09:40 2017 +0200
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package build.tools.taglet;
+
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Set;
+import javax.lang.model.element.Element;
+import com.sun.source.doctree.DocTree;
+import jdk.javadoc.doclet.Taglet;
+import static jdk.javadoc.doclet.Taglet.Location.*;
+
+/**
+ * A block tag to optionally insert a reference to a module graph.
+ */
+public class ModuleGraph implements Taglet {
+    private static final boolean enableModuleGraph =
+        Boolean.getBoolean("enableModuleGraph");
+
+    /** Returns the set of locations in which a taglet may be used. */
+    @Override
+    public Set getAllowedLocations() {
+        return EnumSet.of(MODULE);
+    }
+
+    @Override
+    public boolean isInlineTag() {
+        return false;
+    }
+
+    @Override
+    public String getName() {
+        return "moduleGraph";
+    }
+
+    @Override
+    public String toString(List tags, Element element) {
+        if (!enableModuleGraph) {
+            return "";
+        }
+
+        String moduleName = element.getSimpleName().toString();
+        String imageFile = moduleName + "-graph.png";
+        int thumbnailHeight = -1;
+        String hoverImage = "";
+        if (!moduleName.equals("java.base")) {
+            thumbnailHeight = 100; // also appears in the stylesheet
+            hoverImage = ""
+                + getImage(moduleName, imageFile, -1, true)
+                + "";
+        }
+        return "
" + + "Module Graph:\n" + + "
" + + "
" + + "" + + getImage(moduleName, imageFile, thumbnailHeight, false) + + hoverImage + + "" + + "
"; + } + + private static final String VERTICAL_ALIGN = "vertical-align:top"; + private static final String BORDER = "border: solid lightgray 1px;"; + + private String getImage(String moduleName, String file, int height, boolean useBorder) { + return String.format("\"Module", + useBorder ? BORDER + " " + VERTICAL_ALIGN : VERTICAL_ALIGN, + moduleName, + file, + (height <= 0 ? "" : " height=\"" + height + "\"")); + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/io/ObjectInputFilter.java --- a/jdk/src/java.base/share/classes/java/io/ObjectInputFilter.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/io/ObjectInputFilter.java Wed Jul 05 23:09:40 2017 +0200 @@ -104,7 +104,6 @@ * @return {@link Status#ALLOWED Status.ALLOWED} if accepted, * {@link Status#REJECTED Status.REJECTED} if rejected, * {@link Status#UNDECIDED Status.UNDECIDED} if undecided. - * @since 9 */ Status checkInput(FilterInfo filterInfo); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/io/ObjectInputStream.java --- a/jdk/src/java.base/share/classes/java/io/ObjectInputStream.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/io/ObjectInputStream.java Wed Jul 05 23:09:40 2017 +0200 @@ -812,23 +812,24 @@ } /** - * Enable the stream to allow objects read from the stream to be replaced. - * When enabled, the resolveObject method is called for every object being + * Enables the stream to do replacement of objects read from the stream. When + * enabled, the {@link #resolveObject} method is called for every object being * deserialized. * - *

If enable is true, and there is a security manager installed, + *

If object replacement is currently not enabled, and + * {@code enable} is true, and there is a security manager installed, * this method first calls the security manager's - * checkPermission method with the - * SerializablePermission("enableSubstitution") permission to - * ensure it's ok to enable the stream to allow objects read from the - * stream to be replaced. + * {@code checkPermission} method with the + * {@code SerializablePermission("enableSubstitution")} permission to + * ensure that the caller is permitted to enable the stream to do replacement + * of objects read from the stream. * - * @param enable true for enabling use of resolveObject for + * @param enable true for enabling use of {@code resolveObject} for * every object being deserialized * @return the previous setting before this method was invoked * @throws SecurityException if a security manager exists and its - * checkPermission method denies enabling the stream - * to allow objects read from the stream to be replaced. + * {@code checkPermission} method denies enabling the stream + * to do replacement of objects read from the stream. * @see SecurityManager#checkPermission * @see java.io.SerializablePermission */ diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/io/ObjectOutputStream.java --- a/jdk/src/java.base/share/classes/java/io/ObjectOutputStream.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/io/ObjectOutputStream.java Wed Jul 05 23:09:40 2017 +0200 @@ -589,22 +589,24 @@ } /** - * Enable the stream to do replacement of objects in the stream. When - * enabled, the replaceObject method is called for every object being + * Enables the stream to do replacement of objects written to the stream. When + * enabled, the {@link #replaceObject} method is called for every object being * serialized. * - *

If enable is true, and there is a security manager - * installed, this method first calls the security manager's - * checkPermission method with a - * SerializablePermission("enableSubstitution") permission to - * ensure it's ok to enable the stream to do replacement of objects in the - * stream. + *

If object replacement is currently not enabled, and + * {@code enable} is true, and there is a security manager installed, + * this method first calls the security manager's + * {@code checkPermission} method with the + * {@code SerializablePermission("enableSubstitution")} permission to + * ensure that the caller is permitted to enable the stream to do replacement + * of objects written to the stream. * - * @param enable boolean parameter to enable replacement of objects + * @param enable true for enabling use of {@code replaceObject} for + * every object being serialized * @return the previous setting before this method was invoked * @throws SecurityException if a security manager exists and its - * checkPermission method denies enabling the stream - * to do replacement of objects in the stream. + * {@code checkPermission} method denies enabling the stream + * to do replacement of objects written to the stream. * @see SecurityManager#checkPermission * @see java.io.SerializablePermission */ diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/Class.java --- a/jdk/src/java.base/share/classes/java/lang/Class.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/Class.java Wed Jul 05 23:09:40 2017 +0200 @@ -64,9 +64,9 @@ import jdk.internal.HotSpotIntrinsicCandidate; import jdk.internal.loader.BootLoader; import jdk.internal.loader.BuiltinClassLoader; -import jdk.internal.loader.ResourceHelper; import jdk.internal.misc.Unsafe; import jdk.internal.misc.VM; +import jdk.internal.module.Resources; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.ConstantPool; import jdk.internal.reflect.Reflection; @@ -2563,11 +2563,11 @@ Module module = getModule(); if (module.isNamed()) { - if (!ResourceHelper.isSimpleResource(name)) { + if (Resources.canEncapsulate(name)) { Module caller = Reflection.getCallerClass().getModule(); if (caller != module) { Set packages = module.getDescriptor().packages(); - String pn = ResourceHelper.getPackageName(name); + String pn = Resources.toPackageName(name); if (packages.contains(pn) && !module.isOpen(pn, caller)) { // resource is in package not open to caller return null; @@ -2665,11 +2665,11 @@ Module module = getModule(); if (module.isNamed()) { - if (!ResourceHelper.isSimpleResource(name)) { + if (Resources.canEncapsulate(name)) { Module caller = Reflection.getCallerClass().getModule(); if (caller != module) { Set packages = module.getDescriptor().packages(); - String pn = ResourceHelper.getPackageName(name); + String pn = Resources.toPackageName(name); if (packages.contains(pn) && !module.isOpen(pn, caller)) { // resource is in package not open to caller return null; @@ -2771,7 +2771,7 @@ * In all other cases, it requires RuntimePermission("accessDeclaredMembers") * permission. */ - final ClassLoader ccl = caller.getClassLoader0(); + final ClassLoader ccl = ClassLoader.getClassLoader(caller); if (which != Member.PUBLIC) { final ClassLoader cl = getClassLoader0(); if (ccl != cl) { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/ClassLoader.java --- a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java Wed Jul 05 23:09:40 2017 +0200 @@ -983,7 +983,7 @@ { protectionDomain = preDefineClass(name, protectionDomain); String source = defineClassSourceLocation(protectionDomain); - Class c = defineClass1(name, b, off, len, protectionDomain, source); + Class c = defineClass1(this, name, b, off, len, protectionDomain, source); postDefineClass(c, protectionDomain); return c; } @@ -1075,17 +1075,17 @@ protectionDomain = preDefineClass(name, protectionDomain); String source = defineClassSourceLocation(protectionDomain); - Class c = defineClass2(name, b, b.position(), len, protectionDomain, source); + Class c = defineClass2(this, name, b, b.position(), len, protectionDomain, source); postDefineClass(c, protectionDomain); return c; } - private native Class defineClass1(String name, byte[] b, int off, int len, - ProtectionDomain pd, String source); + static native Class defineClass1(ClassLoader loader, String name, byte[] b, int off, int len, + ProtectionDomain pd, String source); - private native Class defineClass2(String name, java.nio.ByteBuffer b, - int off, int len, ProtectionDomain pd, - String source); + static native Class defineClass2(ClassLoader loader, String name, java.nio.ByteBuffer b, + int off, int len, ProtectionDomain pd, + String source); // true if the name is null or has the potential to be a valid binary name private boolean checkName(String name) { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/LiveStackFrame.java --- a/jdk/src/java.base/share/classes/java/lang/LiveStackFrame.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/LiveStackFrame.java Wed Jul 05 23:09:40 2017 +0200 @@ -169,7 +169,7 @@ * it denies access to {@code RuntimePermission("liveStackFrames")}; or * or if the given {@code options} contains * {@link StackWalker.Option#RETAIN_CLASS_REFERENCE Option.RETAIN_CLASS_REFERENCE} - * and it denies access to {@code StackFramePermission("retainClassReference")}. + * and it denies access to {@code RuntimePermission("getStackWalkerWithClassReference")}. */ public static StackWalker getStackWalker(Set options) { SecurityManager sm = System.getSecurityManager(); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/Math.java --- a/jdk/src/java.base/share/classes/java/lang/Math.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/Math.java Wed Jul 05 23:09:40 2017 +0200 @@ -1079,6 +1079,7 @@ * @param x the first value * @param y the second value * @return the result + * @since 9 */ public static long multiplyFull(int x, int y) { return (long)x * (long)y; @@ -1091,6 +1092,7 @@ * @param x the first value * @param y the second value * @return the result + * @since 9 */ public static long multiplyHigh(long x, long y) { if (x < 0 || y < 0) { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/ProcessBuilder.java --- a/jdk/src/java.base/share/classes/java/lang/ProcessBuilder.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/ProcessBuilder.java Wed Jul 05 23:09:40 2017 +0200 @@ -1251,6 +1251,7 @@ * If the operating system does not support the creation of processes * * @throws IOException if an I/O error occurs + * @since 9 */ public static List startPipeline(List builders) throws IOException { // Accumulate and check the builders diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/ProcessHandleImpl.java --- a/jdk/src/java.base/share/classes/java/lang/ProcessHandleImpl.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/ProcessHandleImpl.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ */ package java.lang; +import java.lang.annotation.Native; import java.security.PrivilegedAction; import java.time.Duration; import java.time.Instant; @@ -57,6 +58,12 @@ private static long REAPER_DEFAULT_STACKSIZE = 128 * 1024; /** + * Return value from waitForProcessExit0 indicating the process is not a child. + */ + @Native + private static final int NOT_A_CHILD = -2; + + /** * Cache the ProcessHandle of this process. */ private static final ProcessHandleImpl current; @@ -131,6 +138,29 @@ // spawn a thread to wait for and deliver the exit value processReaperExecutor.execute(() -> { int exitValue = waitForProcessExit0(pid, shouldReap); + if (exitValue == NOT_A_CHILD) { + // pid not alive or not a child of this process + // If it is alive wait for it to terminate + long sleep = 300; // initial milliseconds to sleep + int incr = 30; // increment to the sleep time + + long startTime = isAlive0(pid); + long origStart = startTime; + while (startTime >= 0) { + try { + Thread.sleep(Math.min(sleep, 5000L)); // no more than 5 sec + sleep += incr; + } catch (InterruptedException ie) { + // ignore and retry + } + startTime = isAlive0(pid); // recheck if is alive + if (origStart > 0 && startTime != origStart) { + // start time changed, pid is not the same process + break; + } + } + exitValue = 0; + } newCompletion.complete(exitValue); // remove from cache afterwards completions.remove(pid, newCompletion); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/Runtime.java --- a/jdk/src/java.base/share/classes/java/lang/Runtime.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/Runtime.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -955,7 +955,7 @@ * *

A version number, {@code $VNUM}, is a non-empty sequence * of elements separated by period characters (U+002E). An element is - * either zero, or a unsigned integer numeral without leading zeros. The + * either zero, or an unsigned integer numeral without leading zeros. The * final element in a version number must not be zero. The format is: *

* @@ -1053,8 +1053,8 @@ * * * - *

A version number {@code 10-ea} matches {@code $VNUM = "10"} and - * {@code $PRE = "ea"}. The version number {@code 10+-ea} matches + *

A version string {@code 10-ea} matches {@code $VNUM = "10"} and + * {@code $PRE = "ea"}. The version string {@code 10+-ea} matches * {@code $VNUM = "10"} and {@code $OPT = "ea"}.

* *

When comparing two version strings, the value of {@code $OPT}, if @@ -1247,7 +1247,7 @@ * Compares this version to another. * *

Each of the components in the version is - * compared in the follow order of precedence: version numbers, + * compared in the following order of precedence: version numbers, * pre-release identifiers, build numbers, optional build information. *

* @@ -1337,14 +1337,12 @@ int oSize = ob.version().size(); int min = Math.min(size, oSize); for (int i = 0; i < min; i++) { - Integer val = version.get(i); - Integer oVal = ob.version().get(i); + int val = version.get(i); + int oVal = ob.version().get(i); if (val != oVal) return val - oVal; } - if (size != oSize) - return size - oSize; - return 0; + return size - oSize; } private int comparePre(Version ob) { @@ -1375,9 +1373,9 @@ if (oBuild.isPresent()) { return (build.isPresent() ? build.get().compareTo(oBuild.get()) - : 1); + : -1); } else if (build.isPresent()) { - return -1; + return 1; } return 0; } @@ -1461,7 +1459,7 @@ * * @return {@code true} if, and only if, the given object is a {@code * Version} that is identical to this {@code Version} - * ignoring the optinal build information + * ignoring the optional build information * */ public boolean equalsIgnoreOptional(Object ob) { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/RuntimePermission.java --- a/jdk/src/java.base/share/classes/java/lang/RuntimePermission.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/RuntimePermission.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,7 @@ package java.lang; import java.security.*; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.StringTokenizer; +import java.lang.module.ModuleFinder; /** * This class is for runtime permissions. A {@code RuntimePermission} @@ -265,6 +263,16 @@ * * * + * defineClass + * Define a class with + * {@link java.lang.invoke.MethodHandles.Lookup#defineClass(byte[]) + * Lookup.defineClass}. + * This grants code with a suitably privileged {@code Lookup} object + * permission to define classes in the same package as the {@code Lookup}'s + * lookup class. + * + * + * * accessDeclaredMembers * Access to the declared members of a class * This grants code permission to query a class for its public, @@ -298,6 +306,14 @@ * * * + * getStackWalkerWithClassReference + * Get a stack walker that can retrieve stack frames with class reference. + * This allows retrieval of Class objects from stack walking. + * This might allow malicious code to access Class objects on the stack + * outside its own context. + * + * + * * setDefaultUncaughtExceptionHandler * Setting the default handler to be used when a thread * terminates abruptly due to an uncaught exception @@ -359,6 +375,14 @@ * See {@link java.lang.System.LoggerFinder java.lang.System.LoggerFinder} * for more information. * + * + * + * accessSystemModules + * Access system modules in the runtime image. + * This grants the permission to access resources in the + * {@linkplain ModuleFinder#ofSystem system modules} in the runtime image. + * + * * * * @implNote diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/StackFramePermission.java --- a/jdk/src/java.base/share/classes/java/lang/StackFramePermission.java Sat Apr 08 03:25:14 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package java.lang; - -/** - * Permission to access {@link StackWalker.StackFrame}. - * - * @see java.lang.StackWalker.Option#RETAIN_CLASS_REFERENCE - * @see StackWalker.StackFrame#getDeclaringClass() - */ -public class StackFramePermission extends java.security.BasicPermission { - private static final long serialVersionUID = 2841894854386706014L; - - /** - * Creates a new {@code StackFramePermission} object. - * - * @param name Permission name. Must be "retainClassReference". - * - * @throws IllegalArgumentException if {@code name} is invalid. - * @throws NullPointerException if {@code name} is {@code null}. - */ - public StackFramePermission(String name) { - super(name); - if (!name.equals("retainClassReference")) { - throw new IllegalArgumentException("name: " + name); - } - } -} diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/StackStreamFactory.java --- a/jdk/src/java.base/share/classes/java/lang/StackStreamFactory.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/StackStreamFactory.java Wed Jul 05 23:09:40 2017 +0200 @@ -982,13 +982,6 @@ } private static boolean isReflectionFrame(Class c) { - if (c.getName().startsWith("jdk.internal.reflect") && - !MethodAccessor.class.isAssignableFrom(c) && - !ConstructorAccessor.class.isAssignableFrom(c)) { - throw new InternalError("Not jdk.internal.reflect.MethodAccessor" - + " or jdk.internal.reflect.ConstructorAccessor: " - + c.toString()); - } // ## should filter all @Hidden frames? return c == Method.class || c == Constructor.class || diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/StackWalker.java --- a/jdk/src/java.base/share/classes/java/lang/StackWalker.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/StackWalker.java Wed Jul 05 23:09:40 2017 +0200 @@ -279,7 +279,7 @@ * If a security manager is present and the given {@code option} is * {@link Option#RETAIN_CLASS_REFERENCE Option.RETAIN_CLASS_REFERENCE}, * it calls its {@link SecurityManager#checkPermission checkPermission} - * method for {@code StackFramePermission("retainClassReference")}. + * method for {@code RuntimePermission("getStackWalkerWithClassReference")}. * * @param option {@link Option stack walking option} * @@ -303,7 +303,7 @@ * If a security manager is present and the given {@code options} contains * {@link Option#RETAIN_CLASS_REFERENCE Option.RETAIN_CLASS_REFERENCE}, * it calls its {@link SecurityManager#checkPermission checkPermission} - * method for {@code StackFramePermission("retainClassReference")}. + * method for {@code RuntimePermission("getStackWalkerWithClassReference")}. * * @param options {@link Option stack walking option} * @@ -333,7 +333,7 @@ * If a security manager is present and the given {@code options} contains * {@link Option#RETAIN_CLASS_REFERENCE Option.RETAIN_CLASS_REFERENCE}, * it calls its {@link SecurityManager#checkPermission checkPermission} - * method for {@code StackFramePermission("retainClassReference")}. + * method for {@code RuntimePermission("getStackWalkerWithClassReference")}. * *

* The {@code estimateDepth} specifies the estimate number of stack frames @@ -376,7 +376,7 @@ SecurityManager sm = System.getSecurityManager(); if (sm != null) { if (options.contains(Option.RETAIN_CLASS_REFERENCE)) { - sm.checkPermission(new StackFramePermission("retainClassReference")); + sm.checkPermission(new RuntimePermission("getStackWalkerWithClassReference")); } } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/String.java --- a/jdk/src/java.base/share/classes/java/lang/String.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/String.java Wed Jul 05 23:09:40 2017 +0200 @@ -2672,7 +2672,6 @@ * point is passed through uninterpreted. * * @return an IntStream of char values from this sequence - * @since 9 */ @Override public IntStream chars() { @@ -2692,7 +2691,6 @@ * {@code int} values which are then passed to the stream. * * @return an IntStream of Unicode code points from this sequence - * @since 9 */ @Override public IntStream codePoints() { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/StringCoding.java --- a/jdk/src/java.base/share/classes/java/lang/StringCoding.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/StringCoding.java Wed Jul 05 23:09:40 2017 +0200 @@ -272,8 +272,7 @@ // (2)The defensive copy of the input byte/char[] has a big performance // impact, as well as the outgoing result byte/char[]. Need to do the // optimization check of (sm==null && classLoader0==null) for both. - // (3)getClass().getClassLoader0() is expensive - // (4)There might be a timing gap in isTrusted setting. getClassLoader0() + // (3)There might be a timing gap in isTrusted setting. getClassLoader0() // is only checked (and then isTrusted gets set) when (SM==null). It is // possible that the SM==null for now but then SM is NOT null later // when safeTrim() is invoked...the "safe" way to do is to redundant @@ -299,8 +298,8 @@ if (len == 0) { return new Result().with(); } - if (System.getSecurityManager() != null && - cs.getClass().getClassLoader0() != null) { + if (cs.getClass().getClassLoader0() != null && + System.getSecurityManager() != null) { ba = Arrays.copyOfRange(ba, off, off + len); off = 0; } @@ -609,8 +608,8 @@ if (len == 0) { return ba; } - boolean isTrusted = System.getSecurityManager() == null || - cs.getClass().getClassLoader0() == null; + boolean isTrusted = cs.getClass().getClassLoader0() == null || + System.getSecurityManager() == null; ce.onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE) .reset(); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/System.java --- a/jdk/src/java.base/share/classes/java/lang/System.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/System.java Wed Jul 05 23:09:40 2017 +0200 @@ -43,6 +43,7 @@ import java.lang.reflect.Module; import java.net.URL; import java.security.AccessControlContext; +import java.security.ProtectionDomain; import java.util.Properties; import java.util.PropertyPermission; import java.util.Map; @@ -1569,6 +1570,14 @@ * obtained by calling {@link LoggerFinder#getLogger(java.lang.String, * java.lang.reflect.Module) LoggerFinder.getLogger(name, module)}, where * {@code module} is the caller's module. + * In cases where {@code System.getLogger} is called from a context where + * there is no caller frame on the stack (e.g when called directly + * from a JNI attached thread), {@code IllegalCallerException} is thrown. + * To obtain a logger in such a context, use an auxiliary class that will + * implicitly be identified as the caller, or use the system {@link + * LoggerFinder#getLoggerFinder() LoggerFinder} to obtain a logger instead. + * Note that doing the latter may eagerly initialize the underlying + * logging system. * * @apiNote * This method may defer calling the {@link @@ -1581,6 +1590,8 @@ * @return an instance of {@link Logger} that can be used by the calling * class. * @throws NullPointerException if {@code name} is {@code null}. + * @throws IllegalCallerException if there is no Java caller frame on the + * stack. * * @since 9 */ @@ -1588,6 +1599,9 @@ public static Logger getLogger(String name) { Objects.requireNonNull(name); final Class caller = Reflection.getCallerClass(); + if (caller == null) { + throw new IllegalCallerException("no caller frame"); + } return LazyLoggers.getLogger(name, caller.getModule()); } @@ -1601,8 +1615,16 @@ * The returned logger will perform message localization as specified * by {@link LoggerFinder#getLocalizedLogger(java.lang.String, * java.util.ResourceBundle, java.lang.reflect.Module) - * LoggerFinder.getLocalizedLogger(name, bundle, module}, where + * LoggerFinder.getLocalizedLogger(name, bundle, module)}, where * {@code module} is the caller's module. + * In cases where {@code System.getLogger} is called from a context where + * there is no caller frame on the stack (e.g when called directly + * from a JNI attached thread), {@code IllegalCallerException} is thrown. + * To obtain a logger in such a context, use an auxiliary class that + * will implicitly be identified as the caller, or use the system {@link + * LoggerFinder#getLoggerFinder() LoggerFinder} to obtain a logger instead. + * Note that doing the latter may eagerly initialize the underlying + * logging system. * * @apiNote * This method is intended to be used after the system is fully initialized. @@ -1621,6 +1643,8 @@ * resource bundle for message localization. * @throws NullPointerException if {@code name} is {@code null} or * {@code bundle} is {@code null}. + * @throws IllegalCallerException if there is no Java caller frame on the + * stack. * * @since 9 */ @@ -1629,6 +1653,9 @@ final ResourceBundle rb = Objects.requireNonNull(bundle); Objects.requireNonNull(name); final Class caller = Reflection.getCallerClass(); + if (caller == null) { + throw new IllegalCallerException("no caller frame"); + } final SecurityManager sm = System.getSecurityManager(); // We don't use LazyLoggers if a resource bundle is specified. // Bootstrap sensitive classes in the JDK do not use resource bundles @@ -1847,6 +1874,39 @@ } /** + * Logs an exception/error at initialization time to stdout or stderr. + * + * @param printToStderr to print to stderr rather than stdout + * @param printStackTrace to print the stack trace + * @param msg the message to print before the exception, can be {@code null} + * @param e the exception or error + */ + private static void logInitException(boolean printToStderr, + boolean printStackTrace, + String msg, + Throwable e) { + if (VM.initLevel() < 1) { + throw new InternalError("system classes not initialized"); + } + PrintStream log = (printToStderr) ? err : out; + if (msg != null) { + log.println(msg); + } + if (printStackTrace) { + e.printStackTrace(log); + } else { + log.println(e); + for (Throwable suppressed : e.getSuppressed()) { + log.println("Suppressed: " + suppressed); + } + Throwable cause = e.getCause(); + if (cause != null) { + log.println("Caused by: " + cause); + } + } + } + + /** * Initialize the system class. Called after thread initialization. */ private static void initPhase1() { @@ -1924,13 +1984,25 @@ /* * Invoked by VM. Phase 2 module system initialization. * Only classes in java.base can be loaded in this phase. + * + * @param printToStderr print exceptions to stderr rather than stdout + * @param printStackTrace print stack trace when exception occurs + * + * @return JNI_OK for success, JNI_ERR for failure */ - private static void initPhase2() { - // initialize the module system - System.bootLayer = ModuleBootstrap.boot(); + private static int initPhase2(boolean printToStderr, boolean printStackTrace) { + try { + bootLayer = ModuleBootstrap.boot(); + } catch (Exception | Error e) { + logInitException(printToStderr, printStackTrace, + "Error occurred during initialization of boot layer", e); + return -1; // JNI_ERR + } // module system initialized VM.initLevel(2); + + return 0; // JNI_OK } /* @@ -2036,6 +2108,9 @@ public ConcurrentHashMap createOrGetClassLoaderValueMap(ClassLoader cl) { return cl.createOrGetClassLoaderValueMap(); } + public Class defineClass(ClassLoader loader, String name, byte[] b, ProtectionDomain pd, String source) { + return ClassLoader.defineClass1(loader, name, b, 0, b.length, pd, source); + } public Class findBootstrapClassOrNull(ClassLoader cl, String name) { return cl.findBootstrapClassOrNull(name); } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java Wed Jul 05 23:09:40 2017 +0200 @@ -82,6 +82,7 @@ } }

* @author John Rose, JSR 292 EG + * @since 1.7 */ abstract public class CallSite { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/ConstantCallSite.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/ConstantCallSite.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/ConstantCallSite.java Wed Jul 05 23:09:40 2017 +0200 @@ -30,6 +30,7 @@ * An {@code invokedynamic} instruction linked to a {@code ConstantCallSite} is permanently * bound to the call site's target. * @author John Rose, JSR 292 EG + * @since 1.7 */ public class ConstantCallSite extends CallSite { private final boolean isFrozen; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/LambdaConversionException.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaConversionException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaConversionException.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,6 +27,8 @@ /** * LambdaConversionException + * + * @since 1.8 */ public class LambdaConversionException extends Exception { private static final long serialVersionUID = 292L + 8L; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/LambdaMetafactory.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaMetafactory.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaMetafactory.java Wed Jul 05 23:09:40 2017 +0200 @@ -211,6 +211,7 @@ * theory, any method handle could be used. Currently supported are direct method * handles representing invocation of virtual, interface, constructor and static * methods. + * @since 1.8 */ public class LambdaMetafactory { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java Wed Jul 05 23:09:40 2017 +0200 @@ -423,6 +423,7 @@ * @see MethodType * @see MethodHandles * @author John Rose, JSR 292 EG + * @since 1.7 */ public abstract class MethodHandle { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleProxies.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleProxies.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleProxies.java Wed Jul 05 23:09:40 2017 +0200 @@ -38,6 +38,8 @@ /** * This class consists exclusively of static methods that help adapt * method handles to other JVM types, such as interfaces. + * + * @since 1.7 */ public class MethodHandleProxies { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,6 +25,9 @@ package java.lang.invoke; +import jdk.internal.misc.SharedSecrets; +import jdk.internal.module.IllegalAccessLogger; +import jdk.internal.org.objectweb.asm.ClassReader; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.Reflection; import jdk.internal.vm.annotation.ForceInline; @@ -43,6 +46,9 @@ import java.lang.reflect.Module; import java.lang.reflect.ReflectPermission; import java.nio.ByteOrder; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.ProtectionDomain; import java.util.ArrayList; import java.util.Arrays; import java.util.BitSet; @@ -191,6 +197,12 @@ } if ((lookup.lookupModes() & Lookup.MODULE) == 0) throw new IllegalAccessException("lookup does not have MODULE lookup mode"); + if (!callerModule.isNamed() && targetModule.isNamed()) { + IllegalAccessLogger logger = IllegalAccessLogger.illegalAccessLogger(); + if (logger != null) { + logger.logIfOpenedByBackdoor(lookup, targetClass); + } + } return new Lookup(targetClass); } @@ -855,6 +867,112 @@ return new Lookup(lookupClass(), newModes); } + /** + * Defines a class to the same class loader and in the same runtime package and + * {@linkplain java.security.ProtectionDomain protection domain} as this lookup's + * {@linkplain #lookupClass() lookup class}. + * + *

The {@linkplain #lookupModes() lookup modes} for this lookup must include + * {@link #PACKAGE PACKAGE} access as default (package) members will be + * accessible to the class. The {@code PACKAGE} lookup mode serves to authenticate + * that the lookup object was created by a caller in the runtime package (or derived + * from a lookup originally created by suitably privileged code to a target class in + * the runtime package). The lookup modes cannot include {@link #PRIVATE PRIVATE} + * access. A lookup with {@code PRIVATE} access can be downgraded to drop this lookup + * mode with the {@linkplain #dropLookupMode(int) dropLookupMode} method.

+ * + *

The {@code bytes} parameter is the class bytes of a valid class file (as defined + * by the The Java Virtual Machine Specification) with a class name in the + * same package as the lookup class.

+ * + *

This method does not run the class initializer. The class initializer may + * run at a later time, as detailed in section 12.4 of the The Java Language + * Specification.

+ * + *

If there is a security manager, its {@code checkPermission} method is first called + * to check {@code RuntimePermission("defineClass")}.

+ * + * @param bytes the class bytes + * @return the {@code Class} object for the class + * @throws IllegalArgumentException the bytes are for a class in a different package + * to the lookup class + * @throws IllegalAccessException if this lookup does not have {@code PACKAGE} access + * @throws UnsupportedOperationException if the lookup class has {@code PRIVATE} access + * @throws LinkageError if the class is malformed ({@code ClassFormatError}), cannot be + * verified ({@code VerifyError}), is already defined, or another linkage error occurs + * @throws SecurityException if denied by the security manager + * @throws NullPointerException if {@code bytes} is {@code null} + * @since 9 + * @spec JPMS + * @see Lookup#privateLookupIn + * @see Lookup#dropLookupMode + * @see ClassLoader#defineClass(String,byte[],int,int,ProtectionDomain) + */ + public Class defineClass(byte[] bytes) throws IllegalAccessException { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPermission(new RuntimePermission("defineClass")); + if (hasPrivateAccess()) + throw new UnsupportedOperationException("PRIVATE access not supported"); + if ((lookupModes() & PACKAGE) == 0) + throw new IllegalAccessException("Lookup does not have PACKAGE access"); + assert (lookupModes() & (MODULE|PUBLIC)) != 0; + + // parse class bytes to get class name (in internal form) + bytes = bytes.clone(); + String name; + try { + ClassReader reader = new ClassReader(bytes); + name = reader.getClassName(); + } catch (RuntimeException e) { + // ASM exceptions are poorly specified + ClassFormatError cfe = new ClassFormatError(); + cfe.initCause(e); + throw cfe; + } + + // get package and class name in binary form + String cn, pn; + int index = name.lastIndexOf('/'); + if (index == -1) { + cn = name; + pn = ""; + } else { + cn = name.replace('/', '.'); + pn = cn.substring(0, index); + } + if (!pn.equals(lookupClass.getPackageName())) { + throw new IllegalArgumentException("Class not in same package as lookup class"); + } + + // invoke the class loader's defineClass method + ClassLoader loader = lookupClass.getClassLoader(); + ProtectionDomain pd = (loader != null) ? lookupClassProtectionDomain() : null; + String source = "__Lookup_defineClass__"; + Class clazz = SharedSecrets.getJavaLangAccess().defineClass(loader, cn, bytes, pd, source); + assert clazz.getClassLoader() == lookupClass.getClassLoader() + && clazz.getPackageName().equals(lookupClass.getPackageName()) + && protectionDomain(clazz) == lookupClassProtectionDomain(); + return clazz; + } + + private ProtectionDomain lookupClassProtectionDomain() { + ProtectionDomain pd = cachedProtectionDomain; + if (pd == null) { + cachedProtectionDomain = pd = protectionDomain(lookupClass); + } + return pd; + } + + private ProtectionDomain protectionDomain(Class clazz) { + PrivilegedAction pa = clazz::getProtectionDomain; + return AccessController.doPrivileged(pa); + } + + // cached protection domain + private volatile ProtectionDomain cachedProtectionDomain; + + // Make sure outer class is initialized first. static { IMPL_NAMES.getClass(); } @@ -1948,7 +2066,7 @@ /** * Returns {@code true} if this lookup has {@code PRIVATE} access. - * @return {@code true} if this lookup has {@code PRIVATE} acesss. + * @return {@code true} if this lookup has {@code PRIVATE} access. * @since 9 */ public boolean hasPrivateAccess() { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/MethodType.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodType.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodType.java Wed Jul 05 23:09:40 2017 +0200 @@ -88,6 +88,7 @@ * (But the classes need not be initialized, as is the case with a {@code CONSTANT_Class}.) * This loading may occur at any time before the {@code MethodType} object is first derived. * @author John Rose, JSR 292 EG + * @since 1.7 */ public final class MethodType implements java.io.Serializable { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/MutableCallSite.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/MutableCallSite.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MutableCallSite.java Wed Jul 05 23:09:40 2017 +0200 @@ -81,6 +81,7 @@ * For target values which will be frequently updated, consider using * a {@linkplain VolatileCallSite volatile call site} instead. * @author John Rose, JSR 292 EG + * @since 1.7 */ public class MutableCallSite extends CallSite { /** diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/SerializedLambda.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/SerializedLambda.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/SerializedLambda.java Wed Jul 05 23:09:40 2017 +0200 @@ -54,6 +54,7 @@ * lambda actually captured by that class. * * @see LambdaMetafactory + * @since 1.8 */ public final class SerializedLambda implements Serializable { private static final long serialVersionUID = 8025925345765570181L; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/SwitchPoint.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/SwitchPoint.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/SwitchPoint.java Wed Jul 05 23:09:40 2017 +0200 @@ -108,6 +108,7 @@ * } * }
* @author Remi Forax, JSR 292 EG + * @since 1.7 */ public class SwitchPoint { private static final MethodHandle diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/invoke/VolatileCallSite.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/VolatileCallSite.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/VolatileCallSite.java Wed Jul 05 23:09:40 2017 +0200 @@ -40,6 +40,7 @@ * with {@code MutableCallSite}. * @see MutableCallSite * @author John Rose, JSR 292 EG + * @since 1.7 */ public class VolatileCallSite extends CallSite { /** diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/module/Configuration.java --- a/jdk/src/java.base/share/classes/java/lang/module/Configuration.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/module/Configuration.java Wed Jul 05 23:09:40 2017 +0200 @@ -112,11 +112,9 @@ // module constraints on target private final String osName; private final String osArch; - private final String osVersion; String osName() { return osName; } String osArch() { return osArch; } - String osVersion() { return osVersion; } private Configuration() { this.parents = Collections.emptyList(); @@ -125,7 +123,6 @@ this.nameToModule = Collections.emptyMap(); this.osName = null; this.osArch = null; - this.osVersion = null; } private Configuration(List parents, @@ -152,7 +149,6 @@ this.osName = resolver.osName(); this.osArch = resolver.osArch(); - this.osVersion = resolver.osVersion(); } /** @@ -281,6 +277,7 @@ * observability-related reasons:

* *
    + * *
  • A root module, or a direct or transitive dependency, is not * found.

  • * @@ -289,13 +286,6 @@ * descriptor ({@code module-info.class}) or two versions of the same * module are found in the same directory.

    * - *
  • A module with the required name is found but the module - * requires a different {@link ModuleDescriptor#osName() operating - * system}, {@link ModuleDescriptor#osArch() architecture}, or {@link - * ModuleDescriptor#osVersion() version} to other modules that have - * been resolved for the new configuration or modules in the parent - * configurations.

  • - * *
* *

Post-resolution consistency checks may fail with {@code @@ -306,6 +296,10 @@ *

  • A cycle is detected, say where module {@code m1} requires * module {@code m2} and {@code m2} requires {@code m1}.

  • * + *
  • A module reads two or more modules with the same name. This + * includes the case where a module reads another with the same name as + * itself.

  • + * *
  • Two or more modules in the configuration export the same * package to a module that reads both. This includes the case where a * module {@code M} containing package {@code p} reads another module @@ -319,8 +313,9 @@ * * * @implNote In the implementation then observability of modules may depend - * on referential integrity checks that ensure different builds of tightly - * coupled modules are not combined in the same configuration. + * on referential integrity or other checks that ensure different builds of + * tightly coupled modules or modules for specific operating systems or + * architectures are not combined in the same configuration. * * @param before * The before module finder to find modules diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java --- a/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java Wed Jul 05 23:09:40 2017 +0200 @@ -179,8 +179,10 @@ private final Set mods; private final String name; private final Version compiledVersion; + private final String rawCompiledVersion; - private Requires(Set ms, String mn, Version v) { + private Requires(Set ms, String mn, Version v, String vs) { + assert v == null || vs == null; if (ms.isEmpty()) { ms = Collections.emptySet(); } else { @@ -189,12 +191,14 @@ this.mods = ms; this.name = mn; this.compiledVersion = v; + this.rawCompiledVersion = vs; } private Requires(Set ms, String mn, Version v, boolean unused) { this.mods = ms; this.name = mn; this.compiledVersion = v; + this.rawCompiledVersion = null; } /** @@ -218,13 +222,34 @@ /** * Returns the version of the module if recorded at compile-time. * - * @return The version of the module if recorded at compile-time + * @return The version of the module if recorded at compile-time, + * or an empty {@code Optional} if no version was recorded or + * the version string recorded is {@linkplain Version#parse(String) + * unparseable} */ public Optional compiledVersion() { return Optional.ofNullable(compiledVersion); } /** + * Returns the string with the possibly-unparseable version of the module + * if recorded at compile-time. + * + * @return The string containing the version of the module if recorded + * at compile-time, or an empty {@code Optional} if no version + * was recorded + * + * @see #compiledVersion() + */ + public Optional rawCompiledVersion() { + if (compiledVersion != null) { + return Optional.of(compiledVersion.toString()); + } else { + return Optional.ofNullable(rawCompiledVersion); + } + } + + /** * Compares this module dependence to another. * *

    Two {@code Requires} objects are compared by comparing their @@ -236,7 +261,10 @@ * recorded at compile-time are compared. When comparing the versions * recorded at compile-time then a dependence that has a recorded * version is considered to succeed a dependence that does not have a - * recorded version.

    + * recorded version. If both recorded versions are {@linkplain + * Version#parse(String) unparseable} then the {@linkplain + * #rawCompiledVersion() raw version strings} are compared + * lexicographically.

    * * @param that * The module dependence to compare @@ -262,6 +290,10 @@ c = compare(this.compiledVersion, that.compiledVersion); if (c != 0) return c; + // rawCompiledVersion + c = compare(this.rawCompiledVersion, that.rawCompiledVersion); + if (c != 0) return c; + return 0; } @@ -289,7 +321,8 @@ return false; Requires that = (Requires)ob; return name.equals(that.name) && mods.equals(that.mods) - && Objects.equals(compiledVersion, that.compiledVersion); + && Objects.equals(compiledVersion, that.compiledVersion) + && Objects.equals(rawCompiledVersion, that.rawCompiledVersion); } /** @@ -306,6 +339,8 @@ int hash = name.hashCode() * 43 + mods.hashCode(); if (compiledVersion != null) hash = hash * 43 + compiledVersion.hashCode(); + if (rawCompiledVersion != null) + hash = hash * 43 + rawCompiledVersion.hashCode(); return hash; } @@ -774,7 +809,7 @@ /** * Returns the fully qualified class name of the service type. * - * @return The fully qualified class name of the service type. + * @return The fully qualified class name of the service type */ public String service() { return service; } @@ -1199,6 +1234,7 @@ private final String name; private final Version version; + private final String rawVersionString; private final Set modifiers; private final boolean open; // true if modifiers contains OPEN private final boolean automatic; // true if modifiers contains AUTOMATIC @@ -1209,12 +1245,10 @@ private final Set provides; private final Set packages; private final String mainClass; - private final String osName; - private final String osArch; - private final String osVersion; private ModuleDescriptor(String name, Version version, + String rawVersionString, Set modifiers, Set requires, Set exports, @@ -1222,13 +1256,12 @@ Set uses, Set provides, Set packages, - String mainClass, - String osName, - String osArch, - String osVersion) + String mainClass) { + assert version == null || rawVersionString == null; this.name = name; this.version = version; + this.rawVersionString = rawVersionString; this.modifiers = emptyOrUnmodifiableSet(modifiers); this.open = modifiers.contains(Modifier.OPEN); this.automatic = modifiers.contains(Modifier.AUTOMATIC); @@ -1242,9 +1275,6 @@ this.packages = emptyOrUnmodifiableSet(packages); this.mainClass = mainClass; - this.osName = osName; - this.osArch = osArch; - this.osVersion = osVersion; } /** @@ -1261,13 +1291,11 @@ Set provides, Set packages, String mainClass, - String osName, - String osArch, - String osVersion, int hashCode, boolean unused) { this.name = name; this.version = version; + this.rawVersionString = null; this.modifiers = modifiers; this.open = modifiers.contains(Modifier.OPEN); this.automatic = modifiers.contains(Modifier.AUTOMATIC); @@ -1278,9 +1306,6 @@ this.provides = provides; this.packages = packages; this.mainClass = mainClass; - this.osName = osName; - this.osArch = osArch; - this.osVersion = osVersion; this.hash = hashCode; } @@ -1394,18 +1419,37 @@ /** *

    Returns the module version.

    * - * @return This module's version + * @return This module's version, or an empty {@code Optional} if the + * module does not have a version or the version is + * {@linkplain Version#parse(String) unparseable} */ public Optional version() { return Optional.ofNullable(version); } /** + *

    Returns the string with the possibly-unparseable version of the + * module

    + * + * @return The string containing the version of the module or an empty + * {@code Optional} if the module does not have a version + * + * @see #version() + */ + public Optional rawVersion() { + if (version != null) { + return Optional.of(version.toString()); + } else { + return Optional.ofNullable(rawVersionString); + } + } + + /** *

    Returns a string containing the module name and, if present, its * version.

    * * @return A string containing the module name and, if present, its - * version. + * version */ public String toNameAndVersion() { if (version != null) { @@ -1425,40 +1469,11 @@ } /** - * Returns the operating system name if the module is operating system - * specific. - * - * @return The operating system name or an empty {@code Optional} - * if the module is not operating system specific - */ - public Optional osName() { - return Optional.ofNullable(osName); - } - - /** - * Returns the operating system architecture if the module is operating - * system architecture specific. + * Returns the set of packages in the module. * - * @return The operating system architecture or an empty {@code Optional} - * if the module is not operating system architecture specific - */ - public Optional osArch() { - return Optional.ofNullable(osArch); - } - - /** - * Returns the operating system version if the module is operating - * system version specific. - * - * @return The operating system version or an empty {@code Optional} - * if the module is not operating system version specific - */ - public Optional osVersion() { - return Optional.ofNullable(osVersion); - } - - /** - * Returns the set of packages in the module. + *

    The set of packages includes all exported and open packages, as well + * as the packages of any service providers, and the package for the main + * class.

    * * @return A possibly-empty unmodifiable set of the packages in the module */ @@ -1518,9 +1533,7 @@ final Set uses = new HashSet<>(); final Map provides = new HashMap<>(); Version version; - String osName; - String osArch; - String osVersion; + String rawVersionString; String mainClass; /** @@ -1604,24 +1617,21 @@ Objects.requireNonNull(compiledVersion); if (strict) mn = requireModuleName(mn); - return requires(new Requires(ms, mn, compiledVersion)); + return requires(new Requires(ms, mn, compiledVersion, null)); } /* package */Builder requires(Set ms, String mn, - String compiledVersion) { - Version v = null; + String rawCompiledVersion) { + Requires r; try { - v = Version.parse(compiledVersion); + Version v = Version.parse(rawCompiledVersion); + r = new Requires(ms, mn, v, null); } catch (IllegalArgumentException e) { - // for now, drop un-parsable version when non-strict if (strict) throw e; + r = new Requires(ms, mn, null, rawCompiledVersion); } - if (v == null) { - return requires(ms, mn); - } else { - return requires(ms, mn, v); - } + return requires(r); } /** @@ -1646,7 +1656,7 @@ public Builder requires(Set ms, String mn) { if (strict) mn = requireModuleName(mn); - return requires(new Requires(ms, mn, null)); + return requires(new Requires(ms, mn, null, null)); } /** @@ -1952,7 +1962,7 @@ * a class in a named package * @throws IllegalStateException * If a dependency on the service type has already been declared - * or this is a builder for an an automatic module + * or this is a builder for an automatic module */ public Builder uses(String service) { if (automatic) @@ -2068,6 +2078,7 @@ */ public Builder version(Version v) { version = requireNonNull(v); + rawVersionString = null; return this; } @@ -2086,18 +2097,15 @@ * @see Version#parse(String) */ public Builder version(String vs) { - Version v; - if (strict) { - v = Version.parse(vs); - } else { - try { - v = Version.parse(vs); - } catch (IllegalArgumentException ignore) { - // for now, ignore when non-strict - return this; - } + try { + version = Version.parse(vs); + rawVersionString = null; + } catch (IllegalArgumentException e) { + if (strict) throw e; + version = null; + rawVersionString = vs; } - return version(v); + return this; } /** @@ -2132,60 +2140,6 @@ } /** - * Sets the operating system name. - * - * @param name - * The operating system name - * - * @return This builder - * - * @throws IllegalArgumentException - * If {@code name} is {@code null} or the empty String - */ - public Builder osName(String name) { - if (name == null || name.isEmpty()) - throw new IllegalArgumentException("OS name is null or empty"); - osName = name; - return this; - } - - /** - * Sets the operating system architecture. - * - * @param arch - * The operating system architecture - * - * @return This builder - * - * @throws IllegalArgumentException - * If {@code name} is {@code null} or the empty String - */ - public Builder osArch(String arch) { - if (arch == null || arch.isEmpty()) - throw new IllegalArgumentException("OS arch is null or empty"); - osArch = arch; - return this; - } - - /** - * Sets the operating system version. - * - * @param version - * The operating system version - * - * @return This builder - * - * @throws IllegalArgumentException - * If {@code name} is {@code null} or the empty String - */ - public Builder osVersion(String version) { - if (version == null || version.isEmpty()) - throw new IllegalArgumentException("OS version is null or empty"); - osVersion = version; - return this; - } - - /** * Builds and returns a {@code ModuleDescriptor} from its components. * *

    The module will require "{@code java.base}" even if the dependence @@ -2208,6 +2162,7 @@ && !this.requires.containsKey("java.base")) { requires.add(new Requires(Set.of(Requires.Modifier.MANDATED), "java.base", + null, null)); } @@ -2215,6 +2170,7 @@ return new ModuleDescriptor(name, version, + rawVersionString, modifiers, requires, exports, @@ -2222,10 +2178,7 @@ uses, provides, packages, - mainClass, - osName, - osArch, - osVersion); + mainClass); } } @@ -2237,9 +2190,11 @@ * module names lexicographically. Where the module names are equal then the * module versions are compared. When comparing the module versions then a * module descriptor with a version is considered to succeed a module - * descriptor that does not have a version. Where the module names are equal - * and the versions are equal (or not present in both), then the set of - * modifiers are compared. Sets of modifiers are compared by comparing + * descriptor that does not have a version. If both versions are {@linkplain + * Version#parse(String) unparseable} then the {@linkplain #rawVersion() + * raw version strings} are compared lexicographically. Where the module names + * are equal and the versions are equal (or not present in both), then the + * set of modifiers are compared. Sets of modifiers are compared by comparing * a binary value computed for each set. If a modifier is present * in the set then the bit at the position of its ordinal is {@code 1} * in the binary value, otherwise {@code 0}. If the two set of modifiers @@ -2263,6 +2218,9 @@ c = compare(this.version, that.version); if (c != 0) return c; + c = compare(this.rawVersionString, that.rawVersionString); + if (c != 0) return c; + long v1 = modsValue(this.modifiers()); long v2 = modsValue(that.modifiers()); c = Long.compare(v1, v2); @@ -2289,15 +2247,6 @@ c = compare(this.mainClass, that.mainClass); if (c != 0) return c; - c = compare(this.osName, that.osName); - if (c != 0) return c; - - c = compare(this.osArch, that.osArch); - if (c != 0) return c; - - c = compare(this.osVersion, that.osVersion); - if (c != 0) return c; - return 0; } @@ -2333,10 +2282,8 @@ && uses.equals(that.uses) && provides.equals(that.provides) && Objects.equals(version, that.version) - && Objects.equals(mainClass, that.mainClass) - && Objects.equals(osName, that.osName) - && Objects.equals(osArch, that.osArch) - && Objects.equals(osVersion, that.osVersion)); + && Objects.equals(rawVersionString, that.rawVersionString) + && Objects.equals(mainClass, that.mainClass)); } /** @@ -2361,10 +2308,8 @@ hc = hc * 43 + uses.hashCode(); hc = hc * 43 + provides.hashCode(); hc = hc * 43 + Objects.hashCode(version); + hc = hc * 43 + Objects.hashCode(rawVersionString); hc = hc * 43 + Objects.hashCode(mainClass); - hc = hc * 43 + Objects.hashCode(osName); - hc = hc * 43 + Objects.hashCode(osArch); - hc = hc * 43 + Objects.hashCode(osVersion); if (hc == 0) hc = -1; hash = hc; @@ -2713,8 +2658,8 @@ public void requires(ModuleDescriptor.Builder builder, Set ms, String mn, - String compiledVersion) { - builder.requires(ms, mn, compiledVersion); + String rawCompiledVersion) { + builder.requires(ms, mn, rawCompiledVersion); } @Override @@ -2762,9 +2707,6 @@ Set provides, Set packages, String mainClass, - String osName, - String osArch, - String osVersion, int hashCode) { return new ModuleDescriptor(name, version, @@ -2776,9 +2718,6 @@ provides, packages, mainClass, - osName, - osArch, - osVersion, hashCode, false); } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/module/ModuleFinder.java --- a/jdk/src/java.base/share/classes/java/lang/module/ModuleFinder.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleFinder.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,8 +25,6 @@ package java.lang.module; -import java.io.File; -import java.io.FilePermission; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -43,9 +41,9 @@ import java.util.Set; import jdk.internal.module.ModuleBootstrap; +import jdk.internal.module.ModulePatcher; import jdk.internal.module.ModulePath; import jdk.internal.module.SystemModuleFinder; -import sun.security.action.GetPropertyAction; /** * A finder of modules. A {@code ModuleFinder} is used to find modules during @@ -146,9 +144,9 @@ * *

    If there is a security manager set then its {@link * SecurityManager#checkPermission(Permission) checkPermission} method is - * invoked to check that the caller has been granted {@link FilePermission} - * to recursively read the directory that is the value of the system - * property {@code java.home}.

    + * invoked to check that the caller has been granted + * {@link RuntimePermission RuntimePermission("accessSystemModules")} + * to access the system modules.

    * * @return A {@code ModuleFinder} that locates the system modules * @@ -156,26 +154,29 @@ * If denied by the security manager */ static ModuleFinder ofSystem() { - String home; - SecurityManager sm = System.getSecurityManager(); if (sm != null) { - PrivilegedAction pa = new GetPropertyAction("java.home"); - home = AccessController.doPrivileged(pa); - Permission p = new FilePermission(home + File.separator + "-", "read"); - sm.checkPermission(p); + sm.checkPermission(new RuntimePermission("accessSystemModules")); + PrivilegedAction pa = ModuleFinder::privilegedOfSystem; + return AccessController.doPrivileged(pa); } else { - home = System.getProperty("java.home"); + return privilegedOfSystem(); } + } + /** + * Returns a module finder that locates the system modules. This method + * assumes it has permissions to access the runtime image. + */ + private static ModuleFinder privilegedOfSystem() { + String home = System.getProperty("java.home"); Path modules = Paths.get(home, "lib", "modules"); if (Files.isRegularFile(modules)) { return SystemModuleFinder.getInstance(); } else { - Path mlib = Paths.get(home, "modules"); - if (Files.isDirectory(mlib)) { - // exploded build may be patched - return ModulePath.of(ModuleBootstrap.patcher(), mlib); + Path dir = Paths.get(home, "modules"); + if (Files.isDirectory(dir)) { + return privilegedOf(ModuleBootstrap.patcher(), dir); } else { throw new InternalError("Unable to detect the run-time image"); } @@ -183,6 +184,26 @@ } /** + * Returns a module finder that locates the system modules in an exploded + * image. The image may be patched. + */ + private static ModuleFinder privilegedOf(ModulePatcher patcher, Path dir) { + ModuleFinder finder = ModulePath.of(patcher, dir); + return new ModuleFinder() { + @Override + public Optional find(String name) { + PrivilegedAction> pa = () -> finder.find(name); + return AccessController.doPrivileged(pa); + } + @Override + public Set findAll() { + PrivilegedAction> pa = finder::findAll; + return AccessController.doPrivileged(pa); + } + }; + } + + /** * Returns a module finder that locates modules on the file system by * searching a sequence of directories and/or packaged modules. * @@ -201,7 +222,7 @@ * *

    If an element is a path to a directory of modules then each entry in * the directory is a packaged module or the top-level directory of an - * exploded module. It it an error if a directory contains more than one + * exploded module. It is an error if a directory contains more than one * module with the same name. If an element is a path to a directory, and * that directory contains a file named {@code module-info.class}, then the * directory is treated as an exploded module rather than a directory of diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/module/ModuleReader.java --- a/jdk/src/java.base/share/classes/java/lang/module/ModuleReader.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleReader.java Wed Jul 05 23:09:40 2017 +0200 @@ -48,7 +48,11 @@ *

    A resource in a module is identified by an abstract name that is a * '{@code /}'-separated path string. For example, module {@code java.base} may * have a resource "{@code java/lang/Object.class}" that, by convention, is the - * class file for {@code java.lang.Object}.

    + * class file for {@code java.lang.Object}. A module reader may treat + * directories in the module content as resources (whether it does or not is + * module reader specific). Where the module content contains a directory + * that can be located as a resource then its name ends with a slash ('/'). The + * directory can also be located with a name that drops the trailing slash.

    * *

    A {@code ModuleReader} is {@linkplain ModuleReference#open open} upon * creation and is closed by invoking the {@link #close close} method. Failure @@ -80,6 +84,9 @@ /** * Finds a resource, returning a URI to the resource in the module. * + *

    If the module reader can determine that the name locates a directory + * then the resulting URI will end with a slash ('/').

    + * * @param name * The name of the resource to open for reading * @@ -140,7 +147,7 @@ * * @apiNote This method is intended for high-performance class loading. It * is not capable (or intended) to read arbitrary large resources that - * could potentially be 2GB or larger. The rational for using this method + * could potentially be 2GB or larger. The rationale for using this method * in conjunction with the {@code release} method is to allow module reader * implementations manage buffers in an efficient manner. * @@ -195,7 +202,9 @@ /** * Lists the contents of the module, returning a stream of elements that - * are the names of all resources in the module. + * are the names of all resources in the module. Whether the stream of + * elements includes names corresponding to directories in the module is + * module reader specific. * *

    In lazy implementations then an {@code IOException} may be thrown * when using the stream to list the module contents. If this occurs then diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/module/Resolver.java --- a/jdk/src/java.base/share/classes/java/lang/module/Resolver.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/module/Resolver.java Wed Jul 05 23:09:40 2017 +0200 @@ -47,6 +47,7 @@ import jdk.internal.module.ModuleHashes; import jdk.internal.module.ModuleReferenceImpl; +import jdk.internal.module.ModuleTarget; /** * The resolver used by {@link Configuration#resolve} and {@link @@ -69,11 +70,9 @@ // module constraints on target platform private String osName; private String osArch; - private String osVersion; String osName() { return osName; } String osArch() { return osArch; } - String osVersion() { return osVersion; } /** * @throws IllegalArgumentException if there are more than one parent and @@ -110,16 +109,6 @@ } } } - value = parent.osVersion(); - if (value != null) { - if (osVersion == null) { - osVersion = value; - } else { - if (!value.equals(osVersion)) { - failParentConflict("OS version", osVersion, value); - } - } - } } } @@ -318,13 +307,15 @@ * the target platform with the constraints of other modules. */ private void addFoundModule(ModuleReference mref) { - ModuleDescriptor descriptor = mref.descriptor(); - nameToReference.put(descriptor.name(), mref); + String mn = mref.descriptor().name(); - if (descriptor.osName().isPresent() - || descriptor.osArch().isPresent() - || descriptor.osVersion().isPresent()) - checkTargetConstraints(descriptor); + if (mref instanceof ModuleReferenceImpl) { + ModuleTarget target = ((ModuleReferenceImpl)mref).moduleTarget(); + if (target != null) + checkTargetConstraints(mn, target); + } + + nameToReference.put(mn, mref); } /** @@ -332,58 +323,44 @@ * conflict with the constraints of other modules resolved so far or * modules in parent configurations. */ - private void checkTargetConstraints(ModuleDescriptor descriptor) { - String value = descriptor.osName().orElse(null); + private void checkTargetConstraints(String mn, ModuleTarget target) { + String value = target.osName(); if (value != null) { if (osName == null) { osName = value; } else { if (!value.equals(osName)) { - failTargetConstraint(descriptor); + failTargetConstraint(mn, target); } } } - value = descriptor.osArch().orElse(null); + value = target.osArch(); if (value != null) { if (osArch == null) { osArch = value; } else { if (!value.equals(osArch)) { - failTargetConstraint(descriptor); - } - } - } - value = descriptor.osVersion().orElse(null); - if (value != null) { - if (osVersion == null) { - osVersion = value; - } else { - if (!value.equals(osVersion)) { - failTargetConstraint(descriptor); + failTargetConstraint(mn, target); } } } } - private void failTargetConstraint(ModuleDescriptor md) { - String s1 = targetAsString(osName, osArch, osVersion); - String s2 = targetAsString(md); - findFail("Module %s has constraints on target platform that conflict" + - " with other modules: %s, %s", md.name(), s1, s2); + private void failTargetConstraint(String mn, ModuleTarget target) { + String s1 = targetAsString(osName, osArch); + String s2 = targetAsString(target.osName(), target.osArch()); + findFail("Module %s has constraints on target platform (%s) that" + + " conflict with other modules: %s", mn, s1, s2); } - private String targetAsString(ModuleDescriptor descriptor) { - String osName = descriptor.osName().orElse(null); - String osArch = descriptor.osArch().orElse(null); - String osVersion = descriptor.osVersion().orElse(null); - return targetAsString(osName, osArch, osVersion); + private String targetAsString(ModuleTarget target) { + return targetAsString(target.osName(), target.osArch()); } - private String targetAsString(String osName, String osArch, String osVersion) { + private String targetAsString(String osName, String osArch) { return new StringJoiner("-") .add(Objects.toString(osName, "*")) .add(Objects.toString(osArch, "*")) - .add(Objects.toString(osVersion, "*")) .toString(); } @@ -712,16 +689,30 @@ /** - * Checks the readability graph to ensure that no two modules export the - * same package to a module. This includes the case where module M has - * a local package P and M reads another module that exports P to M. - * Also checks the uses/provides of module M to ensure that it reads a - * module that exports the package of the service type to M. + * Checks the readability graph to ensure that + *

      + *
    1. A module does not read two or more modules with the same name. + * This includes the case where a module reads another another with the + * same name as itself.

    2. + *
    3. Two or more modules in the configuration don't export the same + * package to a module that reads both. This includes the case where a + * module {@code M} containing package {@code p} reads another module + * that exports {@code p} to {@code M}.

    4. + *
    5. A module {@code M} doesn't declare that it "{@code uses p.S}" + * or "{@code provides p.S with ...}" but package {@code p} is neither + * in module {@code M} nor exported to {@code M} by any module that + * {@code M} reads.

    6. + *
    */ private void checkExportSuppliers(Map> graph) { for (Map.Entry> e : graph.entrySet()) { ModuleDescriptor descriptor1 = e.getKey().descriptor(); + String name1 = descriptor1.name(); + + // the names of the modules that are read (including self) + Set names = new HashSet<>(); + names.add(name1); // the map of packages that are local or exported to descriptor1 Map packageToExporter = new HashMap<>(); @@ -737,9 +728,20 @@ for (ResolvedModule endpoint : reads) { ModuleDescriptor descriptor2 = endpoint.descriptor(); + String name2 = descriptor2.name(); + if (descriptor2 != descriptor1 && !names.add(name2)) { + if (name2.equals(name1)) { + resolveFail("Module %s reads another module named %s", + name1, name1); + } else{ + resolveFail("Module %s reads more than one module named %s", + name1, name2); + } + } + if (descriptor2.isAutomatic()) { // automatic modules read self and export all packages - if (descriptor2 != descriptor1){ + if (descriptor2 != descriptor1) { for (String source : descriptor2.packages()) { ModuleDescriptor supplier = packageToExporter.putIfAbsent(source, descriptor2); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/reflect/AccessibleObject.java --- a/jdk/src/java.base/share/classes/java/lang/reflect/AccessibleObject.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/AccessibleObject.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,9 +28,12 @@ import java.lang.annotation.Annotation; import java.security.AccessController; +import jdk.internal.misc.VM; +import jdk.internal.module.IllegalAccessLogger; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.Reflection; import jdk.internal.reflect.ReflectionFactory; +import sun.security.action.GetPropertyAction; /** * The {@code AccessibleObject} class is the base class for {@code Field}, @@ -288,27 +291,20 @@ if (callerModule == Object.class.getModule()) return true; if (!declaringModule.isNamed()) return true; - // package is open to caller - String pn = packageName(declaringClass); - if (declaringModule.isOpen(pn, callerModule)) { - dumpStackIfOpenedReflectively(declaringModule, pn, callerModule); - return true; - } - - // package is exported to caller - boolean isExported = declaringModule.isExported(pn, callerModule); - boolean isClassPublic = Modifier.isPublic(declaringClass.getModifiers()); + String pn = declaringClass.getPackageName(); int modifiers; if (this instanceof Executable) { modifiers = ((Executable) this).getModifiers(); } else { modifiers = ((Field) this).getModifiers(); } - if (isExported && isClassPublic) { + // class is public and package is exported to caller + boolean isClassPublic = Modifier.isPublic(declaringClass.getModifiers()); + if (isClassPublic && declaringModule.isExported(pn, callerModule)) { // member is public if (Modifier.isPublic(modifiers)) { - dumpStackIfExportedReflectively(declaringModule, pn, callerModule); + logIfExportedByBackdoor(caller, declaringClass); return true; } @@ -316,11 +312,17 @@ if (Modifier.isProtected(modifiers) && Modifier.isStatic(modifiers) && isSubclassOf(caller, declaringClass)) { - dumpStackIfExportedReflectively(declaringModule, pn, callerModule); + logIfExportedByBackdoor(caller, declaringClass); return true; } } + // package is open to caller + if (declaringModule.isOpen(pn, callerModule)) { + logIfOpenedByBackdoor(caller, declaringClass); + return true; + } + if (throwExceptionIfDenied) { // not accessible String msg = "Unable to make "; @@ -333,7 +335,7 @@ msg += "opens"; msg += " " + pn + "\" to " + callerModule; InaccessibleObjectException e = new InaccessibleObjectException(msg); - if (Reflection.printStackTraceWhenAccessFails()) { + if (printStackTraceWhenAccessFails()) { e.printStackTrace(System.err); } throw e; @@ -351,48 +353,35 @@ return false; } - private void dumpStackIfOpenedReflectively(Module module, - String pn, - Module other) { - dumpStackIfExposedReflectively(module, pn, other, true); - } - - private void dumpStackIfExportedReflectively(Module module, - String pn, - Module other) { - dumpStackIfExposedReflectively(module, pn, other, false); + private void logIfOpenedByBackdoor(Class caller, Class declaringClass) { + Module callerModule = caller.getModule(); + Module targetModule = declaringClass.getModule(); + // callerModule is null during early startup + if (callerModule != null && !callerModule.isNamed() && targetModule.isNamed()) { + IllegalAccessLogger logger = IllegalAccessLogger.illegalAccessLogger(); + if (logger != null) { + logger.logIfOpenedByBackdoor(caller, declaringClass, this::toShortString); + } + } } - private void dumpStackIfExposedReflectively(Module module, - String pn, - Module other, - boolean open) - { - if (Reflection.printStackTraceWhenAccessSucceeds() - && !module.isStaticallyExportedOrOpen(pn, other, open)) - { - String msg = other + " allowed to invoke setAccessible on "; - if (this instanceof Field) - msg += "field "; - msg += this; - new Exception(msg) { - private static final long serialVersionUID = 42L; - public String toString() { - return "WARNING: " + getMessage(); - } - }.printStackTrace(System.err); + private void logIfExportedByBackdoor(Class caller, Class declaringClass) { + Module callerModule = caller.getModule(); + Module targetModule = declaringClass.getModule(); + // callerModule is null during early startup + if (callerModule != null && !callerModule.isNamed() && targetModule.isNamed()) { + IllegalAccessLogger logger = IllegalAccessLogger.illegalAccessLogger(); + if (logger != null) { + logger.logIfExportedByBackdoor(caller, declaringClass, this::toShortString); + } } } /** - * Returns the package name of the given class. + * Returns a short descriptive string to describe this object in log messages. */ - private static String packageName(Class c) { - while (c.isArray()) { - c = c.getComponentType(); - } - String pn = c.getPackageName(); - return (pn != null) ? pn : ""; + String toShortString() { + return toString(); } /** @@ -409,6 +398,7 @@ * it should use {@link #canAccess(Object)}. * * @revised 9 + * @spec JPMS */ @Deprecated(since="9") public boolean isAccessible() { @@ -483,10 +473,7 @@ } else { targetClass = Modifier.isStatic(modifiers) ? null : obj.getClass(); } - return Reflection.verifyMemberAccess(caller, - declaringClass, - targetClass, - modifiers); + return verifyAccess(caller, declaringClass, targetClass, modifiers); } /** @@ -527,7 +514,7 @@ return AnnotatedElement.super.isAnnotationPresent(annotationClass); } - /** + /** * @throws NullPointerException {@inheritDoc} * @since 1.8 */ @@ -598,8 +585,21 @@ Class targetClass, int modifiers) throws IllegalAccessException { + if (!verifyAccess(caller, memberClass, targetClass, modifiers)) { + IllegalAccessException e = Reflection.newIllegalAccessException( + caller, memberClass, targetClass, modifiers); + if (printStackTraceWhenAccessFails()) { + e.printStackTrace(System.err); + } + throw e; + } + } + + final boolean verifyAccess(Class caller, Class memberClass, + Class targetClass, int modifiers) + { if (caller == memberClass) { // quick check - return; // ACCESS IS OK + return true; // ACCESS IS OK } Object cache = securityCheckCache; // read volatile if (targetClass != null // instance member or constructor @@ -610,26 +610,31 @@ Class[] cache2 = (Class[]) cache; if (cache2[1] == targetClass && cache2[0] == caller) { - return; // ACCESS IS OK + return true; // ACCESS IS OK } // (Test cache[1] first since range check for [1] // subsumes range check for [0].) } } else if (cache == caller) { // Non-protected case (or targetClass == memberClass or static member). - return; // ACCESS IS OK + return true; // ACCESS IS OK } // If no return, fall through to the slow path. - slowCheckMemberAccess(caller, memberClass, targetClass, modifiers); + return slowVerifyAccess(caller, memberClass, targetClass, modifiers); } // Keep all this slow stuff out of line: - void slowCheckMemberAccess(Class caller, Class memberClass, - Class targetClass, int modifiers) - throws IllegalAccessException + private boolean slowVerifyAccess(Class caller, Class memberClass, + Class targetClass, int modifiers) { - Reflection.ensureMemberAccess(caller, memberClass, targetClass, modifiers); + if (!Reflection.verifyMemberAccess(caller, memberClass, targetClass, modifiers)) { + // access denied + return false; + } + + // access okay + logIfExportedByBackdoor(caller, memberClass); // Success: Update the cache. Object cache = (targetClass != null @@ -643,5 +648,27 @@ // guarantees that the initializing stores for the cache // elements will occur before the volatile write. securityCheckCache = cache; // write volatile + return true; + } + + // true to print a stack trace when access fails + private static volatile boolean printStackWhenAccessFails; + + // true if printStack* values are initialized + private static volatile boolean printStackPropertiesSet; + + /** + * Returns true if a stack trace should be printed when access fails. + */ + private static boolean printStackTraceWhenAccessFails() { + if (!printStackPropertiesSet && VM.initLevel() >= 1) { + String s = GetPropertyAction.privilegedGetProperty( + "sun.reflect.debugModuleAccessChecks"); + if (s != null) { + printStackWhenAccessFails = !s.equalsIgnoreCase("false"); + } + printStackPropertiesSet = true; + } + return printStackWhenAccessFails; } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java --- a/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Constructor.java Wed Jul 05 23:09:40 2017 +0200 @@ -38,6 +38,7 @@ import sun.reflect.generics.scope.ConstructorScope; import java.lang.annotation.Annotation; import java.lang.annotation.AnnotationFormatError; +import java.util.StringJoiner; /** * {@code Constructor} provides information about, and access to, a single @@ -173,7 +174,6 @@ * @throws SecurityException if the request is denied by the security manager * or this is a constructor for {@code java.lang.Class} * - * @since 9 * @spec JPMS */ @Override @@ -360,6 +360,20 @@ sb.append(getDeclaringClass().getTypeName()); } + @Override + String toShortString() { + StringBuilder sb = new StringBuilder("constructor "); + sb.append(getDeclaringClass().getTypeName()); + sb.append('('); + StringJoiner sj = new StringJoiner(","); + for (Class parameterType : getParameterTypes()) { + sj.add(parameterType.getTypeName()); + } + sb.append(sj); + sb.append(')'); + return sb.toString(); + } + /** * Returns a string describing this {@code Constructor}, * including type parameters. The string is formatted as the diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/reflect/Field.java --- a/jdk/src/java.base/share/classes/java/lang/reflect/Field.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Field.java Wed Jul 05 23:09:40 2017 +0200 @@ -324,6 +324,11 @@ + getName()); } + @Override + String toShortString() { + return "field " + getDeclaringClass().getTypeName() + "." + getName(); + } + /** * Returns a string describing this {@code Field}, including * its generic type. The format is the access modifiers for the diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/reflect/Layer.java --- a/jdk/src/java.base/share/classes/java/lang/reflect/Layer.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Layer.java Wed Jul 05 23:09:40 2017 +0200 @@ -66,9 +66,7 @@ * ResolvedModule} in the configuration. For each resolved module that is * {@link ResolvedModule#reads() read}, the {@code Module} {@link * Module#canRead reads} the corresponding run-time {@code Module}, which may - * be in the same layer or a {@link #parents() parent} layer. The {@code Module} - * {@link Module#isExported(String) exports} and {@link Module#isOpen(String) - * opens} the packages described by its {@link ModuleDescriptor}.

    + * be in the same layer or a {@link #parents() parent} layer.

    * *

    The {@link #defineModulesWithOneLoader defineModulesWithOneLoader} and * {@link #defineModulesWithManyLoaders defineModulesWithManyLoaders} methods @@ -91,6 +89,28 @@ * built-in into the Java virtual machine. The boot layer will often be * the {@link #parents() parent} when creating additional layers.

    * + *

    Each {@code Module} in a layer is created so that it {@link + * Module#isExported(String) exports} and {@link Module#isOpen(String) opens} + * the packages described by its {@link ModuleDescriptor}. Qualified exports + * (where a package is exported to a set of target modules rather than all + * modules) are reified when creating the layer as follows:

    + *
      + *
    • If module {@code X} exports a package to {@code Y}, and if the + * runtime {@code Module} {@code X} reads {@code Module} {@code Y}, then + * the package is exported to {@code Module} {@code Y} (which may be in + * the same layer as {@code X} or a parent layer).
    • + * + *
    • If module {@code X} exports a package to {@code Y}, and if the + * runtime {@code Module} {@code X} does not read {@code Y} then target + * {@code Y} is located as if by invoking {@link #findModule(String) + * findModule} to find the module in the layer or its parent layers. If + * {@code Y} is found then the package is exported to the instance of + * {@code Y} that was found. If {@code Y} is not found then the qualified + * export is ignored.
    • + *
    + * + *

    Qualified opens are handled in same way as qualified exports.

    + * *

    As when creating a {@code Configuration}, * {@link ModuleDescriptor#isAutomatic() automatic} modules receive special * treatment when creating a layer. An automatic module is created in the @@ -193,7 +213,7 @@ } private void ensureInLayer(Module source) { - if (!layer.modules().contains(source)) + if (source.getLayer() != layer) throw new IllegalArgumentException(source + " not in layer"); } @@ -220,9 +240,8 @@ * @see Module#addReads */ public Controller addReads(Module source, Module target) { - Objects.requireNonNull(source); + ensureInLayer(source); Objects.requireNonNull(target); - ensureInLayer(source); Modules.addReads(source, target); return this; } @@ -248,9 +267,9 @@ * @see Module#addOpens */ public Controller addOpens(Module source, String pn, Module target) { - Objects.requireNonNull(source); + ensureInLayer(source); + Objects.requireNonNull(pn); Objects.requireNonNull(target); - ensureInLayer(source); Modules.addOpens(source, pn, target); return this; } @@ -408,8 +427,8 @@ * * *

    In addition, a layer cannot be created if the configuration contains - * a module named "{@code java.base}" or a module with a package name - * starting with "{@code java.}".

    + * a module named "{@code java.base}", or a module contains a package named + * "{@code java}" or a package with a name starting with "{@code java.}".

    * *

    If there is a security manager then the class loader created by * this method will load classes and resources with privileges that are @@ -418,7 +437,7 @@ * @param cf * The configuration for the layer * @param parentLayers - * The list parent layers in search order + * The list of parent layers in search order * @param parentLoader * The parent class loader for the class loader created by this * method; may be {@code null} for the bootstrap class loader @@ -485,7 +504,7 @@ * @param cf * The configuration for the layer * @param parentLayers - * The list parent layers in search order + * The list of parent layers in search order * @param parentLoader * The parent class loader for each of the class loaders created by * this method; may be {@code null} for the bootstrap class loader @@ -497,8 +516,10 @@ * the parent layers, including order * @throws LayerInstantiationException * If the layer cannot be created because the configuration contains - * a module named "{@code java.base}" or a module with a package - * name starting with "{@code java.}" + * a module named "{@code java.base}" or a module contains a package + * named "{@code java}" or a package with a name starting with + * "{@code java.}" + * * @throws SecurityException * If {@code RuntimePermission("createClassLoader")} or * {@code RuntimePermission("getClassLoader")} is denied by @@ -558,10 +579,11 @@ * *

    In addition, a layer cannot be created if the configuration contains * a module named "{@code java.base}", a configuration contains a module - * with a package name starting with "{@code java.}" is mapped to a class - * loader other than the {@link ClassLoader#getPlatformClassLoader() - * platform class loader}, or the function to map a module name to a class - * loader returns {@code null}.

    + * with a package named "{@code java}" or a package name starting with + * "{@code java.}" and the module is mapped to a class loader other than + * the {@link ClassLoader#getPlatformClassLoader() platform class loader}, + * or the function to map a module name to a class loader returns + * {@code null}.

    * *

    If the function to map a module name to class loader throws an error * or runtime exception then it is propagated to the caller of this method. @@ -575,7 +597,7 @@ * @param cf * The configuration for the layer * @param parentLayers - * The list parent layers in search order + * The list of parent layers in search order * @param clf * The function to map a module name to a class loader * @@ -754,10 +776,16 @@ * @return A possibly-empty unmodifiable set of the modules in this layer */ public Set modules() { - return Collections.unmodifiableSet( - nameToModule.values().stream().collect(Collectors.toSet())); + Set modules = this.modules; + if (modules == null) { + this.modules = modules = + Collections.unmodifiableSet(new HashSet<>(nameToModule.values())); + } + return modules; } + private volatile Set modules; + /** * Returns the module with the given name in this layer, or if not in this @@ -776,6 +804,8 @@ */ public Optional findModule(String name) { Objects.requireNonNull(name); + if (this == EMPTY_LAYER) + return Optional.empty(); Module m = nameToModule.get(name); if (m != null) return Optional.of(m); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/reflect/Method.java --- a/jdk/src/java.base/share/classes/java/lang/reflect/Method.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Method.java Wed Jul 05 23:09:40 2017 +0200 @@ -42,6 +42,7 @@ import java.lang.annotation.Annotation; import java.lang.annotation.AnnotationFormatError; import java.nio.ByteBuffer; +import java.util.StringJoiner; /** * A {@code Method} provides information about, and access to, a single method @@ -416,6 +417,21 @@ sb.append(getName()); } + @Override + String toShortString() { + StringBuilder sb = new StringBuilder("method "); + sb.append(getDeclaringClass().getTypeName()).append('.'); + sb.append(getName()); + sb.append('('); + StringJoiner sj = new StringJoiner(","); + for (Class parameterType : getParameterTypes()) { + sj.add(parameterType.getTypeName()); + } + sb.append(sj); + sb.append(')'); + return sb.toString(); + } + /** * Returns a string describing this {@code Method}, including * type parameters. The string is formatted as the method access diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/reflect/Module.java --- a/jdk/src/java.base/share/classes/java/lang/reflect/Module.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Module.java Wed Jul 05 23:09:40 2017 +0200 @@ -39,8 +39,10 @@ import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -51,11 +53,11 @@ import jdk.internal.loader.BuiltinClassLoader; import jdk.internal.loader.BootLoader; -import jdk.internal.loader.ResourceHelper; import jdk.internal.misc.JavaLangAccess; import jdk.internal.misc.JavaLangReflectModuleAccess; import jdk.internal.misc.SharedSecrets; import jdk.internal.module.ServicesCatalog; +import jdk.internal.module.Resources; import jdk.internal.org.objectweb.asm.AnnotationVisitor; import jdk.internal.org.objectweb.asm.Attribute; import jdk.internal.org.objectweb.asm.ClassReader; @@ -369,28 +371,19 @@ * If {@code syncVM} is {@code true} then the VM is notified. */ private void implAddReads(Module other, boolean syncVM) { - Objects.requireNonNull(other); - - // nothing to do - if (other == this || !this.isNamed()) - return; - - // check if we already read this module - Set reads = this.reads; - if (reads != null && reads.contains(other)) - return; + if (!canRead(other)) { + // update VM first, just in case it fails + if (syncVM) { + if (other == ALL_UNNAMED_MODULE) { + addReads0(this, null); + } else { + addReads0(this, other); + } + } - // update VM first, just in case it fails - if (syncVM) { - if (other == ALL_UNNAMED_MODULE) { - addReads0(this, null); - } else { - addReads0(this, other); - } + // add reflective read + reflectivelyReads.putIfAbsent(this, other, Boolean.TRUE); } - - // add reflective read - reflectivelyReads.putIfAbsent(this, other, Boolean.TRUE); } @@ -553,7 +546,7 @@ * Returns {@code true} if this module exports or opens a package to * the given module via its module declaration. */ - boolean isStaticallyExportedOrOpen(String pn, Module other, boolean open) { + private boolean isStaticallyExportedOrOpen(String pn, Module other, boolean open) { // package is open to everyone or Map> openPackages = this.openPackages; if (openPackages != null) { @@ -909,9 +902,7 @@ * Returns an array of the package names of the packages in this module. * *

    For named modules, the returned array contains an element for each - * package in the module. It may contain elements corresponding to packages - * added to the module, dynamic modules - * for example, after it was loaded. + * package in the module.

    * *

    For unnamed modules, this method is the equivalent to invoking the * {@link ClassLoader#getDefinedPackages() getDefinedPackages} method of @@ -950,15 +941,6 @@ } /** - * Add a package to this module. - * - * @apiNote This method is for Proxy use. - */ - void addPackage(String pn) { - implAddPackage(pn, true); - } - - /** * Add a package to this module without notifying the VM. * * @apiNote This method is VM white-box testing. @@ -1080,20 +1062,28 @@ // reads Set reads = new HashSet<>(); + + // name -> source Module when in parent layer + Map nameToSource = Collections.emptyMap(); + for (ResolvedModule other : resolvedModule.reads()) { Module m2 = null; if (other.configuration() == cf) { - String dn = other.reference().descriptor().name(); - m2 = nameToModule.get(dn); + // this configuration + m2 = nameToModule.get(other.name()); + assert m2 != null; } else { + // parent layer for (Layer parent: layer.parents()) { m2 = findModule(parent, other); if (m2 != null) break; } + assert m2 != null; + if (nameToSource.isEmpty()) + nameToSource = new HashMap<>(); + nameToSource.put(other.name(), m2); } - assert m2 != null; - reads.add(m2); // update VM view @@ -1107,7 +1097,7 @@ } // exports and opens - initExportsAndOpens(descriptor, nameToModule, m); + initExportsAndOpens(m, nameToSource, nameToModule, layer.parents()); } // register the modules in the boot layer @@ -1159,15 +1149,17 @@ .orElse(null); } + /** * Initialize the maps of exported and open packages for module m. */ - private static void initExportsAndOpens(ModuleDescriptor descriptor, + private static void initExportsAndOpens(Module m, + Map nameToSource, Map nameToModule, - Module m) - { + List parents) { // The VM doesn't special case open or automatic modules so need to // export all packages + ModuleDescriptor descriptor = m.getDescriptor(); if (descriptor.isOpen() || descriptor.isAutomatic()) { assert descriptor.opens().isEmpty(); for (String source : descriptor.packages()) { @@ -1187,8 +1179,7 @@ // qualified opens Set targets = new HashSet<>(); for (String target : opens.targets()) { - // only open to modules that are in this configuration - Module m2 = nameToModule.get(target); + Module m2 = findModule(target, nameToSource, nameToModule, parents); if (m2 != null) { addExports0(m, source, m2); targets.add(m2); @@ -1217,8 +1208,7 @@ // qualified exports Set targets = new HashSet<>(); for (String target : exports.targets()) { - // only export to modules that are in this configuration - Module m2 = nameToModule.get(target); + Module m2 = findModule(target, nameToSource, nameToModule, parents); if (m2 != null) { // skip qualified export if already open to m2 if (openToTargets == null || !openToTargets.contains(m2)) { @@ -1244,6 +1234,32 @@ m.exportedPackages = exportedPackages; } + /** + * Find the runtime Module with the given name. The module name is the + * name of a target module in a qualified exports or opens directive. + * + * @param target The target module to find + * @param nameToSource The modules in parent layers that are read + * @param nameToModule The modules in the layer under construction + * @param parents The parent layers + */ + private static Module findModule(String target, + Map nameToSource, + Map nameToModule, + List parents) { + Module m = nameToSource.get(target); + if (m == null) { + m = nameToModule.get(target); + if (m == null) { + for (Layer parent : parents) { + m = parent.findModule(target).orElse(null); + if (m != null) break; + } + } + } + return m; + } + // -- annotations -- @@ -1428,12 +1444,12 @@ name = name.substring(1); } - if (isNamed() && !ResourceHelper.isSimpleResource(name)) { + if (isNamed() && Resources.canEncapsulate(name)) { Module caller = Reflection.getCallerClass().getModule(); if (caller != this && caller != Object.class.getModule()) { // ignore packages added for proxies via addPackage Set packages = getDescriptor().packages(); - String pn = ResourceHelper.getPackageName(name); + String pn = Resources.toPackageName(name); if (packages.contains(pn) && !isOpen(pn, caller)) { // resource is in package not open to caller return null; @@ -1531,26 +1547,26 @@ m.implAddReads(Module.ALL_UNNAMED_MODULE); } @Override + public void addExports(Module m, String pn) { + m.implAddExportsOrOpens(pn, Module.EVERYONE_MODULE, false, true); + } + @Override public void addExports(Module m, String pn, Module other) { m.implAddExportsOrOpens(pn, other, false, true); } @Override + public void addExportsToAllUnnamed(Module m, String pn) { + m.implAddExportsOrOpens(pn, Module.ALL_UNNAMED_MODULE, false, true); + } + @Override + public void addOpens(Module m, String pn) { + m.implAddExportsOrOpens(pn, Module.EVERYONE_MODULE, true, true); + } + @Override public void addOpens(Module m, String pn, Module other) { m.implAddExportsOrOpens(pn, other, true, true); } @Override - public void addExportsToAll(Module m, String pn) { - m.implAddExportsOrOpens(pn, Module.EVERYONE_MODULE, false, true); - } - @Override - public void addOpensToAll(Module m, String pn) { - m.implAddExportsOrOpens(pn, Module.EVERYONE_MODULE, true, true); - } - @Override - public void addExportsToAllUnnamed(Module m, String pn) { - m.implAddExportsOrOpens(pn, Module.ALL_UNNAMED_MODULE, false, true); - } - @Override public void addOpensToAllUnnamed(Module m, String pn) { m.implAddExportsOrOpens(pn, Module.ALL_UNNAMED_MODULE, true, true); } @@ -1559,10 +1575,6 @@ m.implAddUses(service); } @Override - public void addPackage(Module m, String pn) { - m.implAddPackage(pn, true); - } - @Override public ServicesCatalog getServicesCatalog(Layer layer) { return layer.getServicesCatalog(); } @@ -1574,10 +1586,6 @@ public Stream layers(ClassLoader loader) { return Layer.layers(loader); } - @Override - public boolean isStaticallyExported(Module module, String pn, Module other) { - return module.isStaticallyExportedOrOpen(pn, other, false); - } }); } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java --- a/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -359,10 +359,11 @@ * @throws NullPointerException if the {@code interfaces} array * argument or any of its elements are {@code null} * - * @deprecated Proxy classes generated in a named module are encapsulated and not - * accessible to code outside its module. - * {@link Constructor#newInstance(Object...) Constructor.newInstance} will throw - * {@code IllegalAccessException} when it is called on an inaccessible proxy class. + * @deprecated Proxy classes generated in a named module are encapsulated + * and not accessible to code outside its module. + * {@link Constructor#newInstance(Object...) Constructor.newInstance} + * will throw {@code IllegalAccessException} when it is called on + * an inaccessible proxy class. * Use {@link #newProxyInstance(ClassLoader, Class[], InvocationHandler)} * to create a proxy instance instead. * @@ -511,17 +512,19 @@ "Unnamed package cannot be added to " + m); } - // add the package to the runtime module if not exists if (m.isNamed()) { - m.addPackage(proxyPkg); + if (!m.getDescriptor().packages().contains(proxyPkg)) { + throw new InternalError(proxyPkg + " not exist in " + m.getName()); + } } /* * Choose a name for the proxy class to generate. */ long num = nextUniqueNumber.getAndIncrement(); - String proxyName = proxyPkg.isEmpty() ? proxyClassNamePrefix + num - : proxyPkg + "." + proxyClassNamePrefix + num; + String proxyName = proxyPkg.isEmpty() + ? proxyClassNamePrefix + num + : proxyPkg + "." + proxyClassNamePrefix + num; ClassLoader loader = getLoader(m); trace(proxyName, m, loader, interfaces); @@ -581,9 +584,13 @@ c.getModule().getName(), c.getName(), access, ld); } - static void trace(String cn, Module module, ClassLoader loader, List> interfaces) { + static void trace(String cn, + Module module, + ClassLoader loader, + List> interfaces) { if (isDebug()) { - System.out.format("PROXY: %s/%s defined by %s%n", module.getName(), cn, loader); + System.err.format("PROXY: %s/%s defined by %s%n", + module.getName(), cn, loader); } if (isDebug("debug")) { interfaces.stream() @@ -592,7 +599,7 @@ } private static final String DEBUG = - GetPropertyAction.privilegedGetProperty("jdk.proxy.debug", ""); + GetPropertyAction.privilegedGetProperty("jdk.proxy.debug", ""); private static boolean isDebug() { return !DEBUG.isEmpty(); @@ -603,15 +610,16 @@ // ProxyBuilder instance members start here.... - private final ClassLoader loader; private final List> interfaces; private final Module module; ProxyBuilder(ClassLoader loader, List> interfaces) { if (!VM.isModuleSystemInited()) { - throw new InternalError("Proxy is not supported until module system is fully initialized"); + throw new InternalError("Proxy is not supported until " + + "module system is fully initialized"); } if (interfaces.size() > 65535) { - throw new IllegalArgumentException("interface limit exceeded: " + interfaces.size()); + throw new IllegalArgumentException("interface limit exceeded: " + + interfaces.size()); } Set> refTypes = referencedTypes(loader, interfaces); @@ -619,7 +627,6 @@ // IAE if violates any restrictions specified in newProxyInstance validateProxyInterfaces(loader, interfaces, refTypes); - this.loader = loader; this.interfaces = interfaces; this.module = mapToModule(loader, interfaces, refTypes); assert getLoader(module) == loader; @@ -659,8 +666,8 @@ * Validate the given proxy interfaces and the given referenced types * are visible to the defining loader. * - * @throws IllegalArgumentException if it violates the restrictions specified - * in {@link Proxy#newProxyInstance} + * @throws IllegalArgumentException if it violates the restrictions + * specified in {@link Proxy#newProxyInstance} */ private static void validateProxyInterfaces(ClassLoader loader, List> interfaces, @@ -731,9 +738,9 @@ * is in the same module of the package-private interface. * * If all proxy interfaces are public and at least one in a non-exported - * package, then the proxy class is in a dynamic module in a non-exported - * package. Reads edge and qualified exports are added for - * dynamic module to access. + * package, then the proxy class is in a dynamic module in a + * non-exported package. Reads edge and qualified exports are added + * for dynamic module to access. */ private static Module mapToModule(ClassLoader loader, List> interfaces, @@ -752,11 +759,12 @@ } } - // all proxy interfaces are public and exported, the proxy class is in unnamed module - // Such proxy class is accessible to any unnamed module and named module that - // can read unnamed module + // all proxy interfaces are public and exported, the proxy class + // is in unnamed module. Such proxy class is accessible to + // any unnamed module and named module that can read unnamed module if (packagePrivateTypes.isEmpty() && modulePrivateTypes.isEmpty()) { - return loader != null ? loader.getUnnamedModule() : BootLoader.getUnnamedModule(); + return loader != null ? loader.getUnnamedModule() + : BootLoader.getUnnamedModule(); } if (packagePrivateTypes.size() > 0) { @@ -778,7 +786,8 @@ Module target = null; for (Module m : packagePrivateTypes.values()) { if (getLoader(m) != loader) { - // the specified loader is not the same class loader of the non-public interface + // the specified loader is not the same class loader + // of the non-public interface throw new IllegalArgumentException( "non-public interface is not defined by the given loader"); } @@ -799,8 +808,9 @@ return target; } - // all proxy interfaces are public and at least one in a non-exported package - // map to dynamic proxy module and add reads edge and qualified exports, if necessary + // All proxy interfaces are public and at least one in a non-exported + // package. So maps to a dynamic proxy module and add reads edge + // and qualified exports, if necessary Module target = getDynamicModule(loader); // set up proxy class access to proxy interfaces and types @@ -856,8 +866,8 @@ private static final AtomicInteger counter = new AtomicInteger(); /* - * Define a dynamic module for the generated proxy classes in a non-exported package - * named com.sun.proxy.$MODULE. + * Define a dynamic module for the generated proxy classes in + * a non-exported package named com.sun.proxy.$MODULE. * * Each class loader will have one dynamic module. */ diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/nio/MappedByteBuffer.java --- a/jdk/src/java.base/share/classes/java/nio/MappedByteBuffer.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/nio/MappedByteBuffer.java Wed Jul 05 23:09:40 2017 +0200 @@ -213,7 +213,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public final MappedByteBuffer position(int newPosition) { @@ -223,7 +222,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public final MappedByteBuffer limit(int newLimit) { @@ -233,7 +231,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public final MappedByteBuffer mark() { @@ -243,7 +240,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public final MappedByteBuffer reset() { @@ -253,7 +249,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public final MappedByteBuffer clear() { @@ -263,7 +258,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public final MappedByteBuffer flip() { @@ -273,7 +267,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public final MappedByteBuffer rewind() { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/nio/X-Buffer.java.template --- a/jdk/src/java.base/share/classes/java/nio/X-Buffer.java.template Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/nio/X-Buffer.java.template Wed Jul 05 23:09:40 2017 +0200 @@ -1069,7 +1069,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public @@ -1083,7 +1082,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public @@ -1097,7 +1095,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public @@ -1111,7 +1108,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public @@ -1125,7 +1121,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public @@ -1139,7 +1134,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public @@ -1153,7 +1147,6 @@ /** * {@inheritDoc} - * @since 9 */ @Override public diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/nio/file/ClosedFileSystemException.java --- a/jdk/src/java.base/share/classes/java/nio/file/ClosedFileSystemException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/nio/file/ClosedFileSystemException.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,6 +28,8 @@ /** * Unchecked exception thrown when an attempt is made to invoke an operation on * a file and the file system is closed. + * + * @since 1.7 */ public class ClosedFileSystemException diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/nio/file/ClosedWatchServiceException.java --- a/jdk/src/java.base/share/classes/java/nio/file/ClosedWatchServiceException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/nio/file/ClosedWatchServiceException.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,6 +28,8 @@ /** * Unchecked exception thrown when an attempt is made to invoke an operation on * a watch service that is closed. + * + * @since 1.7 */ public class ClosedWatchServiceException diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/nio/file/FileSystemAlreadyExistsException.java --- a/jdk/src/java.base/share/classes/java/nio/file/FileSystemAlreadyExistsException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/nio/file/FileSystemAlreadyExistsException.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,6 +28,8 @@ /** * Runtime exception thrown when an attempt is made to create a file system that * already exists. + * + * @since 1.7 */ public class FileSystemAlreadyExistsException diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/nio/file/FileSystemNotFoundException.java --- a/jdk/src/java.base/share/classes/java/nio/file/FileSystemNotFoundException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/nio/file/FileSystemNotFoundException.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,6 +27,8 @@ /** * Runtime exception thrown when a file system cannot be found. + * + * @since 1.7 */ public class FileSystemNotFoundException diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/nio/file/InvalidPathException.java --- a/jdk/src/java.base/share/classes/java/nio/file/InvalidPathException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/nio/file/InvalidPathException.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,6 +29,8 @@ * Unchecked exception thrown when path string cannot be converted into a * {@link Path} because the path string contains invalid characters, or * the path string is invalid for other file system specific reasons. + * + * @since 1.7 */ public class InvalidPathException diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/nio/file/ProviderMismatchException.java --- a/jdk/src/java.base/share/classes/java/nio/file/ProviderMismatchException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/nio/file/ProviderMismatchException.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,6 +29,8 @@ * Unchecked exception thrown when an attempt is made to invoke a method on an * object created by one file system provider with a parameter created by a * different file system provider. + * + * @since 1.7 */ public class ProviderMismatchException extends java.lang.IllegalArgumentException diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/nio/file/ProviderNotFoundException.java --- a/jdk/src/java.base/share/classes/java/nio/file/ProviderNotFoundException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/nio/file/ProviderNotFoundException.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,6 +27,8 @@ /** * Runtime exception thrown when a provider of the required type cannot be found. + * + * @since 1.7 */ public class ProviderNotFoundException diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/nio/file/ReadOnlyFileSystemException.java --- a/jdk/src/java.base/share/classes/java/nio/file/ReadOnlyFileSystemException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/nio/file/ReadOnlyFileSystemException.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,6 +28,8 @@ /** * Unchecked exception thrown when an attempt is made to update an object * associated with a {@link FileSystem#isReadOnly() read-only} {@code FileSystem}. + * + * @since 1.7 */ public class ReadOnlyFileSystemException diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/security/SecureRandom.java --- a/jdk/src/java.base/share/classes/java/security/SecureRandom.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/security/SecureRandom.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ * *

    A cryptographically strong random number minimally complies with the * statistical random number generator tests specified in - * + * * FIPS 140-2, Security Requirements for Cryptographic Modules, * section 4.9.1. * Additionally, {@code SecureRandom} must produce non-deterministic output. @@ -651,8 +651,6 @@ * {@code SecureRandom}. * * @return the string representation - * - * @since 9 */ @Override public String toString() { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/security/SecureRandomSpi.java --- a/jdk/src/java.base/share/classes/java/security/SecureRandomSpi.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/security/SecureRandomSpi.java Wed Jul 05 23:09:40 2017 +0200 @@ -211,8 +211,6 @@ * {@code SecureRandom}. * * @return the string representation - * - * @since 9 */ @Override public String toString() { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/security/cert/X509CRL.java --- a/jdk/src/java.base/share/classes/java/security/cert/X509CRL.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/security/cert/X509CRL.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,7 @@ import java.security.Principal; import java.security.Provider; import java.security.PublicKey; +import java.security.Signature; import javax.security.auth.x500.X500Principal; import java.math.BigInteger; @@ -241,7 +242,17 @@ public void verify(PublicKey key, Provider sigProvider) throws CRLException, NoSuchAlgorithmException, InvalidKeyException, SignatureException { - X509CRLImpl.verify(this, key, sigProvider); + Signature sig = (sigProvider == null) + ? Signature.getInstance(getSigAlgName()) + : Signature.getInstance(getSigAlgName(), sigProvider); + sig.initVerify(key); + + byte[] tbsCRL = getTBSCertList(); + sig.update(tbsCRL, 0, tbsCRL.length); + + if (sig.verify(getSignature()) == false) { + throw new SignatureException("Signature does not match."); + } } /** diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/security/cert/X509Certificate.java --- a/jdk/src/java.base/share/classes/java/security/cert/X509Certificate.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/security/cert/X509Certificate.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -647,7 +647,7 @@ return X509CertImpl.getIssuerAlternativeNames(this); } - /** + /** * Verifies that this certificate was signed using the * private key that corresponds to the specified public key. * This method uses the signature verification engine @@ -673,6 +673,16 @@ public void verify(PublicKey key, Provider sigProvider) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, SignatureException { - X509CertImpl.verify(this, key, sigProvider); + Signature sig = (sigProvider == null) + ? Signature.getInstance(getSigAlgName()) + : Signature.getInstance(getSigAlgName(), sigProvider); + sig.initVerify(key); + + byte[] tbsCert = getTBSCertificate(); + sig.update(tbsCert, 0, tbsCert.length); + + if (sig.verify(getSignature()) == false) { + throw new SignatureException("Signature does not match."); + } } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/time/Duration.java --- a/jdk/src/java.base/share/classes/java/time/Duration.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/time/Duration.java Wed Jul 05 23:09:40 2017 +0200 @@ -1370,6 +1370,7 @@ * @return a {@code Duration} based on this duration with the time truncated, not null * @throws DateTimeException if the unit is invalid for truncation * @throws UnsupportedTemporalTypeException if the unit is not supported + * @since 9 */ public Duration truncatedTo(TemporalUnit unit) { Objects.requireNonNull(unit, "unit"); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/time/chrono/Era.java --- a/jdk/src/java.base/share/classes/java/time/chrono/Era.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/time/chrono/Era.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -310,8 +310,8 @@ * The parameters control the style of the returned text and the locale. *

    * If no textual mapping is found then the {@link #getValue() numeric value} is returned. - *

    - * This default implementation is suitable for all implementations. + * + * @apiNote This default implementation is suitable for most implementations. * * @param style the style of the text required, not null * @param locale the locale to use, not null diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/time/chrono/JapaneseEra.java --- a/jdk/src/java.base/share/classes/java/time/chrono/JapaneseEra.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/time/chrono/JapaneseEra.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -240,19 +240,10 @@ } /** - * Gets the textual representation of this era. - *

    - * This returns the textual name used to identify the era, - * suitable for presentation to the user. - * The parameters control the style of the returned text and the locale. - *

    - * If no textual mapping is found then the {@link #getValue() numeric value} - * is returned. + * {@inheritDoc} * - * @param style the style of the text required, not null - * @param locale the locale to use, not null - * @return the text value of the era, not null - * @since 9 + * @param style {@inheritDoc} + * @param locale {@inheritDoc} */ @Override public String getDisplayName(TextStyle style, Locale locale) { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java --- a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Wed Jul 05 23:09:40 2017 +0200 @@ -1278,6 +1278,7 @@ * * @param textStyle the text style to use, not null * @return this, for chaining, not null + * @since 9 */ public DateTimeFormatterBuilder appendGenericZoneText(TextStyle textStyle) { appendInternal(new ZoneTextPrinterParser(textStyle, null, true)); @@ -1303,6 +1304,7 @@ * @param textStyle the text style to use, not null * @param preferredZones the set of preferred zone ids, not null * @return this, for chaining, not null + * @since 9 */ public DateTimeFormatterBuilder appendGenericZoneText(TextStyle textStyle, Set preferredZones) { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/util/Date.java --- a/jdk/src/java.base/share/classes/java/util/Date.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/util/Date.java Wed Jul 05 23:09:40 2017 +0200 @@ -728,7 +728,6 @@ * @see java.util.Calendar * @deprecated As of JDK version 1.1, * replaced by {@code Calendar.get(Calendar.DAY_OF_MONTH)}. - * @deprecated */ @Deprecated public int getDate() { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/util/Iterator.java --- a/jdk/src/java.base/share/classes/java/util/Iterator.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/util/Iterator.java Wed Jul 05 23:09:40 2017 +0200 @@ -109,7 +109,8 @@ * Exceptions thrown by the action are relayed to the caller. *

    * The behavior of an iterator is unspecified if the action modifies the - * collection in any way (even by calling the {@link #remove remove} method), + * collection in any way (even by calling the {@link #remove remove} method + * or other mutator methods of {@code Iterator} subtypes), * unless an overriding class has specified a concurrent modification policy. *

    * Subsequent behavior of an iterator is unspecified if the action throws an diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/util/Observable.java --- a/jdk/src/java.base/share/classes/java/util/Observable.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/util/Observable.java Wed Jul 05 23:09:40 2017 +0200 @@ -69,6 +69,8 @@ * {@link java.beans} package. For reliable and ordered * messaging among threads, consider using one of the concurrent data * structures in the {@link java.util.concurrent} package. + * For reactive streams style programming, see the + * {@link java.util.concurrent.Flow} API. */ @Deprecated(since="9") public class Observable { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/util/ServiceLoader.java --- a/jdk/src/java.base/share/classes/java/util/ServiceLoader.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/util/ServiceLoader.java Wed Jul 05 23:09:40 2017 +0200 @@ -1007,6 +1007,7 @@ { static final String PREFIX = "META-INF/services/"; + Set providerNames = new HashSet<>(); // to avoid duplicates Enumeration configs; Iterator pending; Class nextClass; @@ -1016,7 +1017,7 @@ /** * Parse a single line from the given configuration file, adding the - * name on the line to the names list. + * name on the line to set of names if not already seen. */ private int parseLine(URL u, BufferedReader r, int lc, Set names) throws IOException @@ -1041,7 +1042,9 @@ if (!Character.isJavaIdentifierPart(cp) && (cp != '.')) fail(service, u, lc, "Illegal provider-class name: " + ln); } - names.add(ln); + if (providerNames.add(ln)) { + names.add(ln); + } } return lc + 1; } @@ -1072,7 +1075,7 @@ return true; } - Class clazz = null; + Class clazz; do { if (configs == null) { try { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/util/jar/Pack200.java --- a/jdk/src/java.base/share/classes/java/util/jar/Pack200.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/util/jar/Pack200.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -452,13 +452,13 @@ String CODE_ATTRIBUTE_PFX = "pack.code.attribute."; /** - * The unpacker's progress as a percentage, as periodically - * updated by the unpacker. + * The packer's progress as a percentage, as periodically + * updated by the packer. * Values of 0 - 100 are normal, and -1 indicates a stall. * Progress can be monitored by polling the value of this * property. *

    - * At a minimum, the unpacker must set progress to 0 + * At a minimum, the packer must set progress to 0 * at the beginning of a packing operation, and to 100 * at the end. */ @@ -623,7 +623,7 @@ * property. *

    * At a minimum, the unpacker must set progress to 0 - * at the beginning of a packing operation, and to 100 + * at the beginning of an unpacking operation, and to 100 * at the end. */ String PROGRESS = "unpack.progress"; @@ -631,7 +631,7 @@ /** * Get the set of this engine's properties. This set is * a "live view", so that changing its - * contents immediately affects the Packer engine, and + * contents immediately affects the Unpacker engine, and * changes from the engine (such as progress indications) * are immediately visible in the map. * diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/java/util/zip/ZipException.java --- a/jdk/src/java.base/share/classes/java/util/zip/ZipException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/util/zip/ZipException.java Wed Jul 05 23:09:40 2017 +0200 @@ -32,7 +32,7 @@ * * @author unascribed * @see java.io.IOException - * @since 1.0 + * @since 1.1 */ public diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/jmod/JmodFile.java --- a/jdk/src/java.base/share/classes/jdk/internal/jmod/JmodFile.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/jmod/JmodFile.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ bis.read(magic); if (magic[0] != JMOD_MAGIC_NUMBER[0] || magic[1] != JMOD_MAGIC_NUMBER[1]) { - throw new IOException("Invalid jmod file: " + file.toString()); + throw new IOException("Invalid JMOD file: " + file.toString()); } if (magic[2] > JMOD_MAJOR_VERSION || (magic[2] == JMOD_MAJOR_VERSION && magic[3] > JMOD_MINOR_VERSION)) { @@ -131,6 +131,13 @@ } /** + * Returns true if the entry is a directory in the JMOD file. + */ + public boolean isDirectory() { + return zipEntry.isDirectory(); + } + + /** * Returns the size of this entry. */ public long size() { @@ -186,12 +193,12 @@ public Entry getEntry(Section section, String name) { String entry = section.jmodDir() + "/" + name; ZipEntry ze = zipfile.getEntry(entry); - return (ze == null || ze.isDirectory()) ? null : new Entry(ze); + return (ze != null) ? new Entry(ze) : null; } /** * Opens an {@code InputStream} for reading the named entry of the given - * section in this jmod file. + * section in this JMOD file. * * @throws IOException if the named entry is not found, or I/O error * occurs when reading it @@ -201,7 +208,7 @@ { String entry = section.jmodDir() + "/" + name; ZipEntry e = zipfile.getEntry(entry); - if (e == null || e.isDirectory()) { + if (e == null) { throw new IOException(name + " not found: " + file); } return zipfile.getInputStream(e); @@ -217,11 +224,10 @@ } /** - * Returns a stream of non-directory entries in this jmod file. + * Returns a stream of entries in this JMOD file. */ public Stream stream() { return zipfile.stream() - .filter(e -> !e.isDirectory()) .map(Entry::new); } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystemProvider.java --- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystemProvider.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystemProvider.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,14 +65,12 @@ } /** - * Need FilePermission ${java.home}/-", "read" to create or get jrt:/ + * Need RuntimePermission "accessSystemModules" to create or get jrt:/ */ private void checkPermission() { SecurityManager sm = System.getSecurityManager(); if (sm != null) { - String home = SystemImage.RUNTIME_HOME; - FilePermission perm - = new FilePermission(home + File.separator + "-", "read"); + RuntimePermission perm = new RuntimePermission("accessSystemModules"); sm.checkPermission(perm); } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/loader/BootLoader.java --- a/jdk/src/java.base/share/classes/jdk/internal/loader/BootLoader.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/loader/BootLoader.java Wed Jul 05 23:09:40 2017 +0200 @@ -96,6 +96,14 @@ } /** + * Returns {@code true} if there is a class path associated with the + * BootLoader. + */ + public static boolean hasClassPath() { + return ClassLoaders.bootLoader().hasClassPath(); + } + + /** * Register a module with this class loader so that its classes (and * resources) become visible via this class loader. */ @@ -188,14 +196,6 @@ } /** - * Returns {@code true} if there is a class path associated with the - * BootLoader. - */ - public static boolean hasClassPath() { - return ClassLoaders.bootLoader().hasClassPath(); - } - - /** * Helper class to define {@code Package} objects for packages in modules * defined to the boot loader. */ diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java --- a/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java Wed Jul 05 23:09:40 2017 +0200 @@ -60,6 +60,7 @@ import jdk.internal.misc.VM; import jdk.internal.module.ModulePatcher.PatchedModuleReader; import jdk.internal.module.SystemModules; +import jdk.internal.module.Resources; /** @@ -163,6 +164,14 @@ } /** + * Returns {@code true} if there is a class path associated with this + * class loader. + */ + boolean hasClassPath() { + return ucp != null; + } + + /** * Register a module this this class loader. This has the effect of making * the types in the module visible. */ @@ -248,18 +257,24 @@ */ @Override public URL findResource(String name) { - String pn = ResourceHelper.getPackageName(name); + String pn = Resources.toPackageName(name); LoadedModule module = packageToModule.get(pn); if (module != null) { // resource is in a package of a module defined to this loader - if (module.loader() == this - && (name.endsWith(".class") || isOpen(module.mref(), pn))) { + if (module.loader() == this) { + URL url; try { - return findResource(module.name(), name); // checks URL + url = findResource(module.name(), name); // checks URL } catch (IOException ioe) { return null; } + if (url != null + && (name.endsWith(".class") + || url.toString().endsWith("/") + || isOpen(module.mref(), pn))) { + return url; + } } } else { @@ -293,15 +308,17 @@ public Enumeration findResources(String name) throws IOException { List checked = new ArrayList<>(); // list of checked URLs - String pn = ResourceHelper.getPackageName(name); + String pn = Resources.toPackageName(name); LoadedModule module = packageToModule.get(pn); if (module != null) { // resource is in a package of a module defined to this loader - if (module.loader() == this - && (name.endsWith(".class") || isOpen(module.mref(), pn))) { - URL url = findResource(module.name(), name); // checks URL - if (url != null) { + if (module.loader() == this) { + URL url = findResource(module.name(), name); // checks URL + if (url != null + && (name.endsWith(".class") + || url.toString().endsWith("/") + || isOpen(module.mref(), pn))) { checked.add(url); } } @@ -351,11 +368,13 @@ new PrivilegedExceptionAction<>() { @Override public List run() throws IOException { - List result = new ArrayList<>(); + List result = null; for (ModuleReference mref : nameToModule.values()) { URI u = moduleReaderFor(mref).find(name).orElse(null); if (u != null) { try { + if (result == null) + result = new ArrayList<>(); result.add(u.toURL()); } catch (MalformedURLException | IllegalArgumentException e) { @@ -375,7 +394,7 @@ map = new ConcurrentHashMap<>(); this.resourceCache = new SoftReference<>(map); } - if (urls.isEmpty()) + if (urls == null) urls = Collections.emptyList(); map.putIfAbsent(name, urls); } @@ -870,14 +889,6 @@ } /** - * Returns {@code true} if there is a class path associated with this - * class loader. - */ - boolean hasClassPath() { - return ucp != null; - } - - /** * Returns {@code true} if the specified package name is sealed according to * the given manifest. */ @@ -975,7 +986,7 @@ */ private boolean isOpen(ModuleReference mref, String pn) { ModuleDescriptor descriptor = mref.descriptor(); - if (descriptor.isOpen()) + if (descriptor.isOpen() || descriptor.isAutomatic()) return true; for (ModuleDescriptor.Opens opens : descriptor.opens()) { String source = opens.source(); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/loader/Loader.java --- a/jdk/src/java.base/share/classes/jdk/internal/loader/Loader.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/loader/Loader.java Wed Jul 05 23:09:40 2017 +0200 @@ -60,6 +60,7 @@ import java.util.stream.Stream; import jdk.internal.misc.SharedSecrets; +import jdk.internal.module.Resources; /** @@ -356,45 +357,52 @@ @Override public URL findResource(String name) { - URL url = null; - String pn = ResourceHelper.getPackageName(name); + String pn = Resources.toPackageName(name); LoadedModule module = localPackageToModule.get(pn); + if (module != null) { - if (name.endsWith(".class") || isOpen(module.mref(), pn)) { - try { - url = findResource(module.name(), name); - } catch (IOException ioe) { - // ignore + try { + URL url = findResource(module.name(), name); + if (url != null + && (name.endsWith(".class") + || url.toString().endsWith("/") + || isOpen(module.mref(), pn))) { + return url; } + } catch (IOException ioe) { + // ignore } + } else { for (ModuleReference mref : nameToModule.values()) { try { - url = findResource(mref.descriptor().name(), name); - if (url != null) - break; + URL url = findResource(mref.descriptor().name(), name); + if (url != null) return url; } catch (IOException ioe) { // ignore } } } - return url; + + return null; } @Override public Enumeration findResources(String name) throws IOException { List urls = new ArrayList<>(); - String pn = ResourceHelper.getPackageName(name); + String pn = Resources.toPackageName(name); LoadedModule module = localPackageToModule.get(pn); if (module != null) { - if (name.endsWith(".class") || isOpen(module.mref(), pn)) { - try { - URL url = findResource(module.name(), name); - if (url != null) - urls.add(url); - } catch (IOException ioe) { - // ignore + try { + URL url = findResource(module.name(), name); + if (url != null + && (name.endsWith(".class") + || url.toString().endsWith("/") + || isOpen(module.mref(), pn))) { + urls.add(url); } + } catch (IOException ioe) { + // ignore } } else { for (ModuleReference mref : nameToModule.values()) { @@ -643,7 +651,7 @@ */ private boolean isOpen(ModuleReference mref, String pn) { ModuleDescriptor descriptor = mref.descriptor(); - if (descriptor.isOpen()) + if (descriptor.isOpen() || descriptor.isAutomatic()) return true; for (ModuleDescriptor.Opens opens : descriptor.opens()) { String source = opens.source(); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/loader/ResourceHelper.java --- a/jdk/src/java.base/share/classes/jdk/internal/loader/ResourceHelper.java Sat Apr 08 03:25:14 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package jdk.internal.loader; - -import java.io.File; -import java.nio.file.Path; -import java.nio.file.Paths; - -import jdk.internal.module.Checks; - -/** - * Helper class for Class#getResource, Module#getResourceAsStream, and other - * methods that locate a resource in a module. - */ -public final class ResourceHelper { - private ResourceHelper() { } - - /** - * Returns the package name for a resource or the empty package if - * the resource name does not contain a slash. - */ - public static String getPackageName(String name) { - int index = name.lastIndexOf('/'); - if (index != -1) { - return name.substring(0, index).replace("/", "."); - } else { - return ""; - } - } - - /** - * Returns true if the resource is a simple resource. Simple - * resources can never be encapsulated. Resources ending in "{@code .class}" - * or where the package name is not a legal package name can not be - * encapsulated. - */ - public static boolean isSimpleResource(String name) { - int len = name.length(); - if (len > 6 && name.endsWith(".class")) { - return true; - } - if (!Checks.isPackageName(getPackageName(name))) { - return true; - } - return false; - } - - /** - * Converts a resource name to a file path. Returns {@code null} if the - * resource name cannot be converted into a file path. Resource names - * with empty elements, or elements that are "." or ".." are rejected, - * as is a resource name that translates to a file path with a root - * component. - */ - public static Path toFilePath(String name) { - // scan the resource name to eagerly reject obviously invalid names - int next; - int off = 0; - while ((next = name.indexOf('/', off)) != -1) { - int len = next - off; - if (!mayTranslate(name, off, len)) { - return null; - } - off = next + 1; - } - int rem = name.length() - off; - if (!mayTranslate(name, off, rem)) { - return null; - } - - // convert to file path - Path path; - if (File.separatorChar == '/') { - path = Paths.get(name); - } else { - // not allowed to embed file separators - if (name.contains(File.separator)) - return null; - path = Paths.get(name.replace('/', File.separatorChar)); - } - - // file path not allowed to have root component - return (path.getRoot() == null) ? path : null; - } - - /** - * Returns {@code true} if the element in a resource name is a candidate - * to translate to the element of a file path. - */ - private static boolean mayTranslate(String name, int off, int len) { - if (len <= 2) { - if (len == 0) - return false; - boolean starsWithDot = (name.charAt(off) == '.'); - if (len == 1 && starsWithDot) - return false; - if (len == 2 && starsWithDot && (name.charAt(off+1) == '.')) - return false; - } - return true; - } - -} diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java --- a/jdk/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java Wed Jul 05 23:09:40 2017 +0200 @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Function; +import java.util.Objects; import java.lang.System.LoggerFinder; import java.lang.System.Logger; import java.lang.ref.ReferenceQueue; @@ -155,6 +156,8 @@ @Override public final Logger getLogger(String name, Module module) { + Objects.requireNonNull(name, "name"); + Objects.requireNonNull(module, "module"); checkPermission(); return demandLoggerFor(name, module); } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java --- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java Wed Jul 05 23:09:40 2017 +0200 @@ -33,6 +33,7 @@ import java.lang.reflect.Module; import java.net.URL; import java.security.AccessControlContext; +import java.security.ProtectionDomain; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Stream; @@ -150,6 +151,11 @@ ConcurrentHashMap createOrGetClassLoaderValueMap(ClassLoader cl); /** + * Defines a class with the given name to a class loader. + */ + Class defineClass(ClassLoader cl, String name, byte[] b, ProtectionDomain pd, String source); + + /** * Returns a class loaded by the bootstrap class loader. */ Class findBootstrapClassOrNull(ClassLoader cl, String name); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangModuleAccess.java --- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangModuleAccess.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangModuleAccess.java Wed Jul 05 23:09:40 2017 +0200 @@ -73,7 +73,7 @@ void requires(ModuleDescriptor.Builder builder, Set ms, String mn, - String compiledVersion); + String rawCompiledVersion); /** * Returns a {@code ModuleDescriptor.Requires} of the given modifiers @@ -127,9 +127,6 @@ Set provides, Set packages, String mainClass, - String osName, - String osArch, - String osVersion, int hashCode); /** diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangReflectModuleAccess.java --- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangReflectModuleAccess.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangReflectModuleAccess.java Wed Jul 05 23:09:40 2017 +0200 @@ -66,33 +66,33 @@ void addReadsAllUnnamed(Module m); /** + * Update module m to export a package to all modules. + */ + void addExports(Module m, String pn); + + /** * Updates module m1 to export a package to module m2. The export does * not result in a strong reference to m2 (m2 can be GC'ed). */ void addExports(Module m1, String pkg, Module m2); /** + * Updates a module m to export a package to all unnamed modules. + */ + void addExportsToAllUnnamed(Module m, String pkg); + + /** + * Updates a module m to open a package to all modules. + */ + void addOpens(Module m, String pkg); + + /** * Updates module m1 to open a package to module m2. Opening the * package does not result in a strong reference to m2 (m2 can be GC'ed). */ void addOpens(Module m1, String pkg, Module m2); /** - * Updates a module m to export a package to all modules. - */ - void addExportsToAll(Module m, String pkg); - - /** - * Updates a module m to open a package to all modules. - */ - void addOpensToAll(Module m, String pkg); - - /** - * Updates a module m to export a package to all unnamed modules. - */ - void addExportsToAllUnnamed(Module m, String pkg); - - /** * Updates a module m to open a package to all unnamed modules. */ void addOpensToAllUnnamed(Module m, String pkg); @@ -103,11 +103,6 @@ void addUses(Module m, Class service); /** - * Add a package to the given module. - */ - void addPackage(Module m, String pkg); - - /** * Returns the ServicesCatalog for the given Layer. */ ServicesCatalog getServicesCatalog(Layer layer); @@ -123,12 +118,4 @@ * given class loader. */ Stream layers(ClassLoader loader); - - /** - * Tests if a module exports a package at least {@code other} via its - * module declaration. - * - * @apiNote This is a temporary method for debugging features. - */ - boolean isStaticallyExported(Module module, String pn, Module other); } \ No newline at end of file diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/Builder.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/Builder.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/Builder.java Wed Jul 05 23:09:40 2017 +0200 @@ -145,9 +145,6 @@ Set provides; Version version; String mainClass; - String osName; - String osArch; - String osVersion; Builder(String name) { this.name = name; @@ -248,30 +245,6 @@ } /** - * Sets the OS name. - */ - public Builder osName(String name) { - this.osName = name; - return this; - } - - /** - * Sets the OS arch. - */ - public Builder osArch(String arch) { - this.osArch = arch; - return this; - } - - /** - * Sets the OS version. - */ - public Builder osVersion(String version) { - this.osVersion = version; - return this; - } - - /** * Returns an immutable set of the module modifiers derived from the flags. */ private Set modifiers() { @@ -305,9 +278,6 @@ provides, packages, mainClass, - osName, - osArch, - osVersion, hashCode); } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/Checks.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/Checks.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/Checks.java Wed Jul 05 23:09:40 2017 +0200 @@ -180,41 +180,38 @@ } /** - * Returns {@code true} if the last character of the given name is legal - * as the last character of a module name. - * - * @throws IllegalArgumentException if name is empty + * Returns {@code true} if a given legal module name contains an identifier + * that doesn't end with a Java letter. */ - public static boolean hasLegalModuleNameLastCharacter(String name) { - if (name.isEmpty()) - throw new IllegalArgumentException("name is empty"); - int len = name.length(); - if (isASCIIString(name)) { - char c = name.charAt(len-1); - return Character.isJavaIdentifierStart(c); - } else { - int i = 0; - int cp = -1; - while (i < len) { - cp = name.codePointAt(i); - i += Character.charCount(cp); + public static boolean hasJavaIdentifierWithTrailingDigit(String name) { + // quick scan to allow names that are just ASCII without digits + boolean needToParse = false; + int i = 0; + while (i < name.length()) { + int c = name.charAt(i); + if (c > 0x7F || (c >= '0' && c <= '9')) { + needToParse = true; + break; } - return Character.isJavaIdentifierStart(cp); - } - } - - /** - * Returns true if the given string only contains ASCII characters. - */ - private static boolean isASCIIString(String s) { - int i = 0; - while (i < s.length()) { - int c = s.charAt(i); - if (c > 0x7F) - return false; i++; } - return true; + if (!needToParse) + return false; + + // slow path + int next; + int off = 0; + while ((next = name.indexOf('.', off)) != -1) { + int last = isJavaIdentifier(name, off, (next - off)); + if (!Character.isJavaIdentifierStart(last)) + return true; + off = next+1; + } + int last = isJavaIdentifier(name, off, name.length() - off); + if (!Character.isJavaIdentifierStart(last)) + return true; + return false; + } /** diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java Wed Jul 05 23:09:40 2017 +0200 @@ -292,11 +292,11 @@ attr.putShort(module_flags); // module_version - Version v = descriptor.version().orElse(null); - if (v == null) { + String vs = descriptor.rawVersion().orElse(null); + if (vs == null) { attr.putShort(0); } else { - int module_version_index = cw.newUTF8(v.toString()); + int module_version_index = cw.newUTF8(vs); attr.putShort(module_version_index); } @@ -320,11 +320,11 @@ attr.putShort(requires_flags); int requires_version_index; - v = r.compiledVersion().orElse(null); - if (v == null) { + vs = r.rawCompiledVersion().orElse(null); + if (vs == null) { requires_version_index = 0; } else { - requires_version_index = cw.newUTF8(v.toString()); + requires_version_index = cw.newUTF8(vs); } attr.putShort(requires_version_index); } @@ -553,8 +553,6 @@ * u2 os_name_index; * // index to CONSTANT_utf8_info structure with the OS arch * u2 os_arch_index - * // index to CONSTANT_utf8_info structure with the OS version - * u2 os_version_index; * } * * }

  • @@ -562,17 +560,23 @@ public static class ModuleTargetAttribute extends Attribute { private final String osName; private final String osArch; - private final String osVersion; - public ModuleTargetAttribute(String osName, String osArch, String osVersion) { + public ModuleTargetAttribute(String osName, String osArch) { super(MODULE_TARGET); this.osName = osName; this.osArch = osArch; - this.osVersion = osVersion; } public ModuleTargetAttribute() { - this(null, null, null); + this(null, null); + } + + public String osName() { + return osName; + } + + public String osArch() { + return osArch; } @Override @@ -586,7 +590,6 @@ String osName = null; String osArch = null; - String osVersion = null; int name_index = cr.readUnsignedShort(off); if (name_index != 0) @@ -598,12 +601,7 @@ osArch = cr.readUTF8(off, buf); off += 2; - int version_index = cr.readUnsignedShort(off); - if (version_index != 0) - osVersion = cr.readUTF8(off, buf); - off += 2; - - return new ModuleTargetAttribute(osName, osArch, osVersion); + return new ModuleTargetAttribute(osName, osArch); } @Override @@ -625,11 +623,6 @@ arch_index = cw.newUTF8(osArch); attr.putShort(arch_index); - int version_index = 0; - if (osVersion != null && osVersion.length() > 0) - version_index = cw.newUTF8(osVersion); - attr.putShort(version_index); - return attr; } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/IllegalAccessLogger.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/IllegalAccessLogger.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.internal.module; + +import java.io.PrintStream; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Module; +import java.net.URL; +import java.security.AccessController; +import java.security.CodeSource; +import java.security.PrivilegedAction; +import java.security.ProtectionDomain; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.WeakHashMap; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import jdk.internal.loader.BootLoader; +import sun.security.action.GetPropertyAction; + +/** + * Supports logging of access to members of API packages that are exported or + * opened via backdoor mechanisms to code in unnamed modules. + */ + +public final class IllegalAccessLogger { + + /** + * Holder class to lazily create the StackWalker object and determine + * if the stack trace should be printed + */ + static class Holder { + static final StackWalker STACK_WALKER; + static final boolean PRINT_STACK_TRACE; + + static { + PrivilegedAction pa = () -> + StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); + STACK_WALKER = AccessController.doPrivileged(pa); + + String name = "sun.reflect.debugModuleAccessChecks"; + String value = GetPropertyAction.privilegedGetProperty(name, null); + PRINT_STACK_TRACE = "access" .equals(value); + } + } + + // the maximum number of frames to capture + private static final int MAX_STACK_FRAMES = 32; + + // lock to avoid interference when printing stack traces + private static final Object OUTPUT_LOCK = new Object(); + + // caller -> usages + private final Map, Set> callerToUsages = new WeakHashMap<>(); + + // module -> (package name -> CLI option) + private final Map> exported; + private final Map> opened; + + // the print stream to send the warnings + private final PrintStream warningStream; + + private IllegalAccessLogger(Map> exported, + Map> opened, + PrintStream warningStream) { + this.exported = deepCopy(exported); + this.opened = deepCopy(opened); + this.warningStream = warningStream; + } + + /** + * Returns that a Builder that is seeded with the packages known to this logger. + */ + public Builder toBuilder() { + return new Builder(exported, opened); + } + + /** + * Logs access to the member of a target class by a caller class if the class + * is in a package that is exported via a backdoor mechanism. + * + * The {@code whatSupplier} supplies the message that describes the member. + */ + public void logIfExportedByBackdoor(Class caller, + Class target, + Supplier whatSupplier) { + Map packages = exported.get(target.getModule()); + if (packages != null) { + String how = packages.get(target.getPackageName()); + if (how != null) { + log(caller, whatSupplier.get(), how); + } + } + } + + /** + * Logs access to the member of a target class by a caller class if the class + * is in a package that is opened via a backdoor mechanism. + * + * The {@code what} parameter supplies the message that describes the member. + */ + public void logIfOpenedByBackdoor(Class caller, + Class target, + Supplier whatSupplier) { + Map packages = opened.get(target.getModule()); + if (packages != null) { + String how = packages.get(target.getPackageName()); + if (how != null) { + log(caller, whatSupplier.get(), how); + } + } + } + + /** + * Logs access by a caller class. The {@code what} parameter describes + * the member is accessed, the {@code how} parameter is the means by which + * access is allocated (CLI option for example). + */ + private void log(Class caller, String what, String how) { + log(caller, what, () -> { + PrivilegedAction pa = caller::getProtectionDomain; + CodeSource cs = AccessController.doPrivileged(pa).getCodeSource(); + URL url = (cs != null) ? cs.getLocation() : null; + String source = caller.getName(); + if (url != null) + source += " (" + url + ")"; + return "WARNING: Illegal access by " + source + " to " + what + + " (permitted by " + how + ")"; + }); + } + + + /** + * Logs access to caller class if the class is in a package that is opened via + * a backdoor mechanism. + */ + public void logIfOpenedByBackdoor(MethodHandles.Lookup caller, Class target) { + Map packages = opened.get(target.getModule()); + if (packages != null) { + String how = packages.get(target.getPackageName()); + if (how != null) { + log(caller.lookupClass(), target.getName(), () -> + "WARNING: Illegal access using Lookup on " + caller.lookupClass() + + " to " + target + " (permitted by " + how + ")"); + } + } + } + + /** + * Log access by a caller. The {@code what} parameter describes the class or + * member that is being accessed. The {@code msgSupplier} supplies the log + * message. + * + * To reduce output, this method only logs the access if it hasn't been seen + * previously. "Seen previously" is implemented as a map of caller class -> Usage, + * where a Usage is the "what" and a hash of the stack trace. The map has weak + * keys so it can be expunged when the caller is GC'ed/unloaded. + */ + private void log(Class caller, String what, Supplier msgSupplier) { + // stack trace without the top-most frames in java.base + List stack = Holder.STACK_WALKER.walk(s -> + s.dropWhile(this::isJavaBase) + .limit(MAX_STACK_FRAMES) + .collect(Collectors.toList()) + ); + + // check if the access has already been recorded + Usage u = new Usage(what, hash(stack)); + boolean firstUsage; + synchronized (this) { + firstUsage = callerToUsages.computeIfAbsent(caller, k -> new HashSet<>()).add(u); + } + + // log message if first usage + if (firstUsage) { + String msg = msgSupplier.get(); + if (Holder.PRINT_STACK_TRACE) { + synchronized (OUTPUT_LOCK) { + warningStream.println(msg); + stack.forEach(f -> warningStream.println("\tat " + f)); + } + } else { + warningStream.println(msg); + } + } + } + + private static class Usage { + private final String what; + private final int stack; + Usage(String what, int stack) { + this.what = what; + this.stack = stack; + } + @Override + public int hashCode() { + return what.hashCode() ^ stack; + } + @Override + public boolean equals(Object ob) { + if (ob instanceof Usage) { + Usage that = (Usage)ob; + return what.equals(that.what) && stack == (that.stack); + } else { + return false; + } + } + } + + /** + * Returns true if the stack frame is for a class in java.base. + */ + private boolean isJavaBase(StackWalker.StackFrame frame) { + Module caller = frame.getDeclaringClass().getModule(); + return "java.base".equals(caller.getName()); + } + + /** + * Computes a hash code for the give stack frames. The hash code is based + * on the class, method name, and BCI. + */ + private int hash(List stack) { + int hash = 0; + for (StackWalker.StackFrame frame : stack) { + hash = (31 * hash) + Objects.hash(frame.getDeclaringClass(), + frame.getMethodName(), + frame.getByteCodeIndex()); + } + return hash; + } + + // system-wide IllegalAccessLogger + private static volatile IllegalAccessLogger logger; + + /** + * Sets the system-wide IllegalAccessLogger + */ + public static void setIllegalAccessLogger(IllegalAccessLogger l) { + if (l.exported.isEmpty() && l.opened.isEmpty()) { + logger = null; + } else { + logger = l; + } + } + + /** + * Returns the system-wide IllegalAccessLogger or {@code null} if there is + * no logger. + */ + public static IllegalAccessLogger illegalAccessLogger() { + return logger; + } + + /** + * A builder for IllegalAccessLogger objects. + */ + public static class Builder { + private final Module UNNAMED = BootLoader.getUnnamedModule(); + private Map> exported; + private Map> opened; + private PrintStream warningStream = System.err; + + public Builder() { } + + public Builder(Map> exported, + Map> opened) { + this.exported = deepCopy(exported); + this.opened = deepCopy(opened); + } + + public Builder logAccessToExportedPackage(Module m, String pn, String how) { + if (!m.isExported(pn, UNNAMED)) { + if (exported == null) + exported = new HashMap<>(); + exported.computeIfAbsent(m, k -> new HashMap<>()).putIfAbsent(pn, how); + } + return this; + } + + public Builder logAccessToOpenPackage(Module m, String pn, String how) { + // opens implies exported at run-time. + logAccessToExportedPackage(m, pn, how); + + if (!m.isOpen(pn, UNNAMED)) { + if (opened == null) + opened = new HashMap<>(); + opened.computeIfAbsent(m, k -> new HashMap<>()).putIfAbsent(pn, how); + } + return this; + } + + public Builder warningStream(PrintStream warningStream) { + this.warningStream = Objects.requireNonNull(warningStream); + return this; + } + + /** + * Builds the logger. + */ + public IllegalAccessLogger build() { + return new IllegalAccessLogger(exported, opened, warningStream); + } + } + + + static Map> deepCopy(Map> map) { + if (map == null || map.isEmpty()) { + return new HashMap<>(); + } else { + Map> newMap = new HashMap<>(); + for (Map.Entry> e : map.entrySet()) { + newMap.put(e.getKey(), new HashMap<>(e.getValue())); + } + return newMap; + } + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java Wed Jul 05 23:09:40 2017 +0200 @@ -33,6 +33,7 @@ import java.lang.module.ModuleReference; import java.lang.module.ResolvedModule; import java.lang.reflect.Layer; +import java.lang.reflect.LayerInstantiationException; import java.lang.reflect.Module; import java.net.URI; import java.nio.file.Path; @@ -46,7 +47,6 @@ import java.util.Optional; import java.util.Set; import java.util.function.Function; -import java.util.stream.Stream; import jdk.internal.loader.BootLoader; import jdk.internal.loader.BuiltinClassLoader; @@ -327,8 +327,9 @@ for (String p : descriptor.packages()) { String other = packageToModule.putIfAbsent(p, name); if (other != null) { - fail("Package " + p + " in both module " - + name + " and module " + other); + String msg = "Package " + p + " in both module " + + name + " and module " + other; + throw new LayerInstantiationException(msg); } } } @@ -359,7 +360,7 @@ PerfCounters.loadModulesTime.addElapsedTimeFrom(t5); - // --add-reads, -add-exports/-add-opens + // --add-reads, --add-exports/--add-opens addExtraReads(bootLayer); addExtraExportsAndOpens(bootLayer); @@ -514,7 +515,6 @@ * additional packages specified on the command-line. */ private static void addExtraExportsAndOpens(Layer bootLayer) { - // --add-exports String prefix = "jdk.module.addexports."; Map> extraExports = decode(prefix); @@ -529,6 +529,23 @@ addExtraExportsOrOpens(bootLayer, extraOpens, true); } + // --permit-illegal-access + if (getAndRemoveProperty("jdk.module.permitIllegalAccess") != null) { + warn("--permit-illegal-access will be removed in the next major release"); + IllegalAccessLogger.Builder builder = new IllegalAccessLogger.Builder(); + Module unnamed = BootLoader.getUnnamedModule(); + bootLayer.modules().stream().forEach(m -> { + m.getDescriptor() + .packages() + .stream() + .filter(pn -> !m.isOpen(pn, unnamed)) // skip if opened by --add-opens + .forEach(pn -> { + builder.logAccessToOpenPackage(m, pn, "--permit-illegal-access"); + Modules.addOpensToAllUnnamed(m, pn); + }); + }); + IllegalAccessLogger.setIllegalAccessLogger(builder.build()); + } } private static void addExtraExportsOrOpens(Layer bootLayer, @@ -542,12 +559,12 @@ String key = e.getKey(); String[] s = key.split("/"); if (s.length != 2) - fail(unableToParse(option, "/", key)); + fail(unableToParse(option, "/", key)); String mn = s[0]; String pn = s[1]; if (mn.isEmpty() || pn.isEmpty()) - fail(unableToParse(option, "/", key)); + fail(unableToParse(option, "/", key)); // The exporting module is in the boot layer Module m; @@ -632,7 +649,7 @@ // value is (,)* or ()* if (!allowDuplicates && map.containsKey(key)) - fail(key + " specified more than once in " + option(prefix)); + fail(key + " specified more than once to " + option(prefix)); List values = map.computeIfAbsent(key, k -> new ArrayList<>()); int ntargets = 0; for (String s : rhs.split(regex)) { @@ -676,10 +693,6 @@ ModuleReference mref = rm.reference(); String mn = mref.descriptor().name(); - // emit warning if module name ends with a non-Java letter - if (!Checks.hasLegalModuleNameLastCharacter(mn)) - warn("Module name \"" + mn + "\" may soon be illegal"); - // emit warning if the WARN_INCUBATING module resolution bit set if (ModuleResolution.hasIncubatingWarning(mref)) { if (incubating == null) { @@ -705,7 +718,7 @@ } static void warnUnknownModule(String option, String mn) { - warn("Unknown module: " + mn + " specified in " + option); + warn("Unknown module: " + mn + " specified to " + option); } static String unableToParse(String option, String text, String value) { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java Wed Jul 05 23:09:40 2017 +0200 @@ -89,18 +89,24 @@ */ public static final class Attributes { private final ModuleDescriptor descriptor; + private final ModuleTarget target; private final ModuleHashes recordedHashes; private final ModuleResolution moduleResolution; Attributes(ModuleDescriptor descriptor, + ModuleTarget target, ModuleHashes recordedHashes, ModuleResolution moduleResolution) { this.descriptor = descriptor; + this.target = target; this.recordedHashes = recordedHashes; this.moduleResolution = moduleResolution; } public ModuleDescriptor descriptor() { return descriptor; } + public ModuleTarget target() { + return target; + } public ModuleHashes recordedHashes() { return recordedHashes; } @@ -221,8 +227,8 @@ Builder builder = null; Set allPackages = null; String mainClass = null; - String[] osValues = null; - ModuleHashes hashes = null; + ModuleTarget moduleTarget = null; + ModuleHashes moduelHashes = null; ModuleResolution moduleResolution = null; for (int i = 0; i < attributes_count ; i++) { @@ -251,12 +257,12 @@ break; case MODULE_TARGET : - osValues = readModuleTargetAttribute(in, cpool); + moduleTarget = readModuleTargetAttribute(in, cpool); break; case MODULE_HASHES : if (parseHashes) { - hashes = readModuleHashesAttribute(in, cpool); + moduelHashes = readModuleHashesAttribute(in, cpool); } else { in.skipBytes(length); } @@ -282,15 +288,10 @@ throw invalidModuleDescriptor(MODULE + " attribute not found"); } - // ModuleMainClass and ModuleTarget attributes + // ModuleMainClass attribute if (mainClass != null) { builder.mainClass(mainClass); } - if (osValues != null) { - if (osValues[0] != null) builder.osName(osValues[0]); - if (osValues[1] != null) builder.osArch(osValues[1]); - if (osValues[2] != null) builder.osVersion(osValues[2]); - } // If the ModulePackages attribute is not present then the packageFinder // is used to find the set of packages @@ -323,7 +324,10 @@ } ModuleDescriptor descriptor = builder.build(); - return new Attributes(descriptor, hashes, moduleResolution); + return new Attributes(descriptor, + moduleTarget, + moduelHashes, + moduleResolution); } /** @@ -422,7 +426,11 @@ Set targets = new HashSet<>(exports_to_count); for (int j=0; j targets = new HashSet<>(open_to_count); for (int j=0; j cw.visitAttribute(new ModuleMainClassAttribute(mc))); - // write ModuleTarget attribute if have any of OS name/arch/version - String osName = md.osName().orElse(null); - String osArch = md.osArch().orElse(null); - String osVersion = md.osVersion().orElse(null); - if (osName != null || osArch != null || osVersion != null) { - cw.visitAttribute(new ModuleTargetAttribute(osName, osArch, osVersion)); + // write ModuleTarget if there is a platform OS/arch + if (target != null) { + cw.visitAttribute(new ModuleTargetAttribute(target.osName(), + target.osArch())); } cw.visitEnd(); @@ -82,11 +80,23 @@ * Writes a module descriptor to the given output stream as a * module-info.class. */ + public static void write(ModuleDescriptor descriptor, + ModuleTarget target, + OutputStream out) + throws IOException + { + byte[] bytes = toModuleInfo(descriptor, target); + out.write(bytes); + } + + /** + * Writes a module descriptor to the given output stream as a + * module-info.class. + */ public static void write(ModuleDescriptor descriptor, OutputStream out) throws IOException { - byte[] bytes = toModuleInfo(descriptor); - out.write(bytes); + write(descriptor, null, out); } /** @@ -94,8 +104,7 @@ * in module-info.class format. */ public static ByteBuffer toByteBuffer(ModuleDescriptor descriptor) { - byte[] bytes = toModuleInfo(descriptor); + byte[] bytes = toModuleInfo(descriptor, null); return ByteBuffer.wrap(bytes); } - } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java Wed Jul 05 23:09:40 2017 +0200 @@ -55,7 +55,6 @@ import java.util.stream.Stream; import jdk.internal.loader.Resource; -import jdk.internal.loader.ResourceHelper; import jdk.internal.misc.JavaLangModuleAccess; import jdk.internal.misc.SharedSecrets; import sun.net.www.ParseUtil; @@ -165,9 +164,6 @@ descriptor.version().ifPresent(builder::version); descriptor.mainClass().ifPresent(builder::mainClass); - descriptor.osName().ifPresent(builder::osName); - descriptor.osArch().ifPresent(builder::osArch); - descriptor.osVersion().ifPresent(builder::osVersion); // original + new packages builder.packages(descriptor.packages()); @@ -179,10 +175,12 @@ // return a module reference to the patched module URI location = mref.location().orElse(null); + ModuleTarget target = null; ModuleHashes recordedHashes = null; ModuleResolution mres = null; if (mref instanceof ModuleReferenceImpl) { ModuleReferenceImpl impl = (ModuleReferenceImpl)mref; + target = impl.moduleTarget(); recordedHashes = impl.recordedHashes(); mres = impl.moduleResolution(); } @@ -191,6 +189,7 @@ location, () -> new PatchedModuleReader(paths, mref), this, + target, recordedHashes, null, mres); @@ -226,7 +225,7 @@ private volatile ModuleReader delegate; /** - * Creates the ModuleReader to reads resources a patched module. + * Creates the ModuleReader to reads resources in a patched module. */ PatchedModuleReader(List patches, ModuleReference mref) { List finders = new ArrayList<>(); @@ -291,13 +290,16 @@ } /** - * Finds a resources in the patch locations. Returns null if not found. + * Finds a resources in the patch locations. Returns null if not found + * or the name is "module-info.class" as that cannot be overridden. */ private Resource findResourceInPatch(String name) throws IOException { - for (ResourceFinder finder : finders) { - Resource r = finder.find(name); - if (r != null) - return r; + if (!name.equals("module-info.class")) { + for (ResourceFinder finder : finders) { + Resource r = finder.find(name); + if (r != null) + return r; + } } return null; } @@ -478,9 +480,7 @@ @Override public Stream list() throws IOException { - return jf.stream() - .filter(e -> !e.isDirectory()) - .map(JarEntry::getName); + return jf.stream().map(JarEntry::getName); } } @@ -500,14 +500,12 @@ @Override public Resource find(String name) throws IOException { - Path path = ResourceHelper.toFilePath(name); - if (path != null) { - Path file = dir.resolve(path); - if (Files.isRegularFile(file)) { - return newResource(name, dir, file); - } + Path file = Resources.toFilePath(dir, name); + if (file != null) { + return newResource(name, dir, file); + } else { + return null; } - return null; } private Resource newResource(String name, Path top, Path file) { @@ -550,11 +548,9 @@ @Override public Stream list() throws IOException { - return Files.find(dir, Integer.MAX_VALUE, - (path, attrs) -> attrs.isRegularFile()) - .map(f -> dir.relativize(f) - .toString() - .replace(File.separatorChar, '/')); + return Files.walk(dir, Integer.MAX_VALUE) + .map(f -> Resources.toResourceName(dir, f)) + .filter(s -> s.length() > 0); } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/ModulePath.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModulePath.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModulePath.java Wed Jul 05 23:09:40 2017 +0200 @@ -513,7 +513,7 @@ String pn = packageName(cn); if (!packages.contains(pn)) { String msg = "Provider class " + cn + " not in module"; - throw new IOException(msg); + throw new InvalidModuleDescriptorException(msg); } providerClasses.add(cn); } @@ -533,7 +533,7 @@ String pn = packageName(mainClass); if (!packages.contains(pn)) { String msg = "Main-Class " + mainClass + " not in module"; - throw new IOException(msg); + throw new InvalidModuleDescriptorException(msg); } builder.mainClass(mainClass); } @@ -609,11 +609,10 @@ // no module-info.class so treat it as automatic module try { ModuleDescriptor md = deriveModuleDescriptor(jf); - attrs = new ModuleInfo.Attributes(md, null, null); - } catch (IllegalArgumentException e) { - throw new FindException( - "Unable to derive module descriptor for: " - + jf.getName(), e); + attrs = new ModuleInfo.Attributes(md, null, null, null); + } catch (RuntimeException e) { + throw new FindException("Unable to derive module descriptor for " + + jf.getName(), e); } } else { @@ -672,18 +671,18 @@ /** * Maps the name of an entry in a JAR or ZIP file to a package name. * - * @throws IllegalArgumentException if the name is a class file in - * the top-level directory of the JAR/ZIP file (and it's - * not module-info.class) + * @throws InvalidModuleDescriptorException if the name is a class file in + * the top-level directory of the JAR/ZIP file (and it's not + * module-info.class) */ private Optional toPackageName(String name) { assert !name.endsWith("/"); int index = name.lastIndexOf("/"); if (index == -1) { if (name.endsWith(".class") && !name.equals(MODULE_INFO)) { - throw new IllegalArgumentException(name - + " found in top-level directory" - + " (unnamed package not allowed in module)"); + String msg = name + " found in top-level directory" + + " (unnamed package not allowed in module)"; + throw new InvalidModuleDescriptorException(msg); } return Optional.empty(); } @@ -701,8 +700,8 @@ * Maps the relative path of an entry in an exploded module to a package * name. * - * @throws IllegalArgumentException if the name is a class file in - * the top-level directory (and it's not module-info.class) + * @throws InvalidModuleDescriptorException if the name is a class file in + * the top-level directory (and it's not module-info.class) */ private Optional toPackageName(Path file) { assert file.getRoot() == null; @@ -711,9 +710,9 @@ if (parent == null) { String name = file.toString(); if (name.endsWith(".class") && !name.equals(MODULE_INFO)) { - throw new IllegalArgumentException(name - + " found in top-level directory" - + " (unnamed package not allowed in module)"); + String msg = name + " found in top-level directory" + + " (unnamed package not allowed in module)"; + throw new InvalidModuleDescriptorException(msg); } return Optional.empty(); } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferenceImpl.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferenceImpl.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferenceImpl.java Wed Jul 05 23:09:40 2017 +0200 @@ -46,6 +46,9 @@ // non-null if the module is patched private final ModulePatcher patcher; + // ModuleTarget if the module is OS/architecture specific + private final ModuleTarget target; + // the hashes of other modules recorded in this module private final ModuleHashes recordedHashes; @@ -65,6 +68,7 @@ URI location, Supplier readerSupplier, ModulePatcher patcher, + ModuleTarget target, ModuleHashes recordedHashes, ModuleHashes.HashSupplier hasher, ModuleResolution moduleResolution) @@ -72,6 +76,7 @@ super(descriptor, Objects.requireNonNull(location)); this.readerSupplier = readerSupplier; this.patcher = patcher; + this.target = target; this.recordedHashes = recordedHashes; this.hasher = hasher; this.moduleResolution = moduleResolution; @@ -94,6 +99,13 @@ } /** + * Returns the ModuleTarget or {@code null} if the no target platform. + */ + public ModuleTarget moduleTarget() { + return target; + } + + /** * Returns the hashes recorded in this module or {@code null} if there * are no hashes recorded. */ diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferences.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferences.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferences.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,7 +25,6 @@ package jdk.internal.module; -import java.io.File; import java.io.IOError; import java.io.IOException; import java.io.InputStream; @@ -50,7 +49,6 @@ import java.util.zip.ZipFile; import jdk.internal.jmod.JmodFile; -import jdk.internal.loader.ResourceHelper; import jdk.internal.misc.SharedSecrets; import jdk.internal.module.ModuleHashes.HashSupplier; import jdk.internal.util.jar.VersionedStream; @@ -78,6 +76,7 @@ uri, supplier, null, + attrs.target(), attrs.recordedHashes(), hasher, attrs.moduleResolution()); @@ -242,8 +241,7 @@ } private JarEntry getEntry(String name) { - JarEntry entry = jf.getJarEntry(Objects.requireNonNull(name)); - return (entry == null || entry.isDirectory()) ? null : entry; + return jf.getJarEntry(Objects.requireNonNull(name)); } @Override @@ -252,6 +250,8 @@ if (je != null) { if (jf.isMultiRelease()) name = SharedSecrets.javaUtilJarAccess().getRealName(jf, je); + if (je.isDirectory() && !name.endsWith("/")) + name += "/"; String encodedPath = ParseUtil.encodePath(name, false); String uris = "jar:" + uri + "!/" + encodedPath; return Optional.of(URI.create(uris)); @@ -274,7 +274,6 @@ Stream implList() throws IOException { // take snapshot to avoid async close List names = VersionedStream.stream(jf) - .filter(e -> !e.isDirectory()) .map(JarEntry::getName) .collect(Collectors.toList()); return names.stream(); @@ -316,6 +315,8 @@ Optional implFind(String name) { JmodFile.Entry je = getEntry(name); if (je != null) { + if (je.isDirectory() && !name.endsWith("/")) + name += "/"; String encodedPath = ParseUtil.encodePath(name, false); String uris = "jmod:" + uri + "!/" + encodedPath; return Optional.of(URI.create(uris)); @@ -376,26 +377,10 @@ if (closed) throw new IOException("ModuleReader is closed"); } - /** - * Returns a Path to access the given resource. Returns null if the - * resource name does not convert to a file path that locates a regular - * file in the module. - */ - private Path toFilePath(String name) { - Path path = ResourceHelper.toFilePath(name); - if (path != null) { - Path file = dir.resolve(path); - if (Files.isRegularFile(file)) { - return file; - } - } - return null; - } - @Override public Optional find(String name) throws IOException { ensureOpen(); - Path path = toFilePath(name); + Path path = Resources.toFilePath(dir, name); if (path != null) { try { return Optional.of(path.toUri()); @@ -410,7 +395,7 @@ @Override public Optional open(String name) throws IOException { ensureOpen(); - Path path = toFilePath(name); + Path path = Resources.toFilePath(dir, name); if (path != null) { return Optional.of(Files.newInputStream(path)); } else { @@ -421,7 +406,7 @@ @Override public Optional read(String name) throws IOException { ensureOpen(); - Path path = toFilePath(name); + Path path = Resources.toFilePath(dir, name); if (path != null) { return Optional.of(ByteBuffer.wrap(Files.readAllBytes(path))); } else { @@ -432,12 +417,9 @@ @Override public Stream list() throws IOException { ensureOpen(); - // sym links not followed - return Files.find(dir, Integer.MAX_VALUE, - (path, attrs) -> attrs.isRegularFile()) - .map(f -> dir.relativize(f) - .toString() - .replace(File.separatorChar, '/')); + return Files.walk(dir, Integer.MAX_VALUE) + .map(f -> Resources.toResourceName(dir, f)) + .filter(s -> s.length() > 0); } @Override diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/ModuleTarget.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleTarget.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.internal.module; + +public final class ModuleTarget { + + private final String osName; + private final String osArch; + + public ModuleTarget(String osName, String osArch) { + this.osName = osName; + this.osArch = osArch; + } + + public String osName() { + return osName; + } + + public String osArch() { + return osArch; + } + +} diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/Modules.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/Modules.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/Modules.java Wed Jul 05 23:09:40 2017 +0200 @@ -31,7 +31,6 @@ import java.net.URI; import java.security.AccessController; import java.security.PrivilegedAction; -import java.util.Set; import jdk.internal.loader.BootLoader; import jdk.internal.loader.ClassLoaders; @@ -39,10 +38,10 @@ import jdk.internal.misc.SharedSecrets; /** - * A helper class to allow JDK classes create dynamic modules and to update - * modules, exports and the readability graph. It is also invoked by the VM - * to add read edges when agents are instrumenting code that need to link - * to supporting classes. + * A helper class for creating and updating modules. This class is intended to + * support command-line options, tests, and the instrumentation API. It is also + * used by the VM to add read edges when agents are instrumenting code that + * need to link to supporting classes. * * The parameters that are package names in this API are the fully-qualified * names of the packages as defined in section 6.5.3 of The Java™ @@ -72,25 +71,7 @@ } /** - * Define a new module to the VM. The module has the given set of - * packages and is defined to the given class loader. - * - * The resulting Module is in a larval state in that it does not not read - * any other module and does not have any exports. - */ - public static Module defineModule(ClassLoader loader, - String name, - Set packages) - { - ModuleDescriptor descriptor = ModuleDescriptor.newModule(name) - .packages(packages) - .build(); - - return JLRMA.defineModule(loader, descriptor, null); - } - - /** - * Adds a read-edge so that module {@code m1} reads module {@code m1}. + * Updates m1 to read m2. * Same as m1.addReads(m2) but without a caller check. */ public static void addReads(Module m1, Module m2) { @@ -98,21 +79,46 @@ } /** - * Update module {@code m} to read all unnamed modules. + * Update module m to read all unnamed modules. */ public static void addReadsAllUnnamed(Module m) { JLRMA.addReadsAllUnnamed(m); } /** + * Update module m to export a package to all modules. + * + * This method is for intended for use by tests only. + */ + public static void addExports(Module m, String pn) { + JLRMA.addExports(m, pn); + } + + /** * Updates module m1 to export a package to module m2. - * Same as m1.addExports(pn, m2) but without a caller check. + * Same as m1.addExports(pn, m2) but without a caller check */ public static void addExports(Module m1, String pn, Module m2) { JLRMA.addExports(m1, pn, m2); } /** + * Updates module m to export a package to all unnamed modules. + */ + public static void addExportsToAllUnnamed(Module m, String pn) { + JLRMA.addExportsToAllUnnamed(m, pn); + } + + /** + * Update module m to open a package to all modules. + * + * This method is for intended for use by tests only. + */ + public static void addOpens(Module m, String pn) { + JLRMA.addOpens(m, pn); + } + + /** * Updates module m1 to open a package to module m2. * Same as m1.addOpens(pn, m2) but without a caller check. */ @@ -121,27 +127,6 @@ } /** - * Updates a module m to export a package to all modules. - */ - public static void addExportsToAll(Module m, String pn) { - JLRMA.addExportsToAll(m, pn); - } - - /** - * Updates a module m to open a package to all modules. - */ - public static void addOpensToAll(Module m, String pn) { - JLRMA.addOpensToAll(m, pn); - } - - /** - * Updates module m to export a package to all unnamed modules. - */ - public static void addExportsToAllUnnamed(Module m, String pn) { - JLRMA.addExportsToAllUnnamed(m, pn); - } - - /** * Updates module m to open a package to all unnamed modules. */ public static void addOpensToAllUnnamed(Module m, String pn) { @@ -149,7 +134,8 @@ } /** - * Updates module m to use a service + * Updates module m to use a service. + * Same as m2.addUses(service) but without a caller check. */ public static void addUses(Module m, Class service) { JLRMA.addUses(m, service); @@ -183,16 +169,6 @@ } /** - * Adds a package to a module's content. - * - * This method is a no-op if the module already contains the package or the - * module is an unnamed module. - */ - public static void addPackage(Module m, String pn) { - JLRMA.addPackage(m, pn); - } - - /** * Called by the VM when code in the given Module has been transformed by * an agent and so may have been instrumented to call into supporting * classes on the boot class path or application class path. diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/Resources.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/Resources.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.internal.module; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.attribute.BasicFileAttributes; + +/** + * A helper class to support working with resources in modules. Also provides + * support for translating resource names to file paths. + */ +public final class Resources { + private Resources() { } + + /** + * Return true if a resource can be encapsulated. Resource with names + * ending in ".class" or "/" cannot be encapsulated. Resource names + * that map to a legal package name can be encapsulated. + */ + public static boolean canEncapsulate(String name) { + int len = name.length(); + if (len > 6 && name.endsWith(".class")) { + return false; + } else { + return Checks.isPackageName(toPackageName(name)); + } + } + + /** + * Derive a package name for a resource. The package name + * returned by this method may not be a legal package name. This method + * returns null if the the resource name ends with a "/" (a directory) + * or the resource name does not contain a "/". + */ + public static String toPackageName(String name) { + int index = name.lastIndexOf('/'); + if (index == -1 || index == name.length()-1) { + return ""; + } else { + return name.substring(0, index).replace("/", "."); + } + } + + /** + * Returns a resource name corresponding to the relative file path + * between {@code dir} and {@code file}. If the file is a directory + * then the name will end with a "/", except the top-level directory + * where the empty string is returned. + */ + public static String toResourceName(Path dir, Path file) { + String s = dir.relativize(file) + .toString() + .replace(File.separatorChar, '/'); + if (s.length() > 0 && Files.isDirectory(file)) + s += "/"; + return s; + } + + /** + * Returns a file path to a resource in a file tree. If the resource + * name has a trailing "/" then the file path will locate a directory. + * Returns {@code null} if the resource does not map to a file in the + * tree file. + */ + public static Path toFilePath(Path dir, String name) throws IOException { + boolean expectDirectory = name.endsWith("/"); + if (expectDirectory) { + name = name.substring(0, name.length() - 1); // drop trailing "/" + } + Path path = toSafeFilePath(name); + if (path != null) { + Path file = dir.resolve(path); + try { + BasicFileAttributes attrs; + attrs = Files.readAttributes(file, BasicFileAttributes.class); + if (attrs.isDirectory() + || (!attrs.isDirectory() && !expectDirectory)) + return file; + } catch (NoSuchFileException ignore) { } + } + return null; + } + + /** + * Map a resource name to a "safe" file path. Returns {@code null} if + * the resource name cannot be converted into a "safe" file path. + * + * Resource names with empty elements, or elements that are "." or ".." + * are rejected, as are resource names that translates to a file path + * with a root component. + */ + private static Path toSafeFilePath(String name) { + // scan elements of resource name + int next; + int off = 0; + while ((next = name.indexOf('/', off)) != -1) { + int len = next - off; + if (!mayTranslate(name, off, len)) { + return null; + } + off = next + 1; + } + int rem = name.length() - off; + if (!mayTranslate(name, off, rem)) { + return null; + } + + // convert to file path + Path path; + if (File.separatorChar == '/') { + path = Paths.get(name); + } else { + // not allowed to embed file separators + if (name.contains(File.separator)) + return null; + path = Paths.get(name.replace('/', File.separatorChar)); + } + + // file path not allowed to have root component + return (path.getRoot() == null) ? path : null; + } + + /** + * Returns {@code true} if the element in a resource name is a candidate + * to translate to the element of a file path. + */ + private static boolean mayTranslate(String name, int off, int len) { + if (len <= 2) { + if (len == 0) + return false; + boolean starsWithDot = (name.charAt(off) == '.'); + if (len == 1 && starsWithDot) + return false; + if (len == 2 && starsWithDot && (name.charAt(off+1) == '.')) + return false; + } + return true; + } + +} diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/SystemModuleFinder.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/SystemModuleFinder.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/SystemModuleFinder.java Wed Jul 05 23:09:40 2017 +0200 @@ -150,18 +150,21 @@ System.getProperty("jdk.system.module.finder.disabledFastPath") != null; ModuleDescriptor[] descriptors; + ModuleTarget[] targets; ModuleHashes[] recordedHashes; ModuleResolution[] moduleResolutions; // fast loading of ModuleDescriptor of system modules if (isFastPathSupported() && !disabled) { descriptors = SystemModules.descriptors(); + targets = SystemModules.targets(); recordedHashes = SystemModules.hashes(); moduleResolutions = SystemModules.moduleResolutions(); } else { // if fast loading of ModuleDescriptors is disabled // fallback to read module-info.class descriptors = new ModuleDescriptor[n]; + targets = new ModuleTarget[n]; recordedHashes = new ModuleHashes[n]; moduleResolutions = new ModuleResolution[n]; ImageReader imageReader = SystemImage.reader(); @@ -171,6 +174,7 @@ ModuleInfo.Attributes attrs = ModuleInfo.read(imageReader.getResourceBuffer(loc), null); descriptors[i] = attrs.descriptor(); + targets[i] = attrs.target(); recordedHashes[i] = attrs.recordedHashes(); moduleResolutions[i] = attrs.moduleResolution(); } @@ -206,6 +210,7 @@ // create the ModuleReference ModuleReference mref = toModuleReference(md, + targets[i], recordedHashes[i], hashSupplier(names[i]), moduleResolutions[i]); @@ -233,6 +238,7 @@ } private ModuleReference toModuleReference(ModuleDescriptor md, + ModuleTarget target, ModuleHashes recordedHashes, HashSupplier hasher, ModuleResolution mres) { @@ -246,9 +252,14 @@ } }; - ModuleReference mref = - new ModuleReferenceImpl(md, uri, readerSupplier, null, - recordedHashes, hasher, mres); + ModuleReference mref = new ModuleReferenceImpl(md, + uri, + readerSupplier, + null, + target, + recordedHashes, + hasher, + mres); // may need a reference to a patched module if --patch-module specified mref = ModuleBootstrap.patcher().patchIfNeeded(mref); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/module/SystemModules.java --- a/jdk/src/java.base/share/classes/jdk/internal/module/SystemModules.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/module/SystemModules.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ import java.lang.module.ModuleDescriptor; -/* +/** * SystemModules class will be generated at link time to create * ModuleDescriptor for the system modules directly to improve * the module descriptor reconstitution time. @@ -65,7 +65,7 @@ } /** - * Returns a non-empty array of ModuleDescriptors in the run-time image. + * Returns a non-empty array of ModuleDescriptor objects in the run-time image. * * When running an exploded image it returns an empty array. */ @@ -74,6 +74,15 @@ } /** + * Returns a non-empty array of ModuleTarget objects in the run-time image. + * + * When running an exploded image it returns an empty array. + */ + public static ModuleTarget[] targets() { + throw new InternalError("expected to be overridden at link time"); + } + + /** * Returns a non-empty array of ModuleHashes recorded in each module * in the run-time image. * diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/ClassReader.java --- a/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/ClassReader.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/ClassReader.java Wed Jul 05 23:09:40 2017 +0200 @@ -2508,7 +2508,7 @@ } /** - * Reads a CONSTANT_Pakcage_info item in {@code b}. This method is + * Reads a CONSTANT_Package_info item in {@code b}. This method is * intended for {@link Attribute} sub slasses, and is normally not needed * by class generators or adapters. * diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java Wed Jul 05 23:09:40 2017 +0200 @@ -31,9 +31,7 @@ import java.util.Map; import java.util.Objects; import jdk.internal.HotSpotIntrinsicCandidate; -import jdk.internal.misc.SharedSecrets; import jdk.internal.misc.VM; -import sun.security.action.GetPropertyAction; /** Common utility routines used by both java.lang and java.lang.reflect */ @@ -104,39 +102,40 @@ int modifiers) throws IllegalAccessException { - if (currentClass == null || memberClass == null) { - throw new InternalError(); - } - if (!verifyMemberAccess(currentClass, memberClass, targetClass, modifiers)) { - throwIllegalAccessException(currentClass, memberClass, targetClass, modifiers); + throw newIllegalAccessException(currentClass, memberClass, targetClass, modifiers); } } /** - * Verify access to a member, returning {@code false} if no access + * Verify access to a member and return {@code true} if it is granted. + * + * @param currentClass the class performing the access + * @param memberClass the declaring class of the member being accessed + * @param targetClass the class of target object if accessing instance + * field or method; + * or the declaring class if accessing constructor; + * or null if accessing static field or method + * @param modifiers the member's access modifiers + * @return {@code true} if access to member is granted */ public static boolean verifyMemberAccess(Class currentClass, Class memberClass, Class targetClass, int modifiers) { - // Verify that currentClass can access a field, method, or - // constructor of memberClass, where that member's access bits are - // "modifiers". - - boolean gotIsSameClassPackage = false; - boolean isSameClassPackage = false; - if (currentClass == memberClass) { // Always succeeds return true; } - if (!verifyModuleAccess(currentClass, memberClass)) { + if (!verifyModuleAccess(currentClass.getModule(), memberClass)) { return false; } + boolean gotIsSameClassPackage = false; + boolean isSameClassPackage = false; + if (!Modifier.isPublic(getClassAccessFlags(memberClass))) { isSameClassPackage = isSameClassPackage(currentClass, memberClass); gotIsSameClassPackage = true; @@ -196,31 +195,20 @@ } /** - * Returns {@code true} if memberClass's's module exports memberClass's - * package to currentClass's module. + * Returns {@code true} if memberClass's module exports memberClass's + * package to currentModule. */ - public static boolean verifyModuleAccess(Class currentClass, - Class memberClass) { - return verifyModuleAccess(currentClass.getModule(), memberClass); - } - public static boolean verifyModuleAccess(Module currentModule, Class memberClass) { Module memberModule = memberClass.getModule(); - - // module may be null during startup (initLevel 0) - if (currentModule == memberModule) - return true; // same module (named or unnamed) - - String pkg = memberClass.getPackageName(); - boolean allowed = memberModule.isExported(pkg, currentModule); - if (allowed && memberModule.isNamed() && printStackTraceWhenAccessSucceeds()) { - if (!SharedSecrets.getJavaLangReflectModuleAccess() - .isStaticallyExported(memberModule, pkg, currentModule)) { - String msg = currentModule + " allowed access to member of " + memberClass; - new Exception(msg).printStackTrace(System.err); - } + if (currentModule == memberModule) { + // same module (named or unnamed) or both null if called + // before module system is initialized, which means we are + // dealing with java.base only. + return true; + } else { + String pkg = memberClass.getPackageName(); + return memberModule.isExported(pkg, currentModule); } - return allowed; } /** @@ -344,46 +332,14 @@ return false; } - - // true to print a stack trace when access fails - private static volatile boolean printStackWhenAccessFails; - - // true to print a stack trace when access succeeds - private static volatile boolean printStackWhenAccessSucceeds; - - // true if printStack* values are initialized - private static volatile boolean printStackPropertiesSet; - - private static void ensurePrintStackPropertiesSet() { - if (!printStackPropertiesSet && VM.initLevel() >= 1) { - String s = GetPropertyAction.privilegedGetProperty( - "sun.reflect.debugModuleAccessChecks"); - if (s != null) { - printStackWhenAccessFails = !s.equalsIgnoreCase("false"); - printStackWhenAccessSucceeds = s.equalsIgnoreCase("access"); - } - printStackPropertiesSet = true; - } - } - - public static boolean printStackTraceWhenAccessFails() { - ensurePrintStackPropertiesSet(); - return printStackWhenAccessFails; - } - - public static boolean printStackTraceWhenAccessSucceeds() { - ensurePrintStackPropertiesSet(); - return printStackWhenAccessSucceeds; - } - /** - * Throws IllegalAccessException with the an exception message based on + * Returns an IllegalAccessException with an exception message based on * the access that is denied. */ - private static void throwIllegalAccessException(Class currentClass, - Class memberClass, - Object target, - int modifiers) + public static IllegalAccessException newIllegalAccessException(Class currentClass, + Class memberClass, + Class targetClass, + int modifiers) throws IllegalAccessException { String currentSuffix = ""; @@ -411,20 +367,6 @@ if (m2.isNamed()) msg += " to " + m1; } - throwIllegalAccessException(msg); - } - - /** - * Throws IllegalAccessException with the given exception message. - */ - public static void throwIllegalAccessException(String msg) - throws IllegalAccessException - { - IllegalAccessException e = new IllegalAccessException(msg); - ensurePrintStackPropertiesSet(); - if (printStackWhenAccessFails) { - e.printStackTrace(System.err); - } - throw e; + return new IllegalAccessException(msg); } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,6 +44,7 @@ import java.util.Objects; import java.util.Properties; +import jdk.internal.misc.VM; import sun.reflect.misc.ReflectUtil; import sun.security.action.GetPropertyAction; @@ -585,17 +586,10 @@ private static void checkInitted() { if (initted) return; - // Tests to ensure the system properties table is fully - // initialized. This is needed because reflection code is - // called very early in the initialization process (before - // command-line arguments have been parsed and therefore - // these user-settable properties installed.) We assume that - // if System.out is non-null then the System class has been - // fully initialized and that the bulk of the startup code - // has been run. - - if (System.out == null) { - // java.lang.System not yet fully initialized + // Defer initialization until module system is initialized so as + // to avoid inflation and spinning bytecode in unnamed modules + // during early startup. + if (!VM.isModuleSystemInited()) { return; } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/module-info.java --- a/jdk/src/java.base/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,6 +26,7 @@ /** * Defines the foundational APIs of the Java SE Platform. * + * @moduleGraph * @since 9 */ module java.base { @@ -125,10 +126,9 @@ jdk.jlink; exports jdk.internal.loader to java.instrument, - java.logging, - jdk.jlink; + java.logging; exports jdk.internal.jmod to - jdk.compiler, + jdk.compiler, // reflective dependency jdk.jlink; exports jdk.internal.logger to java.logging; @@ -140,10 +140,7 @@ exports jdk.internal.org.objectweb.asm.tree to jdk.jlink; exports jdk.internal.org.objectweb.asm.util to - jdk.jlink, jdk.scripting.nashorn; - exports jdk.internal.org.objectweb.asm.tree.analysis to - jdk.jlink; exports jdk.internal.org.objectweb.asm.commons to jdk.scripting.nashorn; exports jdk.internal.org.objectweb.asm.signature to @@ -157,7 +154,6 @@ jdk.jlink; exports jdk.internal.misc to java.desktop, - jdk.incubator.httpclient, java.logging, java.management, java.naming, @@ -166,8 +162,8 @@ java.sql, java.xml, jdk.charsets, - jdk.compiler, - jdk.jartool, + jdk.compiler, // reflective dependency + jdk.incubator.httpclient, jdk.jdeps, jdk.jlink, jdk.jshell, @@ -210,11 +206,10 @@ jdk.naming.dns; exports sun.net.util to java.desktop, - jdk.jconsole, - jdk.naming.dns; + jdk.jconsole; exports sun.net.www to + java.desktop, jdk.incubator.httpclient, - java.desktop, jdk.jartool; exports sun.net.www.protocol.http to java.security.jgss; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java --- a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java Wed Jul 05 23:09:40 2017 +0200 @@ -428,7 +428,7 @@ abort(null, "java.launcher.jar.error3", jarname); } - // Add-Exports and Add-Opens to break encapsulation + // Add-Exports and Add-Opens String exports = mainAttrs.getValue(ADD_EXPORTS); if (exports != null) { addExportsOrOpens(exports, false); @@ -466,6 +466,7 @@ if (s.length == 2) { String mn = s[0]; String pn = s[1]; + Layer.boot().findModule(mn).ifPresent(m -> { if (m.getDescriptor().packages().contains(pn)) { if (open) { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties --- a/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties Wed Jul 05 23:09:40 2017 +0200 @@ -24,12 +24,15 @@ # # Translators please note do not translate the options themselves -java.launcher.opt.header = Usage: {0} [options] class [args...]\n\ -\ (to execute a class)\n or {0} [options] -jar jarfile [args...]\n\ +java.launcher.opt.header = Usage: {0} [options] [args...]\n\ +\ (to execute a class)\n or {0} [options] -jar [args...]\n\ \ (to execute a jar file)\n\ -\ or {0} [options] -p -m [/] [args...]\n\ +\ or {0} [options] -m [/] [args...]\n\ +\ {0} [options] --module [/] [args...]\n\ \ (to execute the main class in a module)\n\n\ -where options include:\n\n +\ Arguments following the main class, -jar , -m or --module\n\ +\ / are passed as the arguments to main class.\n\n\ +\ where options include:\n\n java.launcher.opt.datamodel =\ -d{0}\t Deprecated, will be removed in a future release\n java.launcher.opt.vmselect =\ {0}\t to select the "{1}" VM\n @@ -49,10 +52,6 @@ \ A {0} separated list of directories, each directory\n\ \ is a directory of modules that replace upgradeable\n\ \ modules in the runtime image\n\ -\ -m [/]\n\ -\ --module [/]\n\ -\ the initial module to resolve, and the name of the main class\n\ -\ to execute if not specified by the module\n\ \ --add-modules [,...]\n\ \ root modules to resolve in addition to the initial module.\n\ \ can also be ALL-DEFAULT, ALL-SYSTEM,\n\ @@ -129,7 +128,7 @@ \ -Xms set initial Java heap size\n\ \ -Xmx set maximum Java heap size\n\ \ -Xnoclassgc disable class garbage collection\n\ -\ -Xprof output cpu profiling data\n\ +\ -Xprof output cpu profiling data (deprecated)\n\ \ -Xrs reduce use of OS signals by Java/VM (see documentation)\n\ \ -Xshare:auto use shared class data if possible (default)\n\ \ -Xshare:off do not attempt to use shared class data\n\ @@ -157,6 +156,10 @@ \ --add-opens /=(,)*\n\ \ updates to open to\n\ \ , regardless of module declaration.\n\ +\ --permit-illegal-access\n\ +\ permit illegal access to members of types in named modules\n\ +\ by code in unnamed modules. This compatibility option will\n\ +\ be removed in the next release.\n\ \ --disable-@files disable further argument file expansion\n\ \ --patch-module =({0})*\n\ \ Override or augment a module with classes and resources\n\ diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/net/www/protocol/jrt/JavaRuntimeURLConnection.java --- a/jdk/src/java.base/share/classes/sun/net/www/protocol/jrt/JavaRuntimeURLConnection.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/jrt/JavaRuntimeURLConnection.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,8 +26,6 @@ package sun.net.www.protocol.jrt; import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FilePermission; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; @@ -44,7 +42,6 @@ import jdk.internal.loader.Resource; import sun.net.www.ParseUtil; import sun.net.www.URLConnection; -import sun.security.action.GetPropertyAction; /** * URLConnection implementation that can be used to connect to resources @@ -66,9 +63,6 @@ // the Resource when connected private volatile Resource resource; - // the permission to access resources in the runtime image, created lazily - private static volatile Permission permission; - JavaRuntimeURLConnection(URL url) throws IOException { super(url); String path = url.getPath(); @@ -164,14 +158,8 @@ } @Override - public Permission getPermission() throws IOException { - Permission p = permission; - if (p == null) { - String home = GetPropertyAction.privilegedGetProperty("java.home"); - p = new FilePermission(home + File.separator + "-", "read"); - permission = p; - } - return p; + public Permission getPermission() { + return new RuntimePermission("accessSystemModules"); } /** diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java --- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java Wed Jul 05 23:09:40 2017 +0200 @@ -986,9 +986,7 @@ // any way to convey them back to the application. // That's the default, so no need to write code. builderParams.setDate(params.date()); - // CertPathCheckers need to be cloned to start from fresh state - builderParams.setCertPathCheckers( - params.getPKIXParameters().getCertPathCheckers()); + builderParams.setCertPathCheckers(params.certPathCheckers()); builderParams.setSigProvider(params.sigProvider()); // Skip revocation during this build to detect circular @@ -1116,15 +1114,6 @@ } } - @Override - public RevocationChecker clone() { - RevocationChecker copy = (RevocationChecker)super.clone(); - // we don't deep-copy the exceptions, but that is ok because they - // are never modified after they are instantiated - copy.softFailExceptions = new LinkedList<>(softFailExceptions); - return copy; - } - /* * This inner class extends the X509CertSelector to add an additional * check to make sure the subject public key isn't on a particular list. diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java --- a/jdk/src/java.base/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -191,14 +191,22 @@ if (version != 0) { throw new IOException("Version must be 0"); } - n = getBigInteger(data); - e = getBigInteger(data); - d = getBigInteger(data); - p = getBigInteger(data); - q = getBigInteger(data); - pe = getBigInteger(data); - qe = getBigInteger(data); - coeff = getBigInteger(data); + + /* + * Some implementations do not correctly encode ASN.1 INTEGER values + * in 2's complement format, resulting in a negative integer when + * decoded. Correct the error by converting it to a positive integer. + * + * See CR 6255949 + */ + n = data.getPositiveBigInteger(); + e = data.getPositiveBigInteger(); + d = data.getPositiveBigInteger(); + p = data.getPositiveBigInteger(); + q = data.getPositiveBigInteger(); + pe = data.getPositiveBigInteger(); + qe = data.getPositiveBigInteger(); + coeff = data.getPositiveBigInteger(); if (derValue.data.available() != 0) { throw new IOException("Extra data available"); } @@ -206,23 +214,4 @@ throw new InvalidKeyException("Invalid RSA private key", e); } } - - /** - * Read a BigInteger from the DerInputStream. - */ - static BigInteger getBigInteger(DerInputStream data) throws IOException { - BigInteger b = data.getBigInteger(); - - /* - * Some implementations do not correctly encode ASN.1 INTEGER values - * in 2's complement format, resulting in a negative integer when - * decoded. Correct the error by converting it to a positive integer. - * - * See CR 6255949 - */ - if (b.signum() < 0) { - b = new BigInteger(1, b.toByteArray()); - } - return b; - } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/security/rsa/RSAPublicKeyImpl.java --- a/jdk/src/java.base/share/classes/sun/security/rsa/RSAPublicKeyImpl.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/rsa/RSAPublicKeyImpl.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -111,8 +111,8 @@ throw new IOException("Not a SEQUENCE"); } DerInputStream data = derValue.data; - n = RSAPrivateCrtKeyImpl.getBigInteger(data); - e = RSAPrivateCrtKeyImpl.getBigInteger(data); + n = data.getPositiveBigInteger(); + e = data.getPositiveBigInteger(); if (derValue.data.available() != 0) { throw new IOException("Extra data available"); } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java --- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java Wed Jul 05 23:09:40 2017 +0200 @@ -1025,6 +1025,13 @@ cf = CertificateFactory.getInstance("X509"); } + // -trustcacerts can only be specified on -importcert. + // Reset it so that warnings on CA cert will remain for + // -printcert, etc. + if (command != IMPORTCERT) { + trustcacerts = false; + } + if (trustcacerts) { caks = KeyStoreUtil.getCacertsKeyStore(); } @@ -1758,9 +1765,8 @@ if (keyPass == null) { keyPass = promptForKeyPass(alias, null, storePass); } + checkWeak(rb.getString("the.generated.certificate"), chain[0]); keyStore.setKeyEntry(alias, privKey, keyPass, chain); - - checkWeak(rb.getString("the.generated.certificate"), chain[0]); } /** @@ -2118,6 +2124,10 @@ } try { + Certificate c = srckeystore.getCertificate(alias); + if (c != null) { + checkWeak("<" + newAlias + ">", c); + } keyStore.setEntry(newAlias, entry, pp); // Place the check so that only successful imports are blocked. // For example, we don't block a failed SecretEntry import. @@ -2127,10 +2137,6 @@ "The.destination.pkcs12.keystore.has.different.storepass.and.keypass.Please.retry.with.destkeypass.specified.")); } } - Certificate c = srckeystore.getCertificate(alias); - if (c != null) { - checkWeak("<" + newAlias + ">", c); - } return 1; } catch (KeyStoreException kse) { Object[] source2 = {alias, kse.toString()}; @@ -2814,8 +2820,8 @@ } if (noprompt) { + checkWeak(rb.getString("the.input"), cert); keyStore.setCertificateEntry(alias, cert); - checkWeak(rb.getString("the.input"), cert); return true; } @@ -3049,6 +3055,11 @@ MessageFormat form = new MessageFormat (rb.getString(".PATTERN.printX509Cert.with.weak")); PublicKey pkey = cert.getPublicKey(); + String sigName = cert.getSigAlgName(); + // No need to warn about sigalg of a trust anchor + if (!isTrustedCert(cert)) { + sigName = withWeak(sigName); + } Object[] source = {cert.getSubjectDN().toString(), cert.getIssuerDN().toString(), cert.getSerialNumber().toString(16), @@ -3056,7 +3067,7 @@ cert.getNotAfter().toString(), getCertFingerPrint("SHA-1", cert), getCertFingerPrint("SHA-256", cert), - withWeak(cert.getSigAlgName()), + sigName, withWeak(pkey), cert.getVersion() }; @@ -3111,7 +3122,7 @@ * or null otherwise. A label is added. */ private static Pair - getTrustedSigner(Certificate cert, KeyStore ks) throws Exception { + getSigner(Certificate cert, KeyStore ks) throws Exception { if (ks.getCertificateAlias(cert) != null) { return new Pair<>("", cert); } @@ -3467,9 +3478,9 @@ // do we trust the cert at the top? Certificate topCert = replyCerts[replyCerts.length-1]; boolean fromKeyStore = true; - Pair root = getTrustedSigner(topCert, keyStore); + Pair root = getSigner(topCert, keyStore); if (root == null && trustcacerts && caks != null) { - root = getTrustedSigner(topCert, caks); + root = getSigner(topCert, caks); fromKeyStore = false; } if (root == null) { @@ -4301,9 +4312,19 @@ return result; } + private boolean isTrustedCert(Certificate cert) throws KeyStoreException { + if (caks != null && caks.getCertificateAlias(cert) != null) { + return true; + } else { + String inKS = keyStore.getCertificateAlias(cert); + return inKS != null && keyStore.isCertificateEntry(inKS); + } + } + private void checkWeak(String label, String sigAlg, Key key) { - if (!DISABLED_CHECK.permits(SIG_PRIMITIVE_SET, sigAlg, null)) { + if (sigAlg != null && !DISABLED_CHECK.permits( + SIG_PRIMITIVE_SET, sigAlg, null)) { weakWarnings.add(String.format( rb.getString("whose.sigalg.risk"), label, sigAlg)); } @@ -4316,7 +4337,8 @@ } } - private void checkWeak(String label, Certificate[] certs) { + private void checkWeak(String label, Certificate[] certs) + throws KeyStoreException { for (int i = 0; i < certs.length; i++) { Certificate cert = certs[i]; if (cert instanceof X509Certificate) { @@ -4325,15 +4347,18 @@ if (certs.length > 1) { fullLabel = oneInMany(label, i, certs.length); } - checkWeak(fullLabel, xc.getSigAlgName(), xc.getPublicKey()); + checkWeak(fullLabel, xc); } } } - private void checkWeak(String label, Certificate cert) { + private void checkWeak(String label, Certificate cert) + throws KeyStoreException { if (cert instanceof X509Certificate) { X509Certificate xc = (X509Certificate)cert; - checkWeak(label, xc.getSigAlgName(), xc.getPublicKey()); + // No need to check the sigalg of a trust anchor + String sigAlg = isTrustedCert(cert) ? null : xc.getSigAlgName(); + checkWeak(label, sigAlg, xc.getPublicKey()); } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/security/util/DerInputBuffer.java --- a/jdk/src/java.base/share/classes/sun/security/util/DerInputBuffer.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/util/DerInputBuffer.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,16 +44,26 @@ */ class DerInputBuffer extends ByteArrayInputStream implements Cloneable { - DerInputBuffer(byte[] buf) { super(buf); } + boolean allowBER = true; + + // used by sun/security/util/DerInputBuffer/DerInputBufferEqualsHashCode.java + DerInputBuffer(byte[] buf) { + this(buf, true); + } - DerInputBuffer(byte[] buf, int offset, int len) { + DerInputBuffer(byte[] buf, boolean allowBER) { + super(buf); + this.allowBER = allowBER; + } + + DerInputBuffer(byte[] buf, int offset, int len, boolean allowBER) { super(buf, offset, len); + this.allowBER = allowBER; } DerInputBuffer dup() { try { DerInputBuffer retval = (DerInputBuffer)clone(); - retval.mark(Integer.MAX_VALUE); return retval; } catch (CloneNotSupportedException e) { @@ -147,8 +157,8 @@ System.arraycopy(buf, pos, bytes, 0, len); skip(len); - // check to make sure no extra leading 0s for DER - if (len >= 2 && (bytes[0] == 0) && (bytes[1] >= 0)) { + // BER allows leading 0s but DER does not + if (!allowBER && (len >= 2 && (bytes[0] == 0) && (bytes[1] >= 0))) { throw new IOException("Invalid encoding: redundant leading 0s"); } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/security/util/DerInputStream.java --- a/jdk/src/java.base/share/classes/sun/security/util/DerInputStream.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/util/DerInputStream.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -81,6 +81,25 @@ } /** + * Create a DER input stream from part of a data buffer with + * additional arg to control whether DER checks are enforced. + * The buffer is not copied, it is shared. Accordingly, the + * buffer should be treated as read-only. + * + * @param data the buffer from which to create the string (CONSUMED) + * @param offset the first index of data which will + * be read as DER input in the new stream + * @param len how long a chunk of the buffer to use, + * starting at "offset" + * @param allowBER whether to allow constructed indefinite-length + * encoding as well as tolerate leading 0s + */ + public DerInputStream(byte[] data, int offset, int len, + boolean allowBER) throws IOException { + init(data, offset, len, allowBER); + } + + /** * Create a DER input stream from part of a data buffer. * The buffer is not copied, it is shared. Accordingly, the * buffer should be treated as read-only. @@ -95,47 +114,27 @@ init(data, offset, len, true); } - /** - * Create a DER input stream from part of a data buffer with - * additional arg to indicate whether to allow constructed - * indefinite-length encoding. - * The buffer is not copied, it is shared. Accordingly, the - * buffer should be treated as read-only. - * - * @param data the buffer from which to create the string (CONSUMED) - * @param offset the first index of data which will - * be read as DER input in the new stream - * @param len how long a chunk of the buffer to use, - * starting at "offset" - * @param allowIndefiniteLength whether to allow constructed - * indefinite-length encoding - */ - public DerInputStream(byte[] data, int offset, int len, - boolean allowIndefiniteLength) throws IOException { - init(data, offset, len, allowIndefiniteLength); - } - /* * private helper routine */ - private void init(byte[] data, int offset, int len, - boolean allowIndefiniteLength) throws IOException { + private void init(byte[] data, int offset, int len, boolean allowBER) throws IOException { if ((offset+2 > data.length) || (offset+len > data.length)) { throw new IOException("Encoding bytes too short"); } // check for indefinite length encoding if (DerIndefLenConverter.isIndefinite(data[offset+1])) { - if (!allowIndefiniteLength) { + if (!allowBER) { throw new IOException("Indefinite length BER encoding found"); } else { byte[] inData = new byte[len]; System.arraycopy(data, offset, inData, 0, len); DerIndefLenConverter derIn = new DerIndefLenConverter(); - buffer = new DerInputBuffer(derIn.convert(inData)); + buffer = new DerInputBuffer(derIn.convert(inData), allowBER); } - } else - buffer = new DerInputBuffer(data, offset, len); + } else { + buffer = new DerInputBuffer(data, offset, len, allowBER); + } buffer.mark(Integer.MAX_VALUE); } @@ -156,7 +155,7 @@ */ public DerInputStream subStream(int len, boolean do_skip) throws IOException { - DerInputBuffer newbuf = buffer.dup(); + DerInputBuffer newbuf = buffer.dup(); newbuf.truncate(len); if (do_skip) { @@ -399,7 +398,8 @@ dis.readFully(indefData, offset, readLen); dis.close(); DerIndefLenConverter derIn = new DerIndefLenConverter(); - buffer = new DerInputBuffer(derIn.convert(indefData)); + buffer = new DerInputBuffer(derIn.convert(indefData), buffer.allowBER); + if (tag != buffer.read()) throw new IOException("Indefinite length encoding" + " not supported"); @@ -427,7 +427,7 @@ DerValue value; do { - value = new DerValue(newstr.buffer); + value = new DerValue(newstr.buffer, buffer.allowBER); vec.addElement(value); } while (newstr.available() > 0); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/security/util/DerValue.java --- a/jdk/src/java.base/share/classes/sun/security/util/DerValue.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/util/DerValue.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ -/* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. +/** + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -225,6 +225,16 @@ data = init(stringTag, value); } + // Creates a DerValue from a tag and some DER-encoded data w/ additional + // arg to control whether DER checks are enforced. + DerValue(byte tag, byte[] data, boolean allowBER) { + this.tag = tag; + buffer = new DerInputBuffer(data.clone(), allowBER); + length = data.length; + this.data = new DerInputStream(buffer); + this.data.mark(Integer.MAX_VALUE); + } + /** * Creates a DerValue from a tag and some DER-encoded data. * @@ -232,20 +242,16 @@ * @param data the DER-encoded data */ public DerValue(byte tag, byte[] data) { - this.tag = tag; - buffer = new DerInputBuffer(data.clone()); - length = data.length; - this.data = new DerInputStream(buffer); - this.data.mark(Integer.MAX_VALUE); + this(tag, data, true); } /* * package private */ DerValue(DerInputBuffer in) throws IOException { + // XXX must also parse BER-encoded constructed // values such as sequences, sets... - tag = (byte)in.read(); byte lenByte = (byte)in.read(); length = DerInputStream.getLength(lenByte, in); @@ -260,7 +266,7 @@ dis.readFully(indefData, offset, readLen); dis.close(); DerIndefLenConverter derIn = new DerIndefLenConverter(); - inbuf = new DerInputBuffer(derIn.convert(indefData)); + inbuf = new DerInputBuffer(derIn.convert(indefData), in.allowBER); if (tag != inbuf.read()) throw new IOException ("Indefinite length encoding not supported"); @@ -282,6 +288,12 @@ } } + // Get an ASN.1/DER encoded datum from a buffer w/ additional + // arg to control whether DER checks are enforced. + DerValue(byte[] buf, boolean allowBER) throws IOException { + data = init(true, new ByteArrayInputStream(buf), allowBER); + } + /** * Get an ASN.1/DER encoded datum from a buffer. The * entire buffer must hold exactly one datum, including @@ -290,7 +302,14 @@ * @param buf buffer holding a single DER-encoded datum. */ public DerValue(byte[] buf) throws IOException { - data = init(true, new ByteArrayInputStream(buf)); + this(buf, true); + } + + // Get an ASN.1/DER encoded datum from part of a buffer w/ additional + // arg to control whether DER checks are enforced. + DerValue(byte[] buf, int offset, int len, boolean allowBER) + throws IOException { + data = init(true, new ByteArrayInputStream(buf, offset, len), allowBER); } /** @@ -303,7 +322,13 @@ * @param len how many bytes are in the encoded datum */ public DerValue(byte[] buf, int offset, int len) throws IOException { - data = init(true, new ByteArrayInputStream(buf, offset, len)); + this(buf, offset, len, true); + } + + // Get an ASN1/DER encoded datum from an input stream w/ additional + // arg to control whether DER checks are enforced. + DerValue(InputStream in, boolean allowBER) throws IOException { + data = init(false, in, allowBER); } /** @@ -316,10 +341,11 @@ * which may be followed by additional data */ public DerValue(InputStream in) throws IOException { - data = init(false, in); + this(in, true); } - private DerInputStream init(byte stringTag, String value) throws IOException { + private DerInputStream init(byte stringTag, String value) + throws IOException { String enc = null; tag = stringTag; @@ -347,7 +373,7 @@ byte[] buf = value.getBytes(enc); length = buf.length; - buffer = new DerInputBuffer(buf); + buffer = new DerInputBuffer(buf, true); DerInputStream result = new DerInputStream(buffer); result.mark(Integer.MAX_VALUE); return result; @@ -356,8 +382,8 @@ /* * helper routine */ - private DerInputStream init(boolean fullyBuffered, InputStream in) - throws IOException { + private DerInputStream init(boolean fullyBuffered, InputStream in, + boolean allowBER) throws IOException { tag = (byte)in.read(); byte lenByte = (byte)in.read(); @@ -384,7 +410,7 @@ byte[] bytes = IOUtils.readFully(in, length, true); - buffer = new DerInputBuffer(bytes); + buffer = new DerInputBuffer(bytes, allowBER); return new DerInputStream(buffer); } @@ -479,7 +505,8 @@ if (buffer.read(bytes) != length) throw new IOException("short read on DerValue buffer"); if (isConstructed()) { - DerInputStream in = new DerInputStream(bytes); + DerInputStream in = new DerInputStream(bytes, 0, bytes.length, + buffer.allowBER); bytes = null; while (in.available() != 0) { bytes = append(bytes, in.getOctetString()); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java --- a/jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -443,18 +443,6 @@ } /** - * This static method is the default implementation of the - * verify(PublicKey key, Provider sigProvider) method in X509CRL. - * Called from java.security.cert.X509CRL.verify(PublicKey key, - * Provider sigProvider) - */ - public static void verify(X509CRL crl, PublicKey key, - Provider sigProvider) throws CRLException, - NoSuchAlgorithmException, InvalidKeyException, SignatureException { - crl.verify(key, sigProvider); - } - - /** * Encodes an X.509 CRL, and signs it using the given key. * * @param key the private key used for signing. diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/classes/sun/security/x509/X509CertImpl.java --- a/jdk/src/java.base/share/classes/sun/security/x509/X509CertImpl.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CertImpl.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -494,18 +494,6 @@ } } - /** - * This static method is the default implementation of the - * verify(PublicKey key, Provider sigProvider) method in X509Certificate. - * Called from java.security.cert.X509Certificate.verify(PublicKey key, - * Provider sigProvider) - */ - public static void verify(X509Certificate cert, PublicKey key, - Provider sigProvider) throws CertificateException, - NoSuchAlgorithmException, InvalidKeyException, SignatureException { - cert.verify(key, sigProvider); - } - /** * Creates an X.509 certificate, and signs it using the given key * (associating a signature algorithm and an X.500 name). diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/conf/security/java.security --- a/jdk/src/java.base/share/conf/security/java.security Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/conf/security/java.security Wed Jul 05 23:09:40 2017 +0200 @@ -598,8 +598,8 @@ # jdk.certpath.disabledAlgorithms=MD2, DSA, RSA keySize < 2048 # # -jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \ - DSA keySize < 1024, EC keySize < 224 +jdk.certpath.disabledAlgorithms=MD2, MD5, SHA1 jdkCA & usage TLSServer, \ + RSA keySize < 1024, DSA keySize < 1024, EC keySize < 224 # # Algorithm restrictions for signed JAR files diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/legal/zlib.md --- a/jdk/src/java.base/share/legal/zlib.md Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.base/share/legal/zlib.md Wed Jul 05 23:09:40 2017 +0200 @@ -1,9 +1,9 @@ -## zlib v1.2.8 +## zlib v1.2.11 ### zlib License
     
    -Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
    +Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
     
     This software is provided 'as-is', without any express or implied
     warranty.  In no event will the authors be held liable for any damages
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/native/libjava/ClassLoader.c
    --- a/jdk/src/java.base/share/native/libjava/ClassLoader.c	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.base/share/native/libjava/ClassLoader.c	Wed Jul 05 23:09:40 2017 +0200
    @@ -72,23 +72,9 @@
         return utfStr;
     }
     
    -// The existence or signature of this method is not guaranteed since it
    -// supports a private method.  This method will be changed in 1.7.
    -JNIEXPORT jclass JNICALL
    -Java_java_lang_ClassLoader_defineClass0(JNIEnv *env,
    -                                        jobject loader,
    -                                        jstring name,
    -                                        jbyteArray data,
    -                                        jint offset,
    -                                        jint length,
    -                                        jobject pd)
    -{
    -    return Java_java_lang_ClassLoader_defineClass1(env, loader, name, data, offset,
    -                                                   length, pd, NULL);
    -}
    -
     JNIEXPORT jclass JNICALL
     Java_java_lang_ClassLoader_defineClass1(JNIEnv *env,
    +                                        jclass cls,
                                             jobject loader,
                                             jstring name,
                                             jbyteArray data,
    @@ -163,6 +149,7 @@
     
     JNIEXPORT jclass JNICALL
     Java_java_lang_ClassLoader_defineClass2(JNIEnv *env,
    +                                        jclass cls,
                                             jobject loader,
                                             jstring name,
                                             jobject data,
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/share/native/libjava/Module.c
    --- a/jdk/src/java.base/share/native/libjava/Module.c	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.base/share/native/libjava/Module.c	Wed Jul 05 23:09:40 2017 +0200
    @@ -73,30 +73,32 @@
                                                 jstring location, jobjectArray packages)
     {
         char** pkgs = NULL;
    -    jsize idx;
         jsize num_packages = (*env)->GetArrayLength(env, packages);
     
         if (num_packages != 0 && (pkgs = calloc(num_packages, sizeof(char*))) == NULL) {
             JNU_ThrowOutOfMemoryError(env, NULL);
             return;
    -    } else {
    -        int valid = 1;
    +    } else if ((*env)->EnsureLocalCapacity(env, (jint)num_packages) == 0) {
    +        jboolean failed = JNI_FALSE;
    +        int idx;
             for (idx = 0; idx < num_packages; idx++) {
                 jstring pkg = (*env)->GetObjectArrayElement(env, packages, idx);
    -            pkgs[idx] = GetInternalPackageName(env, pkg, NULL, 0);
    -            if (pkgs[idx] == NULL) {
    -                valid = 0;
    +            char* name = GetInternalPackageName(env, pkg, NULL, 0);
    +            if (name != NULL) {
    +                pkgs[idx] = name;
    +            } else {
    +                failed = JNI_TRUE;
                     break;
                 }
             }
    -
    -        if (valid != 0) {
    +        if (!failed) {
                 JVM_DefineModule(env, module, is_open, version, location,
    -                    (const char* const*)pkgs, num_packages);
    +                             (const char* const*)pkgs, num_packages);
             }
         }
     
         if (num_packages > 0) {
    +        int idx;
             for (idx = 0; idx < num_packages; idx++) {
                 if (pkgs[idx] != NULL) {
                     free(pkgs[idx]);
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.base/unix/native/libjava/ProcessHandleImpl_unix.c
    --- a/jdk/src/java.base/unix/native/libjava/ProcessHandleImpl_unix.c	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.base/unix/native/libjava/ProcessHandleImpl_unix.c	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -244,7 +244,8 @@
             int status;
             while (waitpid(pid, &status, 0) < 0) {
                 switch (errno) {
    -                case ECHILD: return 0;
    +                case ECHILD:
    +                    return java_lang_ProcessHandleImpl_NOT_A_CHILD; // No child
                     case EINTR: break;
                     default: return -1;
                 }
    @@ -269,9 +270,10 @@
             memset(&siginfo, 0, sizeof siginfo);
             while (waitid(P_PID, pid, &siginfo, options) < 0) {
                 switch (errno) {
    -            case ECHILD: return 0;
    -            case EINTR: break;
    -            default: return -1;
    +                case ECHILD:
    +                    return java_lang_ProcessHandleImpl_NOT_A_CHILD; // No child
    +                case EINTR: break;
    +                default: return -1;
                 }
             }
     
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.datatransfer/share/classes/module-info.java
    --- a/jdk/src/java.datatransfer/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.datatransfer/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -24,8 +24,9 @@
      */
     
     /**
    - * Defines an API for transferring data between and within applications.
    + * Defines the API for transferring data between and within applications.
      *
    + * @moduleGraph
      * @since 9
      */
     module java.datatransfer {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonBorder.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonBorder.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonBorder.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -37,7 +37,7 @@
     import com.apple.laf.AquaUtils.*;
     
     public abstract class AquaButtonBorder extends AquaBorder implements Border, UIResource {
    -    public static final RecyclableSingleton fDynamic = new RecyclableSingletonFromDefaultConstructor(Dynamic.class);
    +    private static final RecyclableSingleton fDynamic = new RecyclableSingletonFromDefaultConstructor(Dynamic.class);
         public static AquaButtonBorder getDynamicButtonBorder() {
             return fDynamic.get();
         }
    @@ -47,12 +47,12 @@
             return fToggle.get();
         }
     
    -    public static final RecyclableSingleton fToolBar = new RecyclableSingletonFromDefaultConstructor(Toolbar.class);
    +    private static final RecyclableSingleton fToolBar = new RecyclableSingletonFromDefaultConstructor(Toolbar.class);
         public static Border getToolBarButtonBorder() {
             return fToolBar.get();
         }
     
    -    public static final RecyclableSingleton fBevel = new RecyclableSingleton() {
    +    private static final RecyclableSingleton fBevel = new RecyclableSingleton() {
             protected Named getInstance() {
                 return new Named(Widget.BUTTON_BEVEL, new SizeDescriptor(new SizeVariant().alterMargins(2, 4, 2, 4)));
             }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonCheckBoxUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonCheckBoxUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonCheckBoxUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -34,8 +34,8 @@
     import com.apple.laf.AquaUtils.*;
     
     public class AquaButtonCheckBoxUI extends AquaButtonLabeledUI {
    -    protected static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaButtonCheckBoxUI.class);
    -    protected static final RecyclableSingleton sizingIcon = new RecyclableSingleton() {
    +    private static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaButtonCheckBoxUI.class);
    +    private static final RecyclableSingleton sizingIcon = new RecyclableSingleton() {
             protected ImageIcon getInstance() {
                 return new ImageIcon(AquaNativeResources.getRadioButtonSizerImage());
             }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonExtendedTypes.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonExtendedTypes.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonExtendedTypes.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -138,7 +138,7 @@
             return typeDefinitions.get().get(name);
         }
     
    -    protected static final RecyclableSingleton> typeDefinitions = new RecyclableSingleton>() {
    +    private static final RecyclableSingleton> typeDefinitions = new RecyclableSingleton>() {
             protected Map getInstance() {
                 return getAllTypes();
             }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonLabeledUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonLabeledUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonLabeledUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -42,9 +42,9 @@
     import com.apple.laf.AquaUtils.RecyclableSingleton;
     
     public abstract class AquaButtonLabeledUI extends AquaButtonToggleUI implements Sizeable {
    -    protected static RecyclableSizingIcon regularIcon = new RecyclableSizingIcon(18);
    -    protected static RecyclableSizingIcon smallIcon = new RecyclableSizingIcon(16);
    -    protected static RecyclableSizingIcon miniIcon = new RecyclableSizingIcon(14);
    +    private static final RecyclableSizingIcon regularIcon = new RecyclableSizingIcon(18);
    +    private static final RecyclableSizingIcon smallIcon = new RecyclableSizingIcon(16);
    +    private static final RecyclableSizingIcon miniIcon = new RecyclableSizingIcon(14);
     
         protected static class RecyclableSizingIcon extends RecyclableSingleton {
             final int iconSize;
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonRadioUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonRadioUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonRadioUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -34,8 +34,8 @@
     import com.apple.laf.AquaUtils.*;
     
     public class AquaButtonRadioUI extends AquaButtonLabeledUI {
    -    protected static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaButtonRadioUI.class);
    -    protected static final RecyclableSingleton sizingIcon = new RecyclableSingleton() {
    +    private static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaButtonRadioUI.class);
    +    private static final RecyclableSingleton sizingIcon = new RecyclableSingleton() {
             protected ImageIcon getInstance() {
                 return new ImageIcon(AquaNativeResources.getRadioButtonSizerImage());
             }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonToggleUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonToggleUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonToggleUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -32,7 +32,7 @@
     
     public class AquaButtonToggleUI extends AquaButtonUI {
         // Create PLAF
    -    static final RecyclableSingleton aquaToggleButtonUI = new RecyclableSingletonFromDefaultConstructor(AquaButtonToggleUI.class);
    +    private static final RecyclableSingleton aquaToggleButtonUI = new RecyclableSingletonFromDefaultConstructor(AquaButtonToggleUI.class);
         public static ComponentUI createUI(final JComponent b) {
             return aquaToggleButtonUI.get();
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaButtonUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -48,7 +48,7 @@
         private static final String BUTTON_TYPE = "JButton.buttonType";
         private static final String SEGMENTED_BUTTON_POSITION = "JButton.segmentPosition";
     
    -    protected static final RecyclableSingleton buttonUI = new RecyclableSingletonFromDefaultConstructor(AquaButtonUI.class);
    +    private static final RecyclableSingleton buttonUI = new RecyclableSingletonFromDefaultConstructor(AquaButtonUI.class);
         public static ComponentUI createUI(final JComponent c) {
             return buttonUI.get();
         }
    @@ -462,7 +462,7 @@
             return d;
         }
     
    -    static final RecyclableSingleton fHierListener = new RecyclableSingletonFromDefaultConstructor(AquaHierarchyButtonListener.class);
    +    private static final RecyclableSingleton fHierListener = new RecyclableSingletonFromDefaultConstructor(AquaHierarchyButtonListener.class);
         static AquaHierarchyButtonListener getAquaHierarchyButtonListener() {
             return fHierListener.get();
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxPopup.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxPopup.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxPopup.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -25,18 +25,29 @@
     
     package com.apple.laf;
     
    -import java.awt.*;
    +import java.awt.Component;
    +import java.awt.Dimension;
    +import java.awt.GraphicsConfiguration;
    +import java.awt.GraphicsDevice;
    +import java.awt.GraphicsEnvironment;
     import java.awt.Insets;
    +import java.awt.Point;
     import java.awt.Rectangle;
    -import java.awt.event.*;
    +import java.awt.Toolkit;
    +import java.awt.event.InputEvent;
    +import java.awt.event.MouseEvent;
     
    -import javax.swing.*;
    +import javax.swing.Box;
    +import javax.swing.JComboBox;
    +import javax.swing.JList;
    +import javax.swing.ListCellRenderer;
    +import javax.swing.SwingUtilities;
     import javax.swing.plaf.basic.BasicComboPopup;
     
     import sun.lwawt.macosx.CPlatformWindow;
     
     @SuppressWarnings("serial") // Superclass is not serializable across versions
    -class AquaComboBoxPopup extends BasicComboPopup {
    +final class AquaComboBoxPopup extends BasicComboPopup {
         static final int FOCUS_RING_PAD_LEFT = 6;
         static final int FOCUS_RING_PAD_RIGHT = 6;
         static final int FOCUS_RING_PAD_BOTTOM = 5;
    @@ -201,9 +212,6 @@
             //System.err.println("GetBestScreenBounds p: "+ p.x + ", " + p.y);
             final GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
             final GraphicsDevice[] gs = ge.getScreenDevices();
    -        //System.err.println("  gs.length = " + gs.length);
    -        final Rectangle comboBoxBounds = comboBox.getBounds();
    -
             for (final GraphicsDevice gd : gs) {
                 final GraphicsConfiguration[] gc = gd.getConfigurations();
                 for (final GraphicsConfiguration element0 : gc) {
    @@ -215,15 +223,14 @@
             }
     
             // Hmm.  Origin's off screen, but is any part on?
    +        final Rectangle comboBoxBounds = comboBox.getBounds();
             comboBoxBounds.setLocation(p);
             for (final GraphicsDevice gd : gs) {
                 final GraphicsConfiguration[] gc = gd.getConfigurations();
                 for (final GraphicsConfiguration element0 : gc) {
                     final Rectangle gcBounds = element0.getBounds();
                     if (gcBounds.intersects(comboBoxBounds)) {
    -                    if (gcBounds.contains(p)) {
    -                        return getAvailableScreenArea(gcBounds, element0);
    -                    }
    +                    return getAvailableScreenArea(gcBounds, element0);
                     }
                 }
             }
    @@ -234,8 +241,15 @@
         private Rectangle getAvailableScreenArea(Rectangle bounds,
                                                  GraphicsConfiguration gc) {
             Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
    -        return new Rectangle(0, insets.top, bounds.width,
    -                bounds.height - insets.top);
    +        return new Rectangle(bounds.x + insets.left, bounds.y + insets.top,
    +                             bounds.width - insets.left - insets.right,
    +                             bounds.height - insets.top - insets.bottom);
    +    }
    +
    +    private int getComboBoxEdge(int py, boolean bottom) {
    +        int offset = bottom ? 9 : -9;
    +        // if py is less than new y we have a clipped combo, so leave it alone.
    +        return Math.min((py / 2) + offset, py);
         }
     
         @Override
    @@ -246,7 +260,7 @@
             if (isPopdown && !isTableCellEditor) {
                 // place the popup just below the button, which is
                 // near the center of a large combo box
    -            py = Math.min((py / 2) + 9, py); // if py is less than new y we have a clipped combo, so leave it alone.
    +            py = getComboBoxEdge(py, true);
             }
     
             // px & py are relative to the combo box
    @@ -291,8 +305,12 @@
             // Make sure it's all on the screen - shift it by the amount it's off
             p.x += px;
             p.y += py; // Screen location of px & py
    -        if (p.x < scrBounds.x) px -= (p.x + scrBounds.x);
    -        if (p.y < scrBounds.y) py -= (p.y + scrBounds.y);
    +        if (p.x < scrBounds.x) {
    +            px = px + (scrBounds.x - p.x);
    +        }
    +        if (p.y < scrBounds.y) {
    +            py = py + (scrBounds.y - p.y);
    +        }
     
             final Point top = new Point(0, 0);
             SwingUtilities.convertPointFromScreen(top, comboBox);
    @@ -324,22 +342,27 @@
             }
     
             final Rectangle r = new Rectangle(px, py, pw, ph);
    -        if (py + ph > scrBounds.y + scrBounds.height) {
    -            if (ph <= -scrBounds.y ) {
    -                // popup goes above
    -                r.y = -ph ;
    -            } else {
    -                // a full screen height popup
    -                r.y = scrBounds.y + Math.max(0, (scrBounds.height - ph) / 2 );
    -                r.height = Math.min(scrBounds.height, ph);
    -            }
    +        if (r.y + r.height < top.y + scrBounds.y + scrBounds.height) {
    +            return r;
    +        }
    +        // Check whether it goes below the bottom of the screen, if so flip it
    +        int newY = getComboBoxEdge(comboBoxBounds.height, false) - ph - comboBoxInsets.top;
    +        if (newY > top.y + scrBounds.y) {
    +            return new Rectangle(px, newY, r.width, r.height);
    +        } else {
    +            // There are no place at top, move popup to the center of the screen
    +            r.y = top.y + scrBounds.y + Math.max(0, (scrBounds.height - ph) / 2 );
    +            r.height = Math.min(scrBounds.height, ph);
             }
             return r;
         }
     
         // The one to use when itemCount <= maxRowCount.  Size never adjusts for arrows
         // We want it positioned so the selected item is right above the combo box
    -    protected Rectangle computePopupBoundsForMenu(final int px, final int py, final int pw, final int ph, final int itemCount, final Rectangle scrBounds) {
    +    protected Rectangle computePopupBoundsForMenu(final int px, final int py,
    +                                                  final int pw, final int ph,
    +                                                  final int itemCount,
    +                                                  final Rectangle scrBounds) {
             //System.err.println("computePopupBoundsForMenu: " + px + "," + py + " " +  pw + "," + ph);
             //System.err.println("itemCount: " +itemCount +" src: "+ scrBounds);
             int elementSize = 0; //kDefaultItemSize;
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -594,7 +594,7 @@
         }
     
         @SuppressWarnings("unchecked")
    -    static final RecyclableSingleton, AquaComboBoxUI>> APPLICATOR = new
    +    private static final RecyclableSingleton, AquaComboBoxUI>> APPLICATOR = new
                 RecyclableSingleton, AquaComboBoxUI>>() {
             @Override
             protected ClientPropertyApplicator, AquaComboBoxUI> getInstance() {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileView.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileView.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileView.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -75,7 +75,7 @@
         private static native int getNativeLSInfo(final byte[] pathBytes, final boolean isDirectory);
         private static native String getNativePathForResolvedAlias(final byte[] absolutePath, final boolean isDirectory);
     
    -    static final RecyclableSingleton machineName = new RecyclableSingleton() {
    +    private static final RecyclableSingleton machineName = new RecyclableSingleton() {
             @Override
             protected String getInstance() {
                 return getNativeMachineName();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaGroupBorder.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaGroupBorder.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaGroupBorder.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -35,17 +35,17 @@
     import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor;
     
     public abstract class AquaGroupBorder extends AquaBorder {
    -    static final RecyclableSingletonFromDefaultConstructor tabbedPaneGroupBorder = new RecyclableSingletonFromDefaultConstructor(TabbedPane.class);
    +    private static final RecyclableSingletonFromDefaultConstructor tabbedPaneGroupBorder = new RecyclableSingletonFromDefaultConstructor(TabbedPane.class);
         public static Border getTabbedPaneGroupBorder() {
             return tabbedPaneGroupBorder.get();
         }
     
    -    static final RecyclableSingletonFromDefaultConstructor titleBorderGroupBorder = new RecyclableSingletonFromDefaultConstructor(Titled.class);
    +    private static final RecyclableSingletonFromDefaultConstructor titleBorderGroupBorder = new RecyclableSingletonFromDefaultConstructor(Titled.class);
         public static Border getBorderForTitledBorder() {
             return titleBorderGroupBorder.get();
         }
     
    -    static final RecyclableSingletonFromDefaultConstructor titlelessGroupBorder = new RecyclableSingletonFromDefaultConstructor(Titleless.class);
    +    private static final RecyclableSingletonFromDefaultConstructor titlelessGroupBorder = new RecyclableSingletonFromDefaultConstructor(Titleless.class);
         public static Border getTitlelessBorder() {
             return titlelessGroupBorder.get();
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaHighlighter.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaHighlighter.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaHighlighter.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -37,7 +37,7 @@
     import com.apple.laf.AquaUtils.RecyclableSingleton;
     
     public class AquaHighlighter extends DefaultHighlighter implements UIResource {
    -    static final RecyclableSingleton instance = new RecyclableSingleton() {
    +    private static final RecyclableSingleton instance = new RecyclableSingleton() {
             protected LayerPainter getInstance() {
                 return new AquaHighlightPainter(null);
             }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaImageFactory.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaImageFactory.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaImageFactory.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -240,14 +240,14 @@
             }
         }
     
    -    protected static final NamedImageSingleton northArrow = new NamedImageSingleton("NSMenuScrollUp");
    -    protected static final IconUIResourceSingleton northArrowIcon = new IconUIResourceSingleton(northArrow);
    -    protected static final NamedImageSingleton southArrow = new NamedImageSingleton("NSMenuScrollDown");
    -    protected static final IconUIResourceSingleton southArrowIcon = new IconUIResourceSingleton(southArrow);
    -    protected static final NamedImageSingleton westArrow = new NamedImageSingleton("NSMenuSubmenuLeft");
    -    protected static final IconUIResourceSingleton westArrowIcon = new IconUIResourceSingleton(westArrow);
    -    protected static final NamedImageSingleton eastArrow = new NamedImageSingleton("NSMenuSubmenu");
    -    protected static final IconUIResourceSingleton eastArrowIcon = new IconUIResourceSingleton(eastArrow);
    +    private static final NamedImageSingleton northArrow = new NamedImageSingleton("NSMenuScrollUp");
    +    private static final IconUIResourceSingleton northArrowIcon = new IconUIResourceSingleton(northArrow);
    +    private static final NamedImageSingleton southArrow = new NamedImageSingleton("NSMenuScrollDown");
    +    private static final IconUIResourceSingleton southArrowIcon = new IconUIResourceSingleton(southArrow);
    +    private static final NamedImageSingleton westArrow = new NamedImageSingleton("NSMenuSubmenuLeft");
    +    private static final IconUIResourceSingleton westArrowIcon = new IconUIResourceSingleton(westArrow);
    +    private static final NamedImageSingleton eastArrow = new NamedImageSingleton("NSMenuSubmenu");
    +    private static final IconUIResourceSingleton eastArrowIcon = new IconUIResourceSingleton(eastArrow);
     
         static Image getArrowImageForDirection(final int direction) {
             switch(direction) {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameBorder.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameBorder.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameBorder.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -55,7 +55,7 @@
     
         private static final int kContentTester = 100; // For getting region insets
     
    -    static final RecyclableSingleton documentWindowFrame = new RecyclableSingleton() {
    +    private static final RecyclableSingleton documentWindowFrame = new RecyclableSingleton() {
             protected AquaInternalFrameBorder getInstance() {
                 return new AquaInternalFrameBorder(WindowType.DOCUMENT);
             }
    @@ -64,7 +64,7 @@
             return documentWindowFrame.get();
         }
     
    -    static final RecyclableSingleton utilityWindowFrame = new RecyclableSingleton() {
    +    private static final RecyclableSingleton utilityWindowFrame = new RecyclableSingleton() {
             protected AquaInternalFrameBorder getInstance() {
                 return new AquaInternalFrameBorder(WindowType.UTILITY);
             }
    @@ -73,7 +73,7 @@
             return utilityWindowFrame.get();
         }
     
    -    static final RecyclableSingleton dialogWindowFrame = new RecyclableSingleton() {
    +    private static final RecyclableSingleton dialogWindowFrame = new RecyclableSingleton() {
             protected AquaInternalFrameBorder getInstance() {
                 return new AquaInternalFrameBorder(WindowType.DOCUMENT);
             }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaInternalFrameUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -147,7 +147,7 @@
             southPane = c;
         }
     
    -    static final RecyclableSingleton closeIcon = new RecyclableSingleton() {
    +    private static final RecyclableSingleton closeIcon = new RecyclableSingleton() {
             @Override
             protected Icon getInstance() {
                 return new AquaInternalFrameButtonIcon(Widget.TITLE_BAR_CLOSE_BOX);
    @@ -157,7 +157,7 @@
             return closeIcon.get();
         }
     
    -    static final RecyclableSingleton minimizeIcon = new RecyclableSingleton() {
    +    private static final RecyclableSingleton minimizeIcon = new RecyclableSingleton() {
             @Override
             protected Icon getInstance() {
                 return new AquaInternalFrameButtonIcon(Widget.TITLE_BAR_COLLAPSE_BOX);
    @@ -167,7 +167,7 @@
             return minimizeIcon.get();
         }
     
    -    static final RecyclableSingleton zoomIcon = new RecyclableSingleton() {
    +    private static final RecyclableSingleton zoomIcon = new RecyclableSingleton() {
             @Override
             protected Icon getInstance() {
                 return new AquaInternalFrameButtonIcon(Widget.TITLE_BAR_ZOOM_BOX);
    @@ -738,7 +738,7 @@
             }
         } // end class PaletteListener
     
    -    static final InternalFrameShadow documentWindowShadow = new InternalFrameShadow() {
    +    private static final InternalFrameShadow documentWindowShadow = new InternalFrameShadow() {
             @Override
             Border getForegroundShadowBorder() {
                 return new AquaUtils.SlicedShadowBorder(new Painter() {
    @@ -778,7 +778,7 @@
             }
         };
     
    -    static final InternalFrameShadow paletteWindowShadow = new InternalFrameShadow() {
    +    private static final InternalFrameShadow paletteWindowShadow = new InternalFrameShadow() {
             @Override
             Border getForegroundShadowBorder() {
                 return new AquaUtils.SlicedShadowBorder(new Painter() {
    @@ -834,7 +834,7 @@
             }
         }
     
    -    static final RecyclableSingleton RESIZE_ICON = new RecyclableSingleton() {
    +    private static final RecyclableSingleton RESIZE_ICON = new RecyclableSingleton() {
             @Override
             protected Icon getInstance() {
                 return new AquaIcon.ScalingJRSUIIcon(11, 11) {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaKeyBindings.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaKeyBindings.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaKeyBindings.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -37,7 +37,7 @@
     import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor;
     
     public class AquaKeyBindings {
    -    static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaKeyBindings.class);
    +    private static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaKeyBindings.class);
         static AquaKeyBindings instance() {
             return instance.get();
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaLabelUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaLabelUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaLabelUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -37,7 +37,7 @@
     import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor;
     
     public class AquaLabelUI extends BasicLabelUI {
    -    protected static final  RecyclableSingleton aquaLabelUI = new RecyclableSingletonFromDefaultConstructor(AquaLabelUI.class);
    +    private static final RecyclableSingleton aquaLabelUI = new RecyclableSingletonFromDefaultConstructor(AquaLabelUI.class);
     
         public static ComponentUI createUI(final JComponent c) {
             return aquaLabelUI.get();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuPainter.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuPainter.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMenuPainter.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -125,7 +125,7 @@
             return buf.toString();
         }
     
    -    static final RecyclableSingleton sPainter = new RecyclableSingletonFromDefaultConstructor(AquaMenuPainter.class);
    +    private static final RecyclableSingleton sPainter = new RecyclableSingletonFromDefaultConstructor(AquaMenuPainter.class);
         static AquaMenuPainter instance() {
             return sPainter.get();
         }
    @@ -139,9 +139,9 @@
             protected Border getInstance() { return UIManager.getBorder(borderName); }
         }
     
    -    protected final RecyclableBorder menuBarPainter = new RecyclableBorder("MenuBar.backgroundPainter");
    -    protected final RecyclableBorder selectedMenuBarItemPainter = new RecyclableBorder("MenuBar.selectedBackgroundPainter");
    -    protected final RecyclableBorder selectedMenuItemPainter = new RecyclableBorder("MenuItem.selectedBackgroundPainter");
    +    private static final RecyclableBorder menuBarPainter = new RecyclableBorder("MenuBar.backgroundPainter");
    +    private static final RecyclableBorder selectedMenuBarItemPainter = new RecyclableBorder("MenuBar.selectedBackgroundPainter");
    +    private static final RecyclableBorder selectedMenuItemPainter = new RecyclableBorder("MenuItem.selectedBackgroundPainter");
     
         public void paintMenuBarBackground(final Graphics g, final int width, final int height, final JComponent c) {
             g.setColor(c == null ? Color.white : c.getBackground());
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMnemonicHandler.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMnemonicHandler.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaMnemonicHandler.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -34,7 +34,7 @@
     import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor;
     
     public class AquaMnemonicHandler {
    -    static final RecyclableSingleton altProcessor = new RecyclableSingletonFromDefaultConstructor(AltProcessor.class);
    +    private static final RecyclableSingleton altProcessor = new RecyclableSingletonFromDefaultConstructor(AltProcessor.class);
         public static KeyEventPostProcessor getInstance() {
             return altProcessor.get();
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaNativeResources.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaNativeResources.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaNativeResources.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -54,7 +54,7 @@
             }
         }
     
    -    static final RecyclableSingleton sBackgroundColor = new RecyclableSingleton() {
    +    private static final RecyclableSingleton sBackgroundColor = new RecyclableSingleton() {
             @Override
             protected Color getInstance() {
                 final long backgroundID = getWindowBackgroundColor();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaPanelUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaPanelUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaPanelUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -35,7 +35,7 @@
     import java.awt.Graphics;
     
     public class AquaPanelUI extends BasicPanelUI {
    -    static RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaPanelUI.class);
    +    private static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaPanelUI.class);
     
         public static ComponentUI createUI(final JComponent c) {
             return instance.get();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaPopupMenuSeparatorUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaPopupMenuSeparatorUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaPopupMenuSeparatorUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -34,7 +34,7 @@
     import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor;
     
     public class AquaPopupMenuSeparatorUI extends BasicSeparatorUI {
    -    protected static RecyclableSingletonFromDefaultConstructor instance = new RecyclableSingletonFromDefaultConstructor(AquaPopupMenuSeparatorUI.class);
    +    private static final RecyclableSingletonFromDefaultConstructor instance = new RecyclableSingletonFromDefaultConstructor(AquaPopupMenuSeparatorUI.class);
     
         public static ComponentUI createUI(final JComponent c) {
             return instance.get();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -46,7 +46,7 @@
     public class AquaProgressBarUI extends ProgressBarUI implements ChangeListener, PropertyChangeListener, AncestorListener, Sizeable {
         private static final boolean ADJUSTTIMER = true;
     
    -    protected static final RecyclableSingleton sizeDescriptor = new RecyclableSingleton() {
    +    private static final RecyclableSingleton sizeDescriptor = new RecyclableSingleton() {
             @Override
             protected SizeDescriptor getInstance() {
                 return new SizeDescriptor(new SizeVariant(146, 20)) {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaScrollBarUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaScrollBarUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaScrollBarUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -154,7 +154,7 @@
             return State.ACTIVE;
         }
     
    -    static final RecyclableSingleton> hitToPressedPartMap = new RecyclableSingleton>(){
    +    private static final RecyclableSingleton> hitToPressedPartMap = new RecyclableSingleton>(){
             @Override
             protected Map getInstance() {
                 final Map map = new HashMap(7);
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaScrollRegionBorder.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaScrollRegionBorder.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaScrollRegionBorder.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -40,7 +40,7 @@
     import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor;
     
     public class AquaScrollRegionBorder extends AquaBorder {
    -    static final RecyclableSingletonFromDefaultConstructor instance = new RecyclableSingletonFromDefaultConstructor(AquaScrollRegionBorder.class);
    +    private static final RecyclableSingletonFromDefaultConstructor instance = new RecyclableSingletonFromDefaultConstructor(AquaScrollRegionBorder.class);
     
         public static AquaScrollRegionBorder getScrollRegionBorder() {
             return instance.get();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaSliderUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaSliderUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaSliderUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -45,7 +45,7 @@
     //    static final Dimension roundThumbSize = new Dimension(21 + 4, 21 + 4); // +2px on both sides for focus fuzz
     //    static final Dimension pointingThumbSize = new Dimension(19 + 4, 22 + 4);
     
    -    protected static final RecyclableSingleton roundThumbDescriptor = new RecyclableSingleton() {
    +    private static final RecyclableSingleton roundThumbDescriptor = new RecyclableSingleton() {
             protected SizeDescriptor getInstance() {
                 return new SizeDescriptor(new SizeVariant(25, 25)) {
                     public SizeVariant deriveSmall(final SizeVariant v) {
    @@ -57,7 +57,7 @@
                 };
             }
         };
    -    protected static final RecyclableSingleton pointingThumbDescriptor = new RecyclableSingleton() {
    +    private static final RecyclableSingleton pointingThumbDescriptor = new RecyclableSingleton() {
             protected SizeDescriptor getInstance() {
                 return new SizeDescriptor(new SizeVariant(23, 26)) {
                     public SizeVariant deriveSmall(final SizeVariant v) {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTableHeaderBorder.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTableHeaderBorder.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTableHeaderBorder.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -126,7 +126,7 @@
             return State.ACTIVE;
         }
     
    -    static final RecyclableSingleton alternateBorder = new RecyclableSingleton() {
    +    private static final RecyclableSingleton alternateBorder = new RecyclableSingleton() {
             @Override
             protected Border getInstance() {
                 return BorderFactory.createRaisedBevelBorder();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTableHeaderUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTableHeaderUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTableHeaderUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -67,7 +67,7 @@
             super.uninstallDefaults();
         }
     
    -    static final RecyclableSingleton> TABLE_HEADER_APPLICATORS = new RecyclableSingleton>() {
    +    private static final RecyclableSingleton> TABLE_HEADER_APPLICATORS = new RecyclableSingleton>() {
             @Override
             @SuppressWarnings("unchecked")
             protected ClientPropertyApplicator getInstance() {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextFieldBorder.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextFieldBorder.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextFieldBorder.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -36,7 +36,7 @@
     import com.apple.laf.AquaUtils.*;
     
     public class AquaTextFieldBorder extends AquaBorder {
    -    protected static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaTextFieldBorder.class);
    +    private static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaTextFieldBorder.class);
         public static AquaTextFieldBorder getTextFieldBorder() {
             return instance.get();
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextFieldSearch.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextFieldSearch.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextFieldSearch.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -90,7 +90,7 @@
             return (c.getClientProperty(FIND_POPUP_KEY) instanceof JPopupMenu);
         }
     
    -    protected static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(SearchFieldBorder.class);
    +    private static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(SearchFieldBorder.class);
         public static SearchFieldBorder getSearchTextFieldBorder() {
             return instance.get();
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextPasswordFieldUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextPasswordFieldUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTextPasswordFieldUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -38,7 +38,7 @@
     import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor;
     
     public class AquaTextPasswordFieldUI extends AquaTextFieldUI {
    -    static final RecyclableSingleton capsLockPainter = new RecyclableSingletonFromDefaultConstructor(CapsLockSymbolPainter.class);
    +    private static final RecyclableSingleton capsLockPainter = new RecyclableSingletonFromDefaultConstructor(CapsLockSymbolPainter.class);
         static CapsLockSymbolPainter getCapsLockPainter() {
             return capsLockPainter.get();
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaToolBarSeparatorUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaToolBarSeparatorUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaToolBarSeparatorUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -34,7 +34,7 @@
     import com.apple.laf.AquaUtils.*;
     
     public class AquaToolBarSeparatorUI extends BasicToolBarSeparatorUI {
    -    protected static RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaToolBarSeparatorUI.class);
    +    private static final RecyclableSingleton instance = new RecyclableSingletonFromDefaultConstructor(AquaToolBarSeparatorUI.class);
     
         public static ComponentUI createUI(final JComponent c) {
             return instance.get();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaToolBarUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaToolBarUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaToolBarUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -35,7 +35,7 @@
     import com.apple.laf.AquaUtils.*;
     
     public class AquaToolBarUI extends BasicToolBarUI implements SwingConstants {
    -    private static RecyclableSingleton toolBarBorder = new RecyclableSingletonFromDefaultConstructor(ToolBarBorder.class);
    +    private static final RecyclableSingleton toolBarBorder = new RecyclableSingletonFromDefaultConstructor(ToolBarBorder.class);
         public static Border getToolBarBorder() {
             return toolBarBorder.get();
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaToolTipUI.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaToolTipUI.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaToolTipUI.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -34,7 +34,7 @@
     import com.apple.laf.AquaUtils.RecyclableSingletonFromDefaultConstructor;
     
     public class AquaToolTipUI extends BasicToolTipUI {
    -    static final RecyclableSingletonFromDefaultConstructor sharedAquaInstance = new RecyclableSingletonFromDefaultConstructor(AquaToolTipUI.class);
    +    private static final RecyclableSingletonFromDefaultConstructor sharedAquaInstance = new RecyclableSingletonFromDefaultConstructor(AquaToolTipUI.class);
     
         public static ComponentUI createUI(final JComponent c) {
             return sharedAquaInstance.get();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaUtilControlSize.java
    --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaUtilControlSize.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaUtilControlSize.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -49,7 +49,7 @@
             void applySizeFor(final JComponent c, final Size size);
         }
     
    -    protected static final RecyclableSingleton sizeListener
    +    private static final RecyclableSingleton sizeListener
                 = new RecyclableSingletonFromDefaultConstructor<>(PropertySizeListener.class);
         protected static PropertySizeListener getSizeListener() {
             return sizeListener.get();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/QuartzSurfaceData.m
    --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/QuartzSurfaceData.m	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/QuartzSurfaceData.m	Wed Jul 05 23:09:40 2017 +0200
    @@ -284,28 +284,21 @@
         CGFloat components[component_size];
         CGGradientRef gradient = NULL;
     
    -    for (int i = 0; i < num_locations; i++) {
    +    for (i = 0; i < num_locations; i++) {
             locations[i] = gradientInfo->fractionsdata[i];
    -//fprintf(stderr, "locations[%d] %f\n", i, locations[i]);
         }
         for (i = 0; i < component_size; i++) {
             components[i] = gradientInfo->colordata[i];
    -//fprintf(stderr, "components[%d] %f, gradientInfo->colordata[%d] %f\n",
    -//                  i, components[i], i, gradientInfo->colordata[i]);
         } 
         CGContextSaveGState(cgRef);
         gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations);
    -//fprintf(stderr, "gradientInfo->start.x %f, gradientInfo->start.y %f\n", 
    -//                 gradientInfo->start.x, gradientInfo->start.y);
    -//fprintf(stderr, "gradientInfo->end.x %f, gradientInfo->end.y %f\n", 
    -//                 gradientInfo->end.x, gradientInfo->end.y);
         if (qsdo->isEvenOddFill) {
             CGContextEOClip(cgRef);
         } else {
             CGContextClip(cgRef);
         }
         CGContextDrawLinearGradient(cgRef, gradient, gradientInfo->start, gradientInfo->end, kCGGradientDrawsAfterEndLocation);    
    -    
    +
         CGContextRestoreGState(cgRef);
         CGColorSpaceRelease(colorspace);
         CGGradientRelease(gradient);
    @@ -332,27 +325,19 @@
         CGFloat startRadius = gradientInfo->radius;
         CGFloat endRadius = gradientInfo->radius;
     
    -    for (int i = 0; i < num_locations; i++) {
    +    for (i = 0; i < num_locations; i++) {
             locations[i] = gradientInfo->fractionsdata[i];
    -//fprintf(stderr, "locations[%d] %f\n", i, locations[i]);
         }
         for (i = 0; i < component_size; i++) {
             components[i] = gradientInfo->colordata[i];
    -//fprintf(stderr, "components[%d] %f, gradientInfo->colordata[%d] %f\n",
    -//                  i, components[i], i, gradientInfo->colordata[i]);
         } 
         CGContextSaveGState(cgRef);
         gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations);
    -//fprintf(stderr, "gradientInfo->start.x %f, gradientInfo->start.y %f\n", 
    -//                 gradientInfo->start.x, gradientInfo->start.y);
    -//fprintf(stderr, "gradientInfo->end.x %f, gradientInfo->end.y %f\n", 
    -//                 gradientInfo->end.x, gradientInfo->end.y);
         if (qsdo->isEvenOddFill) {
             CGContextEOClip(cgRef);
         } else {
             CGContextClip(cgRef);
         }
    -//fprintf(stderr, "gradientInfo->startRadius %f, gradientInfo->endRadius %f\n",startRadius,endRadius);
         CGContextDrawRadialGradient(cgRef, gradient, gradientInfo->start, 0, gradientInfo->end, endRadius, kCGGradientDrawsAfterEndLocation);    
         
         CGContextRestoreGState(cgRef);
    @@ -944,54 +929,41 @@
         if (colorArray != NULL)
         {
             jint length = (*env)->GetArrayLength(env, colorArray);
    -//fprintf(stderr, "length %d\n", length);
     
             jint* jcolorData = (jint*)(*env)->GetPrimitiveArrayCritical(env, colorArray, NULL);
    -        CGFloat* colors= (CGFloat*)calloc(0, sizeof(CGFloat)*length);
    +        qsdo->gradientInfo->colordata = (CGFloat*)malloc(sizeof(CGFloat)*4*length);
    +        memset(qsdo->gradientInfo->colordata, 0, sizeof(CGFloat)*4*length);
             if (jcolorData != NULL)
             {
    -            jint i;
    +            int i;
                 for (i=0; igradientInfo->colordata[i*4] = ((jcolorData[i]>>16)&0xff)*kColorConversionMultiplier;
    +
    +                qsdo->gradientInfo->colordata[i*4+1] = ((jcolorData[i]>>8)&0xff)*kColorConversionMultiplier;
    +
    +                qsdo->gradientInfo->colordata[i*4+2] = ((jcolorData[i]>>0)&0xff)*kColorConversionMultiplier;
    +
    +                qsdo->gradientInfo->colordata[i*4+3] = ((jcolorData[i]>>24)&0xff)*kColorConversionMultiplier;
                 }
             }
             (*env)->ReleasePrimitiveArrayCritical(env, colorArray, jcolorData, 0);
    -        qsdo->gradientInfo->colordata = (CGFloat*)calloc(0, sizeof(CGFloat)*4*length);
    -        for (int i = 0; i < length; i++) 
    -        {
    -            jint c1 = colors[i];
    -//fprintf(stderr, "c1 %x\n", c1);
    -            qsdo->gradientInfo->colordata[i*4] = ((c1>>16)&0xff)*kColorConversionMultiplier;
    -//fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4, qsdo->gradientInfo->colordata[i*4]);
    -
    -            qsdo->gradientInfo->colordata[i*4+1] = ((c1>>8)&0xff)*kColorConversionMultiplier;
    -//fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4+1, qsdo->gradientInfo->colordata[i*4+1]);
    -
    -            qsdo->gradientInfo->colordata[i*4+2] = ((c1>>0)&0xff)*kColorConversionMultiplier;
    -//fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4+2, qsdo->gradientInfo->colordata[i*4+2]);
    -
    -            qsdo->gradientInfo->colordata[i*4+3] = ((c1>>24)&0xff)*kColorConversionMultiplier;
    -//fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4+3, qsdo->gradientInfo->colordata[i*4+3]);
    -        }
    -        free(colors);
         }
         jobject fractionsArray  = ((*env)->GetObjectArrayElement(env, qsdo->javaGraphicsStatesObjects, sun_java2d_OSXSurfaceData_kFractionsArrayIndex)); 
         if (fractionsArray != NULL)
         {
             jint length = (*env)->GetArrayLength(env, fractionsArray);
    -//fprintf(stderr, "fractions length %d\n", length);
             qsdo->gradientInfo->fractionsLength = length;
     
             jfloat* jfractionsData = (jfloat*)(*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL);
             if (jfractionsData != NULL)
             {
    +            int i;
                 qsdo->gradientInfo->fractionsdata = (CGFloat *)malloc(sizeof(CGFloat) *length);
    -            jint i;
    +            memset(qsdo->gradientInfo->fractionsdata, 0, sizeof(CGFloat)*length);
                 for (i=0; igradientInfo->fractionsdata[i] = jfractionsData[i];
    -//fprintf(stderr, "jfrationsData[%d] %f, qsdo->gradientInfo->fractionsdata[%d] = %f\n", i, jfractionsData[i], i, qsdo->gradientInfo->fractionsdata[i]);
                 }
                 (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, jfractionsData, 0);
             }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/classes/java/awt/Taskbar.java
    --- a/jdk/src/java.desktop/share/classes/java/awt/Taskbar.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/share/classes/java/awt/Taskbar.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -274,6 +274,10 @@
         /**
          * Requests user attention to the specified window.
          *
    +     * Has no effect if a window representation is not displayable in
    +     * the task area. Whether it is displayable is dependent on all
    +     * of window type, platform, and implementation.
    +     *
          * @param w window
          * @throws SecurityException if a security manager exists and it denies the
          * {@code RuntimePermission("canProcessApplicationEvents")} permission.
    @@ -375,6 +379,10 @@
          * for the specified window.
          * It may be disabled by system settings.
          *
    +     * Has no effect if a window representation is not displayable in
    +     * the task area. Whether it is displayable is dependent on all
    +     * of window type, platform, and implementation.
    +     *
          * @param w window to update
          * @param badge image to affix to the icon
          * @throws SecurityException if a security manager exists and it denies the
    @@ -409,6 +417,11 @@
         /**
          * Displays a determinate progress bar in the task area for the specified
          * window.
    +     *
    +     * Has no effect if a window representation is not displayable in
    +     * the task area. Whether it is displayable is dependent on all
    +     * of window type, platform, and implementation.
    +     *
          * 
    * The visual behavior is platform and {@link State} dependent. *
    @@ -437,6 +450,10 @@ /** * Sets a progress state for a specified window. + * + * Has no effect if a window representation is not displayable in + * the task area. Whether it is displayable is dependent on all + * of window type, platform, and implementation. *
    * Each state displays a progress in a platform-dependent way. *
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/classes/javax/accessibility/AccessibleContext.java --- a/jdk/src/java.desktop/share/classes/javax/accessibility/AccessibleContext.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/accessibility/AccessibleContext.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,8 +36,6 @@ import java.beans.PropertyChangeEvent; import java.awt.IllegalComponentStateException; -import javax.swing.SwingContainer; - /** * AccessibleContext represents the minimum information all accessible objects * return. This information includes the accessible name, description, role, @@ -79,7 +77,6 @@ * @author Lynn Monsanto */ @JavaBean(description = "Minimal information that all accessible objects return") -@SwingContainer(false) public abstract class AccessibleContext { /** diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java Wed Jul 05 23:09:40 2017 +0200 @@ -33,6 +33,8 @@ import java.util.Enumeration; import java.util.Vector; import sun.swing.CachedPainter; +import static sun.swing.SwingUtilities2.setAntialiasingHintForScaledGraphics; +import static sun.swing.SwingUtilities2.getAndSetAntialisingHintForScaledGraphics; /** * Factory object that vends Icons for @@ -1247,9 +1249,15 @@ protected void drawCheck(Component c, Graphics g, int x, int y) { int controlSize = getControlSize(); - g.fillRect( x+3, y+5, 2, controlSize-8 ); - g.drawLine( x+(controlSize-4), y+3, x+5, y+(controlSize-6) ); - g.drawLine( x+(controlSize-4), y+4, x+5, y+(controlSize-5) ); + int csx = controlSize - 3; + int csy1 = controlSize - 6; + int csy2 = controlSize - 4; + int csy3 = controlSize - 3; + int[] xPoints = {3, 5, 5, csx, csx, 5, 5, 3}; + int[] yPoints = {5, 5, csy1, 2, 4, csy2, csy3, csy3}; + g.translate(x, y); + g.fillPolygon(xPoints, yPoints, 8); + g.translate(-x, -y); } public int getIconWidth() { @@ -1323,8 +1331,12 @@ } public void paintIcon(Component c, Graphics g, int x, int y) { + + Object aaHint = getAndSetAntialisingHintForScaledGraphics(g); + if (MetalLookAndFeel.usingOcean()) { paintOceanIcon(c, g, x, y); + setAntialiasingHintForScaledGraphics(g, aaHint); return; } JRadioButton rb = (JRadioButton)c; @@ -1358,51 +1370,25 @@ // draw Dark Circle (start at top, go clockwise) g.setColor(darkCircle); - g.drawLine( 4, 0, 7, 0); - g.drawLine( 8, 1, 9, 1); - g.drawLine(10, 2, 10, 3); - g.drawLine(11, 4, 11, 7); - g.drawLine(10, 8, 10, 9); - g.drawLine( 9,10, 8,10); - g.drawLine( 7,11, 4,11); - g.drawLine( 3,10, 2,10); - g.drawLine( 1, 9, 1, 8); - g.drawLine( 0, 7, 0, 4); - g.drawLine( 1, 3, 1, 2); - g.drawLine( 2, 1, 3, 1); + g.drawOval(0, 0, 11, 11); // draw Inner Left (usually) White Arc // start at lower left corner, go clockwise g.setColor(whiteInnerLeftArc); - g.drawLine( 2, 9, 2, 8); - g.drawLine( 1, 7, 1, 4); - g.drawLine( 2, 2, 2, 3); - g.drawLine( 2, 2, 3, 2); - g.drawLine( 4, 1, 7, 1); - g.drawLine( 8, 2, 9, 2); + g.drawArc(1, 1, 10, 10, 60, 160); // draw Outer Right White Arc // start at upper right corner, go clockwise g.setColor(whiteOuterRightArc); - g.drawLine(10, 1, 10, 1); - g.drawLine(11, 2, 11, 3); - g.drawLine(12, 4, 12, 7); - g.drawLine(11, 8, 11, 9); - g.drawLine(10,10, 10,10); - g.drawLine( 9,11, 8,11); - g.drawLine( 7,12, 4,12); - g.drawLine( 3,11, 2,11); + g.drawArc(-1, -1, 13, 13, 235, 180); // selected dot if ( drawDot ) { g.setColor(dotColor); - g.fillRect( 4, 4, 4, 4); - g.drawLine( 4, 3, 7, 3); - g.drawLine( 8, 4, 8, 7); - g.drawLine( 7, 8, 4, 8); - g.drawLine( 3, 7, 3, 4); + g.fillOval(2, 2, 7, 7); } g.translate(-x, -y); + setAntialiasingHintForScaledGraphics(g, aaHint); } public int getIconWidth() { @@ -2051,16 +2037,17 @@ g.setColor( b.getForeground() ); } } - if( MetalUtils.isLeftToRight(b) ) { - g.drawLine( 0, 0, 0, 7 ); - g.drawLine( 1, 1, 1, 6 ); - g.drawLine( 2, 2, 2, 5 ); - g.drawLine( 3, 3, 3, 4 ); + if (MetalUtils.isLeftToRight(b)) { + int[] xPoints = {0, 3, 3, 0}; + int[] yPoints = {0, 3, 4, 7}; + g.fillPolygon(xPoints, yPoints, 4); + g.drawPolygon(xPoints, yPoints, 4); + } else { - g.drawLine( 4, 0, 4, 7 ); - g.drawLine( 3, 1, 3, 6 ); - g.drawLine( 2, 2, 2, 5 ); - g.drawLine( 1, 3, 1, 4 ); + int[] xPoints = {4, 4, 1, 1}; + int[] yPoints = {0, 7, 4, 3}; + g.fillPolygon(xPoints, yPoints, 4); + g.drawPolygon(xPoints, yPoints, 4); } g.translate( -x, -y ); @@ -2138,10 +2125,7 @@ g.setColor( MetalLookAndFeel.getMenuDisabledForeground()); } - g.drawLine( 2, 2, 2, 6 ); - g.drawLine( 3, 2, 3, 6 ); - g.drawLine( 4, 4, 8, 0 ); - g.drawLine( 4, 5, 9, 0 ); + drawCheck(g); } g.translate( -x, -y ); } @@ -2217,15 +2201,18 @@ g.setColor( MetalLookAndFeel.getMenuDisabledForeground() ); } - g.drawLine( 2, 2, 2, 6 ); - g.drawLine( 3, 2, 3, 6 ); - g.drawLine( 4, 4, 8, 0 ); - g.drawLine( 4, 5, 9, 0 ); + drawCheck(g); } g.translate( -x, -y ); } + private void drawCheck(Graphics g) { + int[] xPoints = {2, 3, 3, 8, 9, 3, 2}; + int[] yPoints = {2, 2, 5, 0, 0, 6, 6}; + g.drawPolygon(xPoints, yPoints, 7); + } + public int getIconWidth() { return menuCheckIconSize.width; } public int getIconHeight() { return menuCheckIconSize.height; } @@ -2252,9 +2239,8 @@ else { g.setColor(MetalLookAndFeel.getControlHighlight()); } - g.drawLine( 2, 9, 7, 9 ); - g.drawLine( 9, 2, 9, 7 ); - g.drawLine( 8, 8, 8, 8 ); + + g.drawArc(-1, -1, 10, 10, 245, 140); if (isPressed || isArmed) { g.setColor(MetalLookAndFeel.getControlInfo()); @@ -2266,14 +2252,8 @@ else { g.setColor( MetalLookAndFeel.getMenuDisabledForeground() ); } - g.drawLine( 2, 0, 6, 0 ); - g.drawLine( 2, 8, 6, 8 ); - g.drawLine( 0, 2, 0, 6 ); - g.drawLine( 8, 2, 8, 6 ); - g.drawLine( 1, 1, 1, 1 ); - g.drawLine( 7, 1, 7, 1 ); - g.drawLine( 1, 7, 1, 7 ); - g.drawLine( 7, 7, 7, 7 ); + + g.drawOval(0, 0, 8, 8); if (isSelected) { if (isEnabled) { @@ -2288,11 +2268,9 @@ else { g.setColor(MetalLookAndFeel.getMenuDisabledForeground()); } - g.drawLine( 3, 2, 5, 2 ); - g.drawLine( 2, 3, 6, 3 ); - g.drawLine( 2, 4, 6, 4 ); - g.drawLine( 2, 5, 6, 5 ); - g.drawLine( 3, 6, 5, 6 ); + + g.fillOval(2, 2, 4, 4); + g.drawOval(2, 2, 4, 4); } g.translate( -x, -y ); @@ -2300,8 +2278,12 @@ public void paintIcon( Component c, Graphics g, int x, int y ) { + + Object aaHint = getAndSetAntialisingHintForScaledGraphics(g); + if (MetalLookAndFeel.usingOcean()) { paintOceanIcon(c, g, x, y); + setAntialiasingHintForScaledGraphics(g, aaHint); return; } JMenuItem b = (JMenuItem) c; @@ -2319,55 +2301,24 @@ if ( isPressed || isArmed ) { g.setColor( MetalLookAndFeel.getPrimaryControl() ); - g.drawLine( 3, 1, 8, 1 ); - g.drawLine( 2, 9, 7, 9 ); - g.drawLine( 1, 3, 1, 8 ); - g.drawLine( 9, 2, 9, 7 ); - g.drawLine( 2, 2, 2, 2 ); - g.drawLine( 8, 8, 8, 8 ); + g.drawOval(1, 1, 8, 8); g.setColor( MetalLookAndFeel.getControlInfo() ); - g.drawLine( 2, 0, 6, 0 ); - g.drawLine( 2, 8, 6, 8 ); - g.drawLine( 0, 2, 0, 6 ); - g.drawLine( 8, 2, 8, 6 ); - g.drawLine( 1, 1, 1, 1 ); - g.drawLine( 7, 1, 7, 1 ); - g.drawLine( 1, 7, 1, 7 ); - g.drawLine( 7, 7, 7, 7 ); + g.drawOval(0, 0, 8, 8); } else { g.setColor( MetalLookAndFeel.getControlHighlight() ); - g.drawLine( 3, 1, 8, 1 ); - g.drawLine( 2, 9, 7, 9 ); - g.drawLine( 1, 3, 1, 8 ); - g.drawLine( 9, 2, 9, 7 ); - g.drawLine( 2, 2, 2, 2 ); - g.drawLine( 8, 8, 8, 8 ); + g.drawOval(1, 1, 8, 8); g.setColor( MetalLookAndFeel.getControlDarkShadow() ); - g.drawLine( 2, 0, 6, 0 ); - g.drawLine( 2, 8, 6, 8 ); - g.drawLine( 0, 2, 0, 6 ); - g.drawLine( 8, 2, 8, 6 ); - g.drawLine( 1, 1, 1, 1 ); - g.drawLine( 7, 1, 7, 1 ); - g.drawLine( 1, 7, 1, 7 ); - g.drawLine( 7, 7, 7, 7 ); + g.drawOval(0, 0, 8, 8); } } else { g.setColor( MetalLookAndFeel.getMenuDisabledForeground() ); - g.drawLine( 2, 0, 6, 0 ); - g.drawLine( 2, 8, 6, 8 ); - g.drawLine( 0, 2, 0, 6 ); - g.drawLine( 8, 2, 8, 6 ); - g.drawLine( 1, 1, 1, 1 ); - g.drawLine( 7, 1, 7, 1 ); - g.drawLine( 1, 7, 1, 7 ); - g.drawLine( 7, 7, 7, 7 ); + g.drawOval(0, 0, 8, 8); } if ( isSelected ) @@ -2388,14 +2339,12 @@ g.setColor( MetalLookAndFeel.getMenuDisabledForeground() ); } - g.drawLine( 3, 2, 5, 2 ); - g.drawLine( 2, 3, 6, 3 ); - g.drawLine( 2, 4, 6, 4 ); - g.drawLine( 2, 5, 6, 5 ); - g.drawLine( 3, 6, 5, 6 ); + g.fillOval(2, 2, 4, 4); + g.drawOval(2, 2, 4, 4); } g.translate( -x, -y ); + setAntialiasingHintForScaledGraphics(g, aaHint); } public int getIconWidth() { return menuCheckIconSize.width; } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/classes/javax/swing/text/DefaultStyledDocument.java --- a/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultStyledDocument.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultStyledDocument.java Wed Jul 05 23:09:40 2017 +0200 @@ -39,6 +39,7 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; +import java.util.Arrays; import javax.swing.event.*; import javax.swing.undo.AbstractUndoableEdit; import javax.swing.undo.CannotRedoException; @@ -1263,7 +1264,7 @@ int offs, int len) { attr = a; this.type = type; - this.data = txt; + this.data = txt == null ? null : Arrays.copyOf(txt, txt.length); this.offs = offs; this.len = len; this.direction = OriginateDirection; @@ -1323,7 +1324,7 @@ * @return the array */ public char[] getArray() { - return data; + return data == null ? null : Arrays.copyOf(data, data.length); } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/classes/javax/swing/text/StyleContext.java --- a/jdk/src/java.desktop/share/classes/javax/swing/text/StyleContext.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/StyleContext.java Wed Jul 05 23:09:40 2017 +0200 @@ -794,7 +794,7 @@ * @param attributes the attributes */ public SmallAttributeSet(Object[] attributes) { - this.attributes = attributes; + this.attributes = Arrays.copyOf(attributes, attributes.length); updateResolveParent(); } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/classes/module-info.java --- a/jdk/src/java.desktop/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,6 +27,7 @@ * Defines the AWT and Swing user interface toolkits, plus APIs for * accessibility, audio, imaging, printing, and JavaBeans. * + * @moduleGraph * @since 9 */ module java.desktop { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/classes/sun/awt/CustomCursor.java --- a/jdk/src/java.desktop/share/classes/sun/awt/CustomCursor.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/sun/awt/CustomCursor.java Wed Jul 05 23:09:40 2017 +0200 @@ -66,7 +66,8 @@ // Scale image to nearest supported size. Dimension nativeSize = toolkit.getBestCursorSize(width, height); - if (nativeSize.width != width || nativeSize.height != height) { + if ((nativeSize.width != width || nativeSize.height != height) && + (nativeSize.width != 0 && nativeSize.height != 0)) { cursor = cursor.getScaledInstance(nativeSize.width, nativeSize.height, Image.SCALE_DEFAULT); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/classes/sun/print/DialogOnTop.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.desktop/share/classes/sun/print/DialogOnTop.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.print; + +import javax.print.attribute.Attribute; +import javax.print.attribute.PrintRequestAttribute; + +/* + * An implementation class used to request the dialog be set always-on-top. + * It needs to be read and honoured by the dialog code which will use + * java.awt.Window.setAlwaysOnTop(true) in cases where it is supported. + */ +public class DialogOnTop implements PrintRequestAttribute { + + private static final long serialVersionUID = -1901909867156076547L; + + long id; + + public DialogOnTop() { + } + + public DialogOnTop(long id) { + this.id = id; + } + + public final Class getCategory() { + return DialogOnTop.class; + } + + public long getID() { + return id; + } + + public final String getName() { + return "dialog-on-top"; + } + + public String toString() { + return "dialog-on-top"; + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java --- a/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java Wed Jul 05 23:09:40 2017 +0200 @@ -785,7 +785,9 @@ PrintService pservice = getPrintService(); PageFormat pageFrmAttrib = attributeToPageFormat(pservice, attributes); + setParentWindowID(attributes); PageFormat page = pageDialog(pageFrmAttrib); + clearParentWindowID(); // If user cancels the dialog, pageDialog() will return the original // page object and as per spec, we should return null in that case. @@ -828,6 +830,9 @@ int x = gcBounds.x+50; int y = gcBounds.y+50; ServiceDialog pageDialog; + if (onTop != null) { + attributes.add(onTop); + } if (w instanceof Frame) { pageDialog = new ServiceDialog(gc, x, y, service, DocFlavor.SERVICE_FORMATTED.PAGEABLE, @@ -837,6 +842,7 @@ DocFlavor.SERVICE_FORMATTED.PAGEABLE, attributes, (Dialog)w); } + Rectangle dlgBounds = pageDialog.getBounds(); // if portion of dialog is not within the gc boundary @@ -923,7 +929,9 @@ } + setParentWindowID(attributes); boolean ret = printDialog(); + clearParentWindowID(); this.attributes = attributes; return ret; @@ -2539,4 +2547,26 @@ return new String(out_chars, 0, pos); } } + + private DialogOnTop onTop = null; + + private long parentWindowID = 0L; + + /* Called from native code */ + private long getParentWindowID() { + return parentWindowID; + } + + private void clearParentWindowID() { + parentWindowID = 0L; + onTop = null; + } + + private void setParentWindowID(PrintRequestAttributeSet attrs) { + parentWindowID = 0L; + onTop = (DialogOnTop)attrs.get(DialogOnTop.class); + if (onTop != null) { + parentWindowID = onTop.getID(); + } + } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java --- a/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java Wed Jul 05 23:09:40 2017 +0200 @@ -184,6 +184,9 @@ isAWT = true; } + if (attributes.get(DialogOnTop.class) != null) { + setAlwaysOnTop(true); + } Container c = getContentPane(); c.setLayout(new BorderLayout()); @@ -275,6 +278,10 @@ this.asOriginal = attributes; this.asCurrent = new HashPrintRequestAttributeSet(attributes); + if (attributes.get(DialogOnTop.class) != null) { + setAlwaysOnTop(true); + } + Container c = getContentPane(); c.setLayout(new BorderLayout()); diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java --- a/jdk/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java Wed Jul 05 23:09:40 2017 +0200 @@ -2164,6 +2164,41 @@ return false; } + /** + * Enables the antialiasing rendering hint for the scaled graphics and + * returns the previous hint value. + * The returned null value indicates that the passed graphics is not + * instance of Graphics2D. + * + * @param g the graphics + * @return the previous antialiasing rendering hint value if the passed + * graphics is instance of Graphics2D, null otherwise. + */ + public static Object getAndSetAntialisingHintForScaledGraphics(Graphics g) { + if (isScaledGraphics(g) && isLocalDisplay()) { + Graphics2D g2d = (Graphics2D) g; + Object hint = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + return hint; + } + return null; + } + + /** + * Sets the antialiasing rendering hint if its value is not null. + * Null hint value indicates that the passed graphics is not instance of + * Graphics2D. + * + * @param g the graphics + * @param hint the antialiasing rendering hint + */ + public static void setAntialiasingHintForScaledGraphics(Graphics g, Object hint) { + if (hint != null) { + ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, hint); + } + } + public static boolean isFloatingPointScale(AffineTransform tx) { int type = tx.getType() & ~(TYPE_FLIP | TYPE_TRANSLATION); if (type == 0) { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/legal/colorimaging.md --- a/jdk/src/java.desktop/share/legal/colorimaging.md Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.desktop/share/legal/colorimaging.md Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,7 @@ ## Eastman Kodak Company: Kodak Color Management System (kcms) and portions of color management and imaging software -### Notice +### Eastman Kodak Notice +
    +Portions Copyright Eastman Kodak Company 1991-2003
    +
    -Portions Copyright Eastman Kodak Company 1991-2003 diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/legal/jpeg.md --- a/jdk/src/java.desktop/share/legal/jpeg.md Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.desktop/share/legal/jpeg.md Wed Jul 05 23:09:40 2017 +0200 @@ -1,4 +1,4 @@ -## JPEG rb6 +## JPEG release 6b ### JPEG License
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/legal/libpng.md
    --- a/jdk/src/java.desktop/share/legal/libpng.md	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/share/legal/libpng.md	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,6 +1,6 @@
    -## Libpng v 1.6.23
    +## libpng v1.6.23
     
    -### Libpng License
    +### libpng License
     
     
     This copy of the libpng notices is provided for your convenience.  In case of
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/share/legal/mesa3d.md
    --- a/jdk/src/java.desktop/share/legal/mesa3d.md	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/share/legal/mesa3d.md	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,6 +1,6 @@
     ## Mesa 3-D Graphics Library v4.1
     
    -### Mesa 3-D Graphics Library License
    +### Mesa License
     
     
     Mesa 3-D graphics library
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/unix/classes/sun/awt/X11/InfoWindow.java
    --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/InfoWindow.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/InfoWindow.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -25,17 +25,34 @@
     
     package sun.awt.X11;
     
    -import java.awt.*;
    -import java.awt.event.*;
    -import java.awt.peer.TrayIconPeer;
    -import sun.awt.*;
    -
    -import java.awt.image.*;
    +import java.awt.BorderLayout;
    +import java.awt.Button;
    +import java.awt.Color;
    +import java.awt.Component;
    +import java.awt.Container;
    +import java.awt.Dimension;
    +import java.awt.Font;
    +import java.awt.Frame;
    +import java.awt.GridLayout;
    +import java.awt.Image;
    +import java.awt.Insets;
    +import java.awt.Label;
    +import java.awt.MouseInfo;
    +import java.awt.Panel;
    +import java.awt.Point;
    +import java.awt.Rectangle;
    +import java.awt.Toolkit;
    +import java.awt.Window;
    +import java.awt.event.ActionEvent;
    +import java.awt.event.ActionListener;
    +import java.awt.event.MouseAdapter;
    +import java.awt.event.MouseEvent;
    +import java.security.AccessController;
    +import java.security.PrivilegedAction;
     import java.text.BreakIterator;
     import java.util.concurrent.ArrayBlockingQueue;
    -import java.security.AccessController;
    -import java.security.PrivilegedAction;
    -import java.lang.reflect.InvocationTargetException;
    +
    +import sun.awt.SunToolkit;
     
     /**
      * An utility window class. This is a base class for Tooltip and Balloon.
    @@ -81,16 +98,16 @@
             Dimension size = getSize();
             Rectangle scrSize = getGraphicsConfiguration().getBounds();
     
    -        if (corner.x < scrSize.width/2 && corner.y < scrSize.height/2) { // 1st square
    +        if (corner.x < scrSize.x + scrSize.width/2 && corner.y < scrSize.y + scrSize.height/2) { // 1st square
                 setLocation(corner.x + indent, corner.y + indent);
     
    -        } else if (corner.x >= scrSize.width/2 && corner.y < scrSize.height/2) { // 2nd square
    +        } else if (corner.x >= scrSize.x + scrSize.width/2 && corner.y < scrSize.y + scrSize.height/2) { // 2nd square
                 setLocation(corner.x - indent - size.width, corner.y + indent);
     
    -        } else if (corner.x < scrSize.width/2 && corner.y >= scrSize.height/2) { // 3rd square
    +        } else if (corner.x < scrSize.x + scrSize.width/2 && corner.y >= scrSize.y + scrSize.height/2) { // 3rd square
                 setLocation(corner.x + indent, corner.y - indent - size.height);
     
    -        } else if (corner.x >= scrSize.width/2 && corner.y >= scrSize.height/2) { // 4th square
    +        } else if (corner.x >= scrSize.x +scrSize.width/2 && corner.y >= scrSize.y +scrSize.height/2) { // 4th square
                 setLocation(corner.x - indent - size.width, corner.y - indent - size.height);
             }
     
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/unix/classes/sun/awt/X11/XBaseMenuWindow.java
    --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XBaseMenuWindow.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XBaseMenuWindow.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -25,17 +25,15 @@
     package sun.awt.X11;
     
     import java.awt.*;
    -import java.awt.peer.*;
     import java.awt.event.*;
    -import java.awt.image.ColorModel;
     
     import sun.awt.*;
     
    +import java.awt.peer.ComponentPeer;
     import java.util.ArrayList;
     import java.util.Vector;
     import sun.util.logging.PlatformLogger;
     import sun.java2d.SurfaceData;
    -import sun.java2d.SunGraphics2D;
     
     /**
      * The abstract class XBaseMenuWindow is the superclass
    @@ -656,28 +654,37 @@
          *
          ************************************************/
     
    +    GraphicsConfiguration getCurrentGraphicsConfiguration() {
    +        Component hw = SunToolkit.getHeavyweightComponent(target);
    +        XWindow peer = AWTAccessor.getComponentAccessor().getPeer(hw);
    +        if (peer != null && peer.graphicsConfig != null) {
    +            return peer.graphicsConfig;
    +        }
    +        return graphicsConfig;
    +    }
    +
         /**
          * Checks if window fits below specified item
          * returns rectangle that the window fits to or null.
          * @param itemBounds rectangle of item in global coordinates
          * @param windowSize size of submenu window to fit
    -     * @param screenSize size of screen
    +     * @param screenBounds size of screen
          */
    -    Rectangle fitWindowBelow(Rectangle itemBounds, Dimension windowSize, Dimension screenSize) {
    +    Rectangle fitWindowBelow(Rectangle itemBounds, Dimension windowSize, Rectangle screenBounds) {
             int width = windowSize.width;
             int height = windowSize.height;
             //Fix for 6267162: PIT: Popup Menu gets hidden below the screen when opened
             //near the periphery of the screen, XToolkit
             //Window should be moved if it's outside top-left screen bounds
    -        int x = (itemBounds.x > 0) ? itemBounds.x : 0;
    -        int y = (itemBounds.y + itemBounds.height > 0) ? itemBounds.y + itemBounds.height : 0;
    -        if (y + height <= screenSize.height) {
    +        int x = (itemBounds.x > screenBounds.x) ? itemBounds.x : screenBounds.x;
    +        int y = (itemBounds.y + itemBounds.height > screenBounds.y) ? itemBounds.y + itemBounds.height : screenBounds.y;
    +        if (y + height <= screenBounds.y + screenBounds.height) {
                 //move it to the left if needed
    -            if (width > screenSize.width) {
    -                width = screenSize.width;
    +            if (width > screenBounds.width) {
    +                width = screenBounds.width;
                 }
    -            if (x + width > screenSize.width) {
    -                x = screenSize.width - width;
    +            if (x + width > screenBounds.x + screenBounds.width) {
    +                x = screenBounds.x + screenBounds.width - width;
                 }
                 return new Rectangle(x, y, width, height);
             } else {
    @@ -690,23 +697,23 @@
          * returns rectangle that the window fits to or null.
          * @param itemBounds rectangle of item in global coordinates
          * @param windowSize size of submenu window to fit
    -     * @param screenSize size of screen
    +     * @param screenBounds size of screen
          */
    -    Rectangle fitWindowAbove(Rectangle itemBounds, Dimension windowSize, Dimension screenSize) {
    +    Rectangle fitWindowAbove(Rectangle itemBounds, Dimension windowSize, Rectangle screenBounds) {
             int width = windowSize.width;
             int height = windowSize.height;
             //Fix for 6267162: PIT: Popup Menu gets hidden below the screen when opened
             //near the periphery of the screen, XToolkit
             //Window should be moved if it's outside bottom-left screen bounds
    -        int x = (itemBounds.x > 0) ? itemBounds.x : 0;
    -        int y = (itemBounds.y > screenSize.height) ? screenSize.height - height : itemBounds.y - height;
    -        if (y >= 0) {
    +        int x = (itemBounds.x > screenBounds.x) ? itemBounds.x : screenBounds.x;
    +        int y = (itemBounds.y > screenBounds.y + screenBounds.height) ? screenBounds.y + screenBounds.height - height : itemBounds.y - height;
    +        if (y >= screenBounds.y) {
                 //move it to the left if needed
    -            if (width > screenSize.width) {
    -                width = screenSize.width;
    +            if (width > screenBounds.width) {
    +                width = screenBounds.width;
                 }
    -            if (x + width > screenSize.width) {
    -                x = screenSize.width - width;
    +            if (x + width > screenBounds.x + screenBounds.width) {
    +                x = screenBounds.x + screenBounds.width - width;
                 }
                 return new Rectangle(x, y, width, height);
             } else {
    @@ -719,23 +726,23 @@
          * returns rectangle that the window fits to or null.
          * @param itemBounds rectangle of item in global coordinates
          * @param windowSize size of submenu window to fit
    -     * @param screenSize size of screen
    +     * @param screenBounds size of screen
          */
    -    Rectangle fitWindowRight(Rectangle itemBounds, Dimension windowSize, Dimension screenSize) {
    +    Rectangle fitWindowRight(Rectangle itemBounds, Dimension windowSize, Rectangle screenBounds) {
             int width = windowSize.width;
             int height = windowSize.height;
             //Fix for 6267162: PIT: Popup Menu gets hidden below the screen when opened
             //near the periphery of the screen, XToolkit
             //Window should be moved if it's outside top-left screen bounds
    -        int x = (itemBounds.x + itemBounds.width > 0) ? itemBounds.x + itemBounds.width : 0;
    -        int y = (itemBounds.y > 0) ? itemBounds.y : 0;
    -        if (x + width <= screenSize.width) {
    +        int x = (itemBounds.x + itemBounds.width > screenBounds.x) ? itemBounds.x + itemBounds.width : screenBounds.x;
    +        int y = (itemBounds.y > screenBounds.y) ? itemBounds.y : screenBounds.y;
    +        if (x + width <= screenBounds.x + screenBounds.width) {
                 //move it to the top if needed
    -            if (height > screenSize.height) {
    -                height = screenSize.height;
    +            if (height > screenBounds.height) {
    +                height = screenBounds.height;
                 }
    -            if (y + height > screenSize.height) {
    -                y = screenSize.height - height;
    +            if (y + height > screenBounds.y + screenBounds.height) {
    +                y = screenBounds.y + screenBounds.height - height;
                 }
                 return new Rectangle(x, y, width, height);
             } else {
    @@ -748,23 +755,23 @@
          * returns rectangle that the window fits to or null.
          * @param itemBounds rectangle of item in global coordinates
          * @param windowSize size of submenu window to fit
    -     * @param screenSize size of screen
    +     * @param screenBounds size of screen
          */
    -    Rectangle fitWindowLeft(Rectangle itemBounds, Dimension windowSize, Dimension screenSize) {
    +    Rectangle fitWindowLeft(Rectangle itemBounds, Dimension windowSize, Rectangle screenBounds) {
             int width = windowSize.width;
             int height = windowSize.height;
             //Fix for 6267162: PIT: Popup Menu gets hidden below the screen when opened
             //near the periphery of the screen, XToolkit
             //Window should be moved if it's outside top-right screen bounds
    -        int x = (itemBounds.x < screenSize.width) ? itemBounds.x - width : screenSize.width - width;
    -        int y = (itemBounds.y > 0) ? itemBounds.y : 0;
    -        if (x >= 0) {
    +        int x = (itemBounds.x < screenBounds.x + screenBounds.width) ? itemBounds.x - width : screenBounds.x + screenBounds.width - width;
    +        int y = (itemBounds.y > screenBounds.y) ? itemBounds.y : screenBounds.y;
    +        if (x >= screenBounds.x) {
                 //move it to the top if needed
    -            if (height > screenSize.height) {
    -                height = screenSize.height;
    +            if (height > screenBounds.height) {
    +                height = screenBounds.height;
                 }
    -            if (y + height > screenSize.height) {
    -                y = screenSize.height - height;
    +            if (y + height > screenBounds.y + screenBounds.height) {
    +                y = screenBounds.y + screenBounds.height - height;
                 }
                 return new Rectangle(x, y, width, height);
             } else {
    @@ -777,12 +784,12 @@
          * to fit it on screen - move it to the
          * top-left edge and cut by screen dimensions
          * @param windowSize size of submenu window to fit
    -     * @param screenSize size of screen
    +     * @param screenBounds size of screen
          */
    -    Rectangle fitWindowToScreen(Dimension windowSize, Dimension screenSize) {
    -        int width = (windowSize.width < screenSize.width) ? windowSize.width : screenSize.width;
    -        int height = (windowSize.height < screenSize.height) ? windowSize.height : screenSize.height;
    -        return new Rectangle(0, 0, width, height);
    +    Rectangle fitWindowToScreen(Dimension windowSize, Rectangle screenBounds) {
    +        int width = (windowSize.width < screenBounds.width) ? windowSize.width : screenBounds.width;
    +        int height = (windowSize.height < screenBounds.height) ? windowSize.height : screenBounds.height;
    +        return new Rectangle(screenBounds.x, screenBounds.y, width, height);
         }
     
     
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/unix/classes/sun/awt/X11/XChoicePeer.java
    --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XChoicePeer.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XChoicePeer.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -42,7 +42,7 @@
     
     // TODO: make painting more efficient (i.e. when down arrow is pressed, only two items should need to be repainted.
     
    -public class XChoicePeer extends XComponentPeer implements ChoicePeer, ToplevelStateListener {
    +public final class XChoicePeer extends XComponentPeer implements ChoicePeer, ToplevelStateListener {
         private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.X11.XChoicePeer");
     
         private static final int MAX_UNFURLED_ITEMS = 10;  // Maximum number of
    @@ -741,6 +741,16 @@
             }
         }
     
    +    @Override
    +    protected void initGraphicsConfiguration() {
    +        super.initGraphicsConfiguration();
    +        // The popup have the same graphic config, so update it at the same time
    +        if (unfurledChoice != null) {
    +            unfurledChoice.initGraphicsConfiguration();
    +            unfurledChoice.doValidateSurface();
    +        }
    +    }
    +
         /**************************************************************************/
         /* Common functionality between List & Choice
            /**************************************************************************/
    @@ -749,7 +759,7 @@
          * Inner class for the unfurled Choice list
          * Much, much more docs
          */
    -    class UnfurledChoice extends XWindow /*implements XScrollbarClient*/ {
    +    final class UnfurledChoice extends XWindow /*implements XScrollbarClient*/ {
     
             // First try - use Choice as the target
     
    @@ -785,7 +795,7 @@
                     numItemsDisplayed = Math.min(MAX_UNFURLED_ITEMS, numItems);
                 }
                 Point global = XChoicePeer.this.toGlobal(0,0);
    -            Rectangle screen = graphicsConfig.getBounds();
    +            Rectangle screenBounds = graphicsConfig.getBounds();
     
                 if (alignUnder != null) {
                     Rectangle choiceRec = XChoicePeer.this.getBounds();
    @@ -807,19 +817,19 @@
                     height = 2*BORDER_WIDTH +
                         numItemsDisplayed*(helper.getItemHeight()+2*ITEM_MARGIN);
                 }
    -            // Don't run off the edge of the screen
    -            if (x < 0) {
    -                x = 0;
    +            // Don't run off the edge of the screenBounds
    +            if (x < screenBounds.x) {
    +                x = screenBounds.x;
                 }
    -            else if (x + width > screen.width) {
    -                x = screen.width - width;
    +            else if (x + width > screenBounds.x + screenBounds.width) {
    +                x = screenBounds.x + screenBounds.width - width;
                 }
     
    -            if (y + height > screen.height) {
    +            if (y + height > screenBounds.y + screenBounds.height) {
                     y = global.y - height;
                 }
    -            if (y < 0) {
    -                y = 0;
    +            if (y < screenBounds.y) {
    +                y = screenBounds.y;
                 }
                 return new Rectangle(x, y, width, height);
             }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/unix/classes/sun/awt/X11/XMenuBarPeer.java
    --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XMenuBarPeer.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XMenuBarPeer.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -298,25 +298,25 @@
          */
         protected Rectangle getSubmenuBounds(Rectangle itemBounds, Dimension windowSize) {
             Rectangle globalBounds = toGlobal(itemBounds);
    -        Dimension screenSize = graphicsConfig.getBounds().getSize();
    +        Rectangle screenBounds = getCurrentGraphicsConfiguration().getBounds();
             Rectangle res;
    -        res = fitWindowBelow(globalBounds, windowSize, screenSize);
    +        res = fitWindowBelow(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        res = fitWindowAbove(globalBounds, windowSize, screenSize);
    +        res = fitWindowAbove(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        res = fitWindowRight(globalBounds, windowSize, screenSize);
    +        res = fitWindowRight(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        res = fitWindowLeft(globalBounds, windowSize, screenSize);
    +        res = fitWindowLeft(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        return fitWindowToScreen(windowSize, screenSize);
    +        return fitWindowToScreen(windowSize, screenBounds);
         }
     
         /**
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/unix/classes/sun/awt/X11/XMenuWindow.java
    --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XMenuWindow.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XMenuWindow.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -278,25 +278,25 @@
          */
         protected Rectangle getSubmenuBounds(Rectangle itemBounds, Dimension windowSize) {
             Rectangle globalBounds = toGlobal(itemBounds);
    -        Dimension screenSize = graphicsConfig.getBounds().getSize();
    +        Rectangle screenBounds = getCurrentGraphicsConfiguration().getBounds();
             Rectangle res;
    -        res = fitWindowRight(globalBounds, windowSize, screenSize);
    +        res = fitWindowRight(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        res = fitWindowBelow(globalBounds, windowSize, screenSize);
    +        res = fitWindowBelow(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        res = fitWindowAbove(globalBounds, windowSize, screenSize);
    +        res = fitWindowAbove(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        res = fitWindowLeft(globalBounds, windowSize, screenSize);
    +        res = fitWindowLeft(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        return fitWindowToScreen(windowSize, screenSize);
    +        return fitWindowToScreen(windowSize, screenBounds);
        }
     
         /**
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/unix/classes/sun/awt/X11/XPopupMenuPeer.java
    --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XPopupMenuPeer.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XPopupMenuPeer.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -216,25 +216,25 @@
          */
         protected Rectangle getWindowBounds(Point origin, Dimension windowSize) {
             Rectangle globalBounds = new Rectangle(origin.x, origin.y, 0, 0);
    -        Dimension screenSize = graphicsConfig.getBounds().getSize();
    +        Rectangle screenBounds = getCurrentGraphicsConfiguration().getBounds();
             Rectangle res;
    -        res = fitWindowRight(globalBounds, windowSize, screenSize);
    +        res = fitWindowRight(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        res = fitWindowLeft(globalBounds, windowSize, screenSize);
    +        res = fitWindowLeft(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        res = fitWindowBelow(globalBounds, windowSize, screenSize);
    +        res = fitWindowBelow(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        res = fitWindowAbove(globalBounds, windowSize, screenSize);
    +        res = fitWindowAbove(globalBounds, windowSize, screenBounds);
             if (res != null) {
                 return res;
             }
    -        return fitWindowToScreen(windowSize, screenSize);
    +        return fitWindowToScreen(windowSize, screenBounds);
        }
     
         /************************************************
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/unix/legal/fontconfig.md
    --- a/jdk/src/java.desktop/unix/legal/fontconfig.md	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/unix/legal/fontconfig.md	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,6 +1,6 @@
    -## FontConfig v2.5
    +## Fontconfig v2.5
     
    -### FontConfig License
    +### Fontconfig License
     
     
     Copyright 2001,2003 Keith Packard
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/windows/classes/sun/java2d/d3d/D3DGraphicsConfig.java
    --- a/jdk/src/java.desktop/windows/classes/sun/java2d/d3d/D3DGraphicsConfig.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/windows/classes/sun/java2d/d3d/D3DGraphicsConfig.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -186,7 +186,17 @@
             SurfaceData sd = d3dvsm.getPrimarySurfaceData();
             if (sd instanceof D3DSurfaceData) {
                 D3DSurfaceData d3dsd = (D3DSurfaceData)sd;
    -            D3DSurfaceData.swapBuffers(d3dsd, x1, y1, x2, y2);
    +            double scaleX = sd.getDefaultScaleX();
    +            double scaleY = sd.getDefaultScaleY();
    +            if (scaleX > 1 || scaleY > 1) {
    +                int sx1 = (int) Math.floor(x1 * scaleX);
    +                int sy1 = (int) Math.floor(y1 * scaleY);
    +                int sx2 = (int) Math.ceil(x2 * scaleX);
    +                int sy2 = (int) Math.ceil(y2 * scaleY);
    +                D3DSurfaceData.swapBuffers(d3dsd, sx1, sy1, sx2, sy2);
    +            } else {
    +                D3DSurfaceData.swapBuffers(d3dsd, x1, y1, x2, y2);
    +            }
             } else {
                 // the surface was likely lost could not have been restored
                 Graphics g = peer.getGraphics();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/windows/classes/sun/java2d/d3d/D3DSurfaceData.java
    --- a/jdk/src/java.desktop/windows/classes/sun/java2d/d3d/D3DSurfaceData.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/windows/classes/sun/java2d/d3d/D3DSurfaceData.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -766,7 +766,17 @@
                     final Component target = (Component)sd.getPeer().getTarget();
                     SunToolkit.executeOnEventHandlerThread(target, new Runnable() {
                         public void run() {
    -                        target.repaint(x1, y1, x2, y2);
    +                        double scaleX = sd.getDefaultScaleX();
    +                        double scaleY = sd.getDefaultScaleY();
    +                        if (scaleX > 1 || scaleY > 1) {
    +                            int sx1 = (int) Math.floor(x1 / scaleX);
    +                            int sy1 = (int) Math.floor(y1 / scaleY);
    +                            int sx2 = (int) Math.ceil(x2 / scaleX);
    +                            int sy2 = (int) Math.ceil(y2 / scaleY);
    +                            target.repaint(sx1, sy1, sx2 - sx1, sy2 - sy1);
    +                        } else {
    +                            target.repaint(x1, y1, x2 - x1, y2 - y1);
    +                        }
                         }
                     });
                     return;
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.cpp
    --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.cpp	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.cpp	Wed Jul 05 23:09:40 2017 +0200
    @@ -54,6 +54,7 @@
     jmethodID AwtPrintControl::setDevmodeID;
     jmethodID AwtPrintControl::getDevnamesID;
     jmethodID AwtPrintControl::setDevnamesID;
    +jmethodID AwtPrintControl::getParentWindowID;
     jfieldID  AwtPrintControl::driverDoesMultipleCopiesID;
     jfieldID  AwtPrintControl::driverDoesCollationID;
     jmethodID AwtPrintControl::getWin32MediaID;
    @@ -240,6 +241,11 @@
         DASSERT(AwtPrintControl::dialogOwnerPeerID != NULL);
         CHECK_NULL(AwtPrintControl::dialogOwnerPeerID);
     
    +    AwtPrintControl::getParentWindowID = env->GetMethodID(cls,
    +                                       "getParentWindowID", "()J");
    +    DASSERT(AwtPrintControl::getParentWindowID != NULL);
    +    CHECK_NULL(AwtPrintControl::getParentWindowID);
    +
         AwtPrintControl::getPrintDCID = env->GetMethodID(cls, "getPrintDC", "()J");
         DASSERT(AwtPrintControl::getPrintDCID != NULL);
         CHECK_NULL(AwtPrintControl::getPrintDCID);
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.h
    --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.h	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.h	Wed Jul 05 23:09:40 2017 +0200
    @@ -47,6 +47,7 @@
         static jmethodID setDevmodeID;
         static jmethodID getDevnamesID;
         static jmethodID setDevnamesID;
    +    static jmethodID getParentWindowID;
         static jmethodID getWin32MediaID;
         static jmethodID setWin32MediaID;
         static jmethodID getWin32MediaTrayID;
    @@ -97,6 +98,10 @@
                                      LPTSTR pPrinterName,
                                      LPDEVMODE *pDevMode);
     
    +    inline static HWND getParentID(JNIEnv *env, jobject self) {
    +      return (HWND)env->CallLongMethod(self, getParentWindowID);
    +    }
    +
         inline static  HDC getPrintDC(JNIEnv *env, jobject self) {
           return (HDC)env->CallLongMethod(self, getPrintDCID);
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintDialog.cpp
    --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintDialog.cpp	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintDialog.cpp	Wed Jul 05 23:09:40 2017 +0200
    @@ -248,6 +248,11 @@
           pd.lpfnPrintHook = (LPPRINTHOOKPROC)PrintDialogHookProc;
           pd.lpfnSetupHook = (LPSETUPHOOKPROC)PrintDialogHookProc;
           pd.Flags |= PD_ENABLESETUPHOOK | PD_ENABLEPRINTHOOK;
    +      HWND parent = AwtPrintControl::getParentID(env, control);
    +      if (parent != NULL && ::IsWindow(parent)) {
    +          // Windows native modality is requested (used by JavaFX).
    +          pd.hwndOwner = parent;
    +      }
           /*
               Fix for 6488834.
               To disable Win32 native parent modality we have to set
    @@ -255,7 +260,7 @@
               parentless dialogs we use NULL to show them in the taskbar,
               and for all other dialogs AwtToolkit's HWND is used.
           */
    -      if (awtParent != NULL)
    +      else if (awtParent != NULL)
           {
               pd.hwndOwner = AwtToolkit::GetInstance().GetHWnd();
           }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp
    --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp	Wed Jul 05 23:09:40 2017 +0200
    @@ -521,12 +521,18 @@
         AwtComponent *awtParent = (parent != NULL) ? (AwtComponent *)JNI_GET_PDATA(parent) : NULL;
         HWND hwndOwner = awtParent ? awtParent->GetHWnd() : NULL;
     
    +
         jboolean doIt = JNI_FALSE; // Assume the user will cancel the dialog.
         PAGESETUPDLG setup;
         memset(&setup, 0, sizeof(setup));
     
         setup.lStructSize = sizeof(setup);
     
    +    HWND parentID = AwtPrintControl::getParentID(env, self);
    +    if (parentID != NULL && ::IsWindow(parentID)) {
    +        // windows native modality is requested (used by JavaFX).
    +        setup.hwndOwner = parentID;
    +    }
         /*
           Fix for 6488834.
           To disable Win32 native parent modality we have to set
    @@ -534,7 +540,7 @@
           parentless dialogs we use NULL to show them in the taskbar,
           and for all other dialogs AwtToolkit's HWND is used.
         */
    -    if (awtParent != NULL)
    +    else if (awtParent != NULL)
         {
             setup.hwndOwner = AwtToolkit::GetInstance().GetHWnd();
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java
    --- a/jdk/src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -191,6 +191,9 @@
          *         if the input does not represent a well-formed class file
          * @return a well-formed class file buffer (the result of the transform),
          *         or {@code null} if no transform is performed
    +     *
    +     * @revised 9
    +     * @spec JPMS
          */
         default byte[]
         transform(  ClassLoader         loader,
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.instrument/share/classes/module-info.java
    --- a/jdk/src/java.instrument/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.instrument/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -27,6 +27,7 @@
      * Defines services that allow agents to
      * instrument programs running on the JVM.
      *
    + * @moduleGraph
      * @since 9
      */
     module java.instrument {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.logging/share/classes/java/util/logging/LogManager.java
    --- a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1839,6 +1839,7 @@
          *          logging configuration file.
          *
          * @see #updateConfiguration(java.io.InputStream, java.util.function.Function)
    +     * @since 9
          */
         public void updateConfiguration(Function> mapper)
                 throws IOException {
    @@ -2035,6 +2036,7 @@
          * @throws  IOException if there are problems reading from the stream,
          *          or the given stream is not in the
          *          {@linkplain java.util.Properties properties file} format.
    +     * @since 9
          */
         public void updateConfiguration(InputStream ins,
                 Function> mapper)
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.logging/share/classes/module-info.java
    --- a/jdk/src/java.logging/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.logging/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -26,6 +26,7 @@
     /**
      * Defines the Java Logging API.
      *
    + * @moduleGraph
      * @since 9
      */
     module java.logging {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.management.rmi/share/classes/module-info.java
    --- a/jdk/src/java.management.rmi/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.management.rmi/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -46,6 +46,7 @@
      *           and load the appropriate {@code JMXConnectorServerProvider} service
      *           implementation for the given protocol.
      *
    + * @moduleGraph
      * @since 9
      */
     module java.management.rmi {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.management/share/classes/module-info.java
    --- a/jdk/src/java.management/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.management/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -29,6 +29,7 @@
      * The JMX API consists of interfaces for monitoring and management of the
      * JVM and other components in the Java runtime.
      *
    + * @moduleGraph
      * @since 9
      */
     module java.management {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.naming/share/classes/module-info.java
    --- a/jdk/src/java.naming/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.naming/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -26,6 +26,7 @@
     /**
      * Defines the Java Naming and Directory Interface (JNDI) API.
      *
    + * @moduleGraph
      * @since 9
      */
     module java.naming {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.prefs/share/classes/java/util/prefs/Preferences.java
    --- a/jdk/src/java.prefs/share/classes/java/util/prefs/Preferences.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/java.prefs/share/classes/java/util/prefs/Preferences.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -188,8 +188,8 @@
      * administrator to replace the default preferences implementation with an
      * alternative implementation.
      *
    - * 

    Implementation note: In Sun's JRE, the {@code PreferencesFactory} - * implementation is located as follows: + * @implNote + * The {@code PreferencesFactory} implementation is located as follows: * *

      * diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.prefs/share/classes/module-info.java --- a/jdk/src/java.prefs/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.prefs/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,6 +26,7 @@ /** * Defines the Preferences API. * + * @moduleGraph * @since 9 */ module java.prefs { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.rmi/share/classes/module-info.java --- a/jdk/src/java.rmi/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.rmi/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,6 +26,7 @@ /** * Defines the Remote Method Invocation (RMI) API. * + * @moduleGraph * @since 9 */ module java.rmi { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.scripting/share/classes/module-info.java --- a/jdk/src/java.scripting/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.scripting/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,6 +26,7 @@ /** * Defines the Scripting API. * + * @moduleGraph * @since 9 */ module java.scripting { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.se.ee/share/classes/module-info.java --- a/jdk/src/java.se.ee/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.se.ee/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,6 +29,7 @@ * This module requires {@code java.se} and supplements it with modules * that define CORBA and Java EE APIs. These modules are upgradeable. * + * @moduleGraph * @since 9 */ @SuppressWarnings("deprecation") diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.se/share/classes/module-info.java --- a/jdk/src/java.se/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.se/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,6 +29,7 @@ * The modules defining CORBA and Java EE APIs are not required by * this module, but they are required by {@code java.se.ee}. * + * @moduleGraph * @since 9 */ module java.se { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.security.jgss/share/classes/module-info.java --- a/jdk/src/java.security.jgss/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.security.jgss/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,6 +28,7 @@ *

      * This module also contains GSS-API mechanisms including Kerberos v5 and SPNEGO. * + * @moduleGraph * @since 9 */ module java.security.jgss { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -577,7 +577,8 @@ for (Path p: files) { if (Files.isDirectory(p)) continue; String name = p.getFileName().toString(); - if (name.matches("[a-zA-Z0-9_-]+")) { + if (name.matches("[a-zA-Z0-9_-]+") || + name.endsWith(".conf")) { // if dir is absolute, so is p readConfigFileLines(p, content, dups); } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.security.sasl/share/classes/module-info.java --- a/jdk/src/java.security.sasl/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.security.sasl/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -30,6 +30,7 @@ * This module also contains SASL mechanisms including DIGEST-MD5, * CRAM-MD5, and NTLM. * + * @moduleGraph * @since 9 */ module java.security.sasl { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.smartcardio/share/classes/module-info.java --- a/jdk/src/java.smartcardio/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.smartcardio/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,6 +26,7 @@ /** * Defines the Java Smart Card I/O API. * + * @moduleGraph * @since 9 */ module java.smartcardio { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.smartcardio/unix/legal/pcsclite.md --- a/jdk/src/java.smartcardio/unix/legal/pcsclite.md Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.smartcardio/unix/legal/pcsclite.md Wed Jul 05 23:09:40 2017 +0200 @@ -1,6 +1,6 @@ ## PC/SC Lite for Suse Linux v1.1.1 -### PC/SC Lite for Suse Linux License +### PC/SC Lite License

       
       Copyright (c) 1999-2004 David Corcoran 
      diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql.rowset/share/classes/module-info.java
      --- a/jdk/src/java.sql.rowset/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
      +++ b/jdk/src/java.sql.rowset/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
      @@ -26,6 +26,7 @@
       /**
        * Defines the JDBC RowSet API.
        *
      + * @moduleGraph
        * @since 9
        */
       module java.sql.rowset {
      diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/CallableStatement.java
      --- a/jdk/src/java.sql/share/classes/java/sql/CallableStatement.java	Sat Apr 08 03:25:14 2017 +0000
      +++ b/jdk/src/java.sql/share/classes/java/sql/CallableStatement.java	Wed Jul 05 23:09:40 2017 +0200
      @@ -60,6 +60,7 @@
        *
        * @see Connection#prepareCall
        * @see ResultSet
      + * @since 1.1
        */
       
       public interface CallableStatement extends PreparedStatement {
      diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/Connection.java
      --- a/jdk/src/java.sql/share/classes/java/sql/Connection.java	Sat Apr 08 03:25:14 2017 +0000
      +++ b/jdk/src/java.sql/share/classes/java/sql/Connection.java	Wed Jul 05 23:09:40 2017 +0200
      @@ -80,6 +80,7 @@
        * @see Statement
        * @see ResultSet
        * @see DatabaseMetaData
      + * @since 1.1
        */
       public interface Connection  extends Wrapper, AutoCloseable {
       
      diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/DataTruncation.java
      --- a/jdk/src/java.sql/share/classes/java/sql/DataTruncation.java	Sat Apr 08 03:25:14 2017 +0000
      +++ b/jdk/src/java.sql/share/classes/java/sql/DataTruncation.java	Wed Jul 05 23:09:40 2017 +0200
      @@ -34,6 +34,8 @@
        *
        * 

      The SQLstate for a DataTruncation during read is 01004. *

      The SQLstate for a DataTruncation during write is 22001. + * + * @since 1.1 */ public class DataTruncation extends SQLWarning { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/DatabaseMetaData.java --- a/jdk/src/java.sql/share/classes/java/sql/DatabaseMetaData.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/DatabaseMetaData.java Wed Jul 05 23:09:40 2017 +0200 @@ -68,6 +68,7 @@ * argument is set to null, that argument's criterion will * be dropped from the search. * + * @since 1.1 */ public interface DatabaseMetaData extends Wrapper { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/Date.java --- a/jdk/src/java.sql/share/classes/java/sql/Date.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/Date.java Wed Jul 05 23:09:40 2017 +0200 @@ -41,6 +41,8 @@ * must be 'normalized' by setting the * hours, minutes, seconds, and milliseconds to zero in the particular * time zone with which the instance is associated. + * + * @since 1.1 */ public class Date extends java.util.Date { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/Driver.java --- a/jdk/src/java.sql/share/classes/java/sql/Driver.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/Driver.java Wed Jul 05 23:09:40 2017 +0200 @@ -54,6 +54,7 @@ * @see DriverManager * @see Connection * @see DriverAction + * @since 1.1 */ public interface Driver { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/DriverManager.java --- a/jdk/src/java.sql/share/classes/java/sql/DriverManager.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/DriverManager.java Wed Jul 05 23:09:40 2017 +0200 @@ -78,6 +78,7 @@ * * @see Driver * @see Connection + * @since 1.1 */ public class DriverManager { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/DriverPropertyInfo.java --- a/jdk/src/java.sql/share/classes/java/sql/DriverPropertyInfo.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/DriverPropertyInfo.java Wed Jul 05 23:09:40 2017 +0200 @@ -31,6 +31,8 @@ * who need to interact with a Driver via the method * getDriverProperties to discover * and supply properties for connections. + * + * @since 1.1 */ public class DriverPropertyInfo { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/PreparedStatement.java --- a/jdk/src/java.sql/share/classes/java/sql/PreparedStatement.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/PreparedStatement.java Wed Jul 05 23:09:40 2017 +0200 @@ -56,6 +56,7 @@ * * @see Connection#prepareStatement * @see ResultSet + * @since 1.1 */ public interface PreparedStatement extends Statement { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/ResultSet.java --- a/jdk/src/java.sql/share/classes/java/sql/ResultSet.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/ResultSet.java Wed Jul 05 23:09:40 2017 +0200 @@ -143,6 +143,7 @@ * @see Statement#executeQuery * @see Statement#getResultSet * @see ResultSetMetaData + * @since 1.1 */ public interface ResultSet extends Wrapper, AutoCloseable { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/ResultSetMetaData.java --- a/jdk/src/java.sql/share/classes/java/sql/ResultSetMetaData.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/ResultSetMetaData.java Wed Jul 05 23:09:40 2017 +0200 @@ -40,6 +40,8 @@ * boolean b = rsmd.isSearchable(1); * *

      + * + * @since 1.1 */ public interface ResultSetMetaData extends Wrapper { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/SQLException.java --- a/jdk/src/java.sql/share/classes/java/sql/SQLException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/SQLException.java Wed Jul 05 23:09:40 2017 +0200 @@ -49,6 +49,8 @@ * error information. *
    1. the causal relationship, if any for this SQLException. * + * + * @since 1.1 */ public class SQLException extends java.lang.Exception implements Iterable { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/SQLWarning.java --- a/jdk/src/java.sql/share/classes/java/sql/SQLWarning.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/SQLWarning.java Wed Jul 05 23:09:40 2017 +0200 @@ -41,6 +41,7 @@ * @see Connection#getWarnings * @see Statement#getWarnings * @see ResultSet#getWarnings + * @since 1.1 */ public class SQLWarning extends SQLException { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/ShardingKeyBuilder.java --- a/jdk/src/java.sql/share/classes/java/sql/ShardingKeyBuilder.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/ShardingKeyBuilder.java Wed Jul 05 23:09:40 2017 +0200 @@ -42,6 +42,8 @@ * .build(); * } *
    + * + * @since 9 */ public interface ShardingKeyBuilder { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/Statement.java --- a/jdk/src/java.sql/share/classes/java/sql/Statement.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/Statement.java Wed Jul 05 23:09:40 2017 +0200 @@ -42,6 +42,7 @@ * * @see Connection#createStatement * @see ResultSet + * @since 1.1 */ public interface Statement extends Wrapper, AutoCloseable { @@ -1399,6 +1400,8 @@ * converted to two single quotes * @throws NullPointerException if val is {@code null} * @throws SQLException if a database access error occurs + * + * @since 9 */ default String enquoteLiteral(String val) throws SQLException { return "'" + val.replace("'", "''") + "'"; @@ -1503,6 +1506,8 @@ * @throws SQLFeatureNotSupportedException if the datasource does not support * delimited identifiers * @throws NullPointerException if identifier is {@code null} + * + * @since 9 */ default String enquoteIdentifier(String identifier, boolean alwaysQuote) throws SQLException { int len = identifier.length(); @@ -1576,6 +1581,8 @@ * @return true if a simple SQL identifier, false otherwise * @throws NullPointerException if identifier is {@code null} * @throws SQLException if a database access error occurs + * + * @since 9 */ default boolean isSimpleIdentifier(String identifier) throws SQLException { int len = identifier.length(); @@ -1617,6 +1624,8 @@ * then prefixed with 'N'. * @throws NullPointerException if val is {@code null} * @throws SQLException if a database access error occurs + * + * @since 9 */ default String enquoteNCharLiteral(String val) throws SQLException { return "N'" + val.replace("'", "''") + "'"; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/Time.java --- a/jdk/src/java.sql/share/classes/java/sql/Time.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/Time.java Wed Jul 05 23:09:40 2017 +0200 @@ -38,6 +38,8 @@ * values. *

    The date components should be set to the "zero epoch" * value of January 1, 1970 and should not be accessed. + * + * @since 1.1 */ public class Time extends java.util.Date { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/Timestamp.java --- a/jdk/src/java.sql/share/classes/java/sql/Timestamp.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/Timestamp.java Wed Jul 05 23:09:40 2017 +0200 @@ -69,6 +69,8 @@ * inheritance relationship between {@code Timestamp} * and {@code java.util.Date} really * denotes implementation inheritance, and not type inheritance. + * + * @since 1.1 */ public class Timestamp extends java.util.Date { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/java/sql/Types.java --- a/jdk/src/java.sql/share/classes/java/sql/Types.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/java/sql/Types.java Wed Jul 05 23:09:40 2017 +0200 @@ -30,6 +30,8 @@ * SQL types, called JDBC types. *

    * This class is never instantiated. + * + * @since 1.1 */ public class Types { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/javax/transaction/xa/XAException.java --- a/jdk/src/java.sql/share/classes/javax/transaction/xa/XAException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/javax/transaction/xa/XAException.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,6 +29,7 @@ * The XAException is thrown by the Resource Manager (RM) to inform the * Transaction Manager of an error encountered by the involved transaction. * + * @since 1.4 */ public class XAException extends Exception { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/javax/transaction/xa/XAResource.java --- a/jdk/src/java.sql/share/classes/javax/transaction/xa/XAResource.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/javax/transaction/xa/XAResource.java Wed Jul 05 23:09:40 2017 +0200 @@ -56,6 +56,7 @@ * the transaction manager to prepare, commit, or rollback a transaction * according to the two-phase commit protocol.

    * + * @since 1.4 */ public interface XAResource { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/javax/transaction/xa/Xid.java --- a/jdk/src/java.sql/share/classes/javax/transaction/xa/Xid.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/javax/transaction/xa/Xid.java Wed Jul 05 23:09:40 2017 +0200 @@ -32,6 +32,8 @@ * and branch qualifier. The Xid interface is used by the transaction * manager and the resource managers. This interface is not visible to * the application programs. + * + * @since 1.4 */ public interface Xid { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.sql/share/classes/module-info.java --- a/jdk/src/java.sql/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.sql/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,6 +26,7 @@ /** * Defines the JDBC API. * + * @moduleGraph * @since 9 */ module java.sql { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.transaction/share/classes/module-info.java --- a/jdk/src/java.transaction/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.transaction/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,8 +29,10 @@ * The subset consists of RMI exception types which are mapped to CORBA system * exceptions by the 'Java Language to IDL Mapping Specification'. * + * @moduleGraph * @since 9 */ +@Deprecated(since="9", forRemoval=true) module java.transaction { requires transitive java.rmi; exports javax.transaction; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.xml.crypto/share/classes/module-info.java --- a/jdk/src/java.xml.crypto/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.xml.crypto/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,8 +24,9 @@ */ /** - * Defines an API for XML cryptography. + * Defines the API for XML cryptography. * + * @moduleGraph * @since 9 */ module java.xml.crypto { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/java.xml.crypto/share/legal/santuario.md --- a/jdk/src/java.xml.crypto/share/legal/santuario.md Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/java.xml.crypto/share/legal/santuario.md Wed Jul 05 23:09:40 2017 +0200 @@ -1,6 +1,6 @@ ## Apache Santuario v1.5.4 -### Notice +### Apache Santuario Notice
     
       Apache Santuario - XML Security for Java
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.attach/share/classes/module-info.java
    --- a/jdk/src/jdk.attach/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.attach/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -26,6 +26,7 @@
     /**
      * Defines the attach API.
      *
    + * @moduleGraph
      * @since 9
      */
     module jdk.attach {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.charsets/share/classes/module-info.java
    --- a/jdk/src/jdk.charsets/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.charsets/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -23,6 +23,13 @@
      * questions.
      */
     
    +/**
    + * {@link java.nio.charset.Charset Charset} provider for the charsets that
    + * are not in {@code java.base} (mostly double byte and IBM charsets).
    + *
    + * @moduleGraph
    + * @since 9
    + */
     module jdk.charsets {
         provides java.nio.charset.spi.CharsetProvider
             with sun.nio.cs.ext.ExtendedCharsets;
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.crypto.cryptoki/share/classes/module-info.java
    --- a/jdk/src/jdk.crypto.cryptoki/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.crypto.cryptoki/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -26,6 +26,7 @@
     /**
      * The SunPKCS11 security provider.
      *
    + * @moduleGraph
      * @since 9
      */
     module jdk.crypto.cryptoki {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.crypto.cryptoki/share/legal/pkcs11cryptotoken.md
    --- a/jdk/src/jdk.crypto.cryptoki/share/legal/pkcs11cryptotoken.md	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.crypto.cryptoki/share/legal/pkcs11cryptotoken.md	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,4 +1,4 @@
    -## PKCS #11 Cryptographic Token Interface, v2.20 amendment 3 Header Files
    +## PKCS #11 Cryptographic Token Interface v2.20 Amendment 3 Header Files
     
     ### PKCS #11 Cryptographic Token Interface License
     
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.crypto.ec/share/classes/module-info.java
    --- a/jdk/src/jdk.crypto.ec/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.crypto.ec/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -26,6 +26,7 @@
     /**
      * The SunEC security provider.
      *
    + * @moduleGraph
      * @since 9
      */
     module jdk.crypto.ec {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.crypto.ec/share/legal/ecc.md
    --- a/jdk/src/jdk.crypto.ec/share/legal/ecc.md	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.crypto.ec/share/legal/ecc.md	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,6 +1,6 @@
    -## Mozilla Elliptic Curve Cryptography
    +## Mozilla Elliptic Curve Cryptography (ECC)
     
    -### Notice
    +### Mozilla ECC Notice
     
     
     This notice is provided with respect to Elliptic Curve Cryptography,
    @@ -21,7 +21,7 @@
     
     
    -### LGPL 2.1 License +### LGPL 2.1
     
                       GNU LESSER GENERAL PUBLIC LICENSE
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.crypto.mscapi/windows/classes/module-info.java
    --- a/jdk/src/jdk.crypto.mscapi/windows/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.crypto.mscapi/windows/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -26,6 +26,7 @@
     /**
      * The SunMSCAPI security provider.
      *
    + * @moduleGraph
      * @since 9
      */
     module jdk.crypto.mscapi {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.crypto.ucrypto/solaris/classes/module-info.java
    --- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -26,6 +26,7 @@
     /**
      * The OracleUCrypto security provider.
      *
    + * @moduleGraph
      * @since 9
      */
     module jdk.crypto.ucrypto {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.httpserver/share/classes/module-info.java
    --- a/jdk/src/jdk.httpserver/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.httpserver/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -23,6 +23,12 @@
      * questions.
      */
     
    +/**
    + * Defines the JDK-specific API for HTTP server.
    + *
    + * @moduleGraph
    + * @since 9
    + */
     module jdk.httpserver {
     
         exports com.sun.net.httpserver;
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jartool/share/classes/module-info.java
    --- a/jdk/src/jdk.jartool/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jartool/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -23,6 +23,13 @@
      * questions.
      */
     
    +/**
    + * Defines tools for manipulating Java Archive (JAR) files,
    + * including the jar and jarsigner tools.
    + *
    + * @moduleGraph
    + * @since 9
    + */
     module jdk.jartool {
         exports com.sun.jarsigner;
         exports jdk.security.jarsigner;
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java
    --- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -95,7 +95,7 @@
                         tool.xflag = true;
                     }
                 },
    -            new Option(false, OptionType.MAIN_OPERATION, "--print-module-descriptor", "-d") {
    +            new Option(false, OptionType.MAIN_OPERATION, "--describe-module", "-d") {
                     void process(Main tool, String opt, String arg) throws BadArgs {
                         if (tool.cflag || tool.iflag  || tool.tflag || tool.uflag || tool.xflag)
                             throw new BadArgs("error.multiple.main.operations").showUsage(true);
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java
    --- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -27,6 +27,7 @@
     
     import java.io.*;
     import java.lang.module.Configuration;
    +import java.lang.module.FindException;
     import java.lang.module.InvalidModuleDescriptorException;
     import java.lang.module.ModuleDescriptor;
     import java.lang.module.ModuleDescriptor.Exports;
    @@ -63,6 +64,7 @@
     import jdk.internal.module.ModuleInfo;
     import jdk.internal.module.ModuleInfoExtender;
     import jdk.internal.module.ModuleResolution;
    +import jdk.internal.module.ModuleTarget;
     import jdk.internal.util.jar.JarIndex;
     
     import static jdk.internal.util.jar.JarIndex.INDEX_NAME;
    @@ -407,11 +409,11 @@
                     boolean found;
                     if (fname != null) {
                         try (ZipFile zf = new ZipFile(fname)) {
    -                        found = printModuleDescriptor(zf);
    +                        found = describeModule(zf);
                         }
                     } else {
                         try (FileInputStream fin = new FileInputStream(FileDescriptor.in)) {
    -                        found = printModuleDescriptor(fin);
    +                        found = describeModule(fin);
                         }
                     }
                     if (!found)
    @@ -603,7 +605,7 @@
             int n = args.length - count;
             if (n > 0) {
                 if (dflag) {
    -                // "--print-module-descriptor/-d" does not require file argument(s)
    +                // "--describe-module/-d" does not require file argument(s)
                     usageError(formatMsg("error.bad.dflag", args[count]));
                     return false;
                 }
    @@ -1728,24 +1730,43 @@
                                .collect(joining(", ", prefix, suffix));
         }
     
    -    private boolean printModuleDescriptor(ZipFile zipFile)
    -        throws IOException
    -    {
    +    private boolean describeModule(ZipFile zipFile) throws IOException {
             ZipEntry[] zes = zipFile.stream()
                 .filter(e -> isModuleInfoEntry(e.getName()))
                 .sorted(Validator.ENTRY_COMPARATOR)
                 .toArray(ZipEntry[]::new);
    -        if (zes.length == 0)
    -            return false;
    -        for (ZipEntry ze : zes) {
    -            try (InputStream is = zipFile.getInputStream(ze)) {
    -                printModuleDescriptor(is, ze.getName());
    +
    +        if (zes.length == 0) {
    +            // No module descriptor found, derive the automatic module name
    +            String fn = zipFile.getName();
    +            ModuleFinder mf = ModuleFinder.of(Paths.get(fn));
    +            try {
    +                Set mref = mf.findAll();
    +                if (mref.isEmpty()) {
    +                    output(formatMsg("error.unable.derive.automodule", fn));
    +                    return true;
    +                }
    +                ModuleDescriptor md = mref.iterator().next().descriptor();
    +                output(getMsg("out.automodule"));
    +                describeModule(md, null, null, "automatic");
    +            } catch (FindException e) {
    +                String msg = formatMsg("error.unable.derive.automodule", fn);
    +                Throwable t = e.getCause();
    +                if (t != null)
    +                    msg = msg + "\n" + t.getMessage();
    +                output(msg);
    +            }
    +        } else {
    +            for (ZipEntry ze : zes) {
    +                try (InputStream is = zipFile.getInputStream(ze)) {
    +                    describeModule(is, ze.getName());
    +                }
                 }
             }
             return true;
         }
     
    -    private boolean printModuleDescriptor(FileInputStream fis)
    +    private boolean describeModule(FileInputStream fis)
             throws IOException
         {
             try (BufferedInputStream bis = new BufferedInputStream(fis);
    @@ -1764,7 +1785,7 @@
                 .sorted(Validator.ENTRYNAME_COMPARATOR)
                 .toArray(String[]::new);
             for (String name : names) {
    -            printModuleDescriptor(new ByteArrayInputStream(moduleInfos.get(name)), name);
    +            describeModule(new ByteArrayInputStream(moduleInfos.get(name)), name);
             }
             return true;
         }
    @@ -1775,13 +1796,23 @@
                       .collect(joining(" "));
         }
     
    -    private void printModuleDescriptor(InputStream entryInputStream, String ename)
    +    private void describeModule(InputStream entryInputStream, String ename)
             throws IOException
         {
             ModuleInfo.Attributes attrs = ModuleInfo.read(entryInputStream, null);
             ModuleDescriptor md = attrs.descriptor();
    +        ModuleTarget target = attrs.target();
             ModuleHashes hashes = attrs.recordedHashes();
     
    +        describeModule(md, target, hashes, ename);
    +    }
    +
    +    private void describeModule(ModuleDescriptor md,
    +                                ModuleTarget target,
    +                                ModuleHashes hashes,
    +                                String ename)
    +        throws IOException
    +    {
             StringBuilder sb = new StringBuilder();
             sb.append("\nmodule ")
               .append(md.toNameAndVersion())
    @@ -1824,11 +1855,14 @@
     
             md.mainClass().ifPresent(v -> sb.append("\n  main-class " + v));
     
    -        md.osName().ifPresent(v -> sb.append("\n  operating-system-name " + v));
    -
    -        md.osArch().ifPresent(v -> sb.append("\n  operating-system-architecture " + v));
    -
    -        md.osVersion().ifPresent(v -> sb.append("\n  operating-system-version " + v));
    +        if (target != null) {
    +            String osName = target.osName();
    +            if (osName != null)
    +                sb.append("\n  operating-system-name " + osName);
    +            String osArch = target.osArch();
    +            if (osArch != null)
    +                sb.append("\n  operating-system-architecture " + osArch);
    +       }
     
            if (hashes != null) {
                hashes.names().stream().sorted().forEach(
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties
    --- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties	Wed Jul 05 23:09:40 2017 +0200
    @@ -45,7 +45,7 @@
     	'e' flag and manifest with the 'Main-Class' attribute cannot be specified \n\
     	 together!
     error.bad.dflag=\
    -        '-d, --print-module-descriptor' option requires no input file(s) to be specified: {0}
    +        '-d, --describe-module' option requires no input file(s) to be specified: {0}
     error.bad.reason=\
             bad reason: {0}, must be one of deprecated, deprecated-for-removal, or incubating
     error.nosuch.fileordir=\
    @@ -62,6 +62,8 @@
             Hashing module {0} dependences, unable to find module {1} on module path
     error.module.options.without.info=\
             One of --module-version or --hash-modules without module-info.class
    +error.unable.derive.automodule=\
    +        Unable to derive module descriptor for: {0}
     error.unexpected.module-info=\
             Unexpected module descriptor {0}
     error.module.descriptor.not.found=\
    @@ -129,6 +131,8 @@
             added manifest
     out.added.module-info=\
             added module-info: {0}
    +out.automodule=\
    +        No module descriptor found. Derived automatic module.
     out.update.manifest=\
             updated manifest
     out.update.module-info=\
    @@ -224,8 +228,8 @@
     \  -u, --update               Update an existing jar archive
     main.help.opt.main.extract=\
     \  -x, --extract              Extract named (or all) files from the archive
    -main.help.opt.main.print-module-descriptor=\
    -\  -d, --print-module-descriptor  Print the module descriptor
    +main.help.opt.main.describe-module=\
    +\  -d, --describe-module      Print the module descriptor, or automatic module name
     main.help.opt.any=\
     \ Operation modifiers valid in any mode:\n\
     \n\
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jcmd/share/classes/module-info.java
    --- a/jdk/src/jdk.jcmd/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jcmd/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -23,6 +23,13 @@
      * questions.
      */
     
    +/**
    + * Defines tools for diagnostics and troubleshooting a JVM,
    + * including the jcmd, jps, jstat and other diagnostics tools.
    + *
    + * @moduleGraph
    + * @since 9
    + */
     module jdk.jcmd {
         requires jdk.attach;
         requires jdk.internal.jvmstat;
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jcmd/share/classes/sun/tools/common/ProcessArgumentMatcher.java
    --- a/jdk/src/jdk.jcmd/share/classes/sun/tools/common/ProcessArgumentMatcher.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/common/ProcessArgumentMatcher.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -30,6 +30,7 @@
     import java.util.ArrayList;
     import java.util.Collection;
     import java.util.List;
    +import java.util.stream.Collectors;
     
     import com.sun.tools.attach.VirtualMachine;
     import com.sun.tools.attach.VirtualMachineDescriptor;
    @@ -145,4 +146,17 @@
             return this.getVirtualMachineDescriptors(null);
         }
     
    +    public Collection getVirtualMachinePids(Class excludeClass) {
    +        if (singlePid != null) {
    +            // There is a bug in AttachProvider, when VM is debuggee-suspended it's not listed by the AttachProvider.
    +            // If we are talking about a specific pid, just return it.
    +            return List.of(singlePid);
    +        } else {
    +            return getVMDs(excludeClass, matchClass).stream().map(x -> {return x.id();}).collect(Collectors.toList());
    +        }
    +    }
    +
    +    public Collection getVirtualMachinePids() {
    +        return this.getVirtualMachinePids(null);
    +    }
     }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jcmd/share/classes/sun/tools/jcmd/JCmd.java
    --- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jcmd/JCmd.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jcmd/JCmd.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -80,22 +80,22 @@
                 System.exit(0);
             }
     
    -        Collection vids = ap.getVirtualMachineDescriptors(JCmd.class);
    +        Collection pids = ap.getVirtualMachinePids(JCmd.class);
     
    -        if (vids.isEmpty()) {
    +        if (pids.isEmpty()) {
                 System.err.println("Could not find any processes matching : '"
                                    + arg.getProcessString() + "'");
                 System.exit(1);
             }
     
             boolean success = true;
    -        for (VirtualMachineDescriptor vid : vids) {
    -            System.out.println(vid.id() + ":");
    +        for (String pid : pids) {
    +            System.out.println(pid + ":");
                 if (arg.isListCounters()) {
    -                listCounters(vid.id());
    +                listCounters(pid);
                 } else {
                     try {
    -                    executeCommandForPid(vid.id(), arg.getCommand());
    +                    executeCommandForPid(pid, arg.getCommand());
                     } catch(AttachOperationFailedException ex) {
                         System.err.println(ex.getMessage());
                         success = false;
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jcmd/share/classes/sun/tools/jinfo/JInfo.java
    --- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jinfo/JInfo.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jinfo/JInfo.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -96,37 +96,37 @@
             String parg = args[optionCount];
     
             ProcessArgumentMatcher ap = new ProcessArgumentMatcher(parg);
    -        Collection vids = ap.getVirtualMachineDescriptors(JInfo.class);
    +        Collection pids = ap.getVirtualMachinePids(JInfo.class);
     
    -        if (vids.isEmpty()) {
    +        if (pids.isEmpty()) {
                 System.err.println("Could not find any processes matching : '" + parg + "'");
                 System.exit(1);
             }
     
    -        for (VirtualMachineDescriptor vid : vids) {
    -            if (vids.size() > 1) {
    -                System.out.println("Pid:" + vid.id());
    +        for (String pid : pids) {
    +            if (pids.size() > 1) {
    +                System.out.println("Pid:" + pid);
                 }
                 if (!doFlag && !doFlags && !doSysprops) {
                     // Print flags and sysporps if no options given
    -                sysprops(vid.id());
    +                sysprops(pid);
                     System.out.println();
    -                flags(vid.id());
    +                flags(pid);
                     System.out.println();
    -                commandLine(vid.id());
    +                commandLine(pid);
                 }
                 if (doFlag) {
                     if (flag < 0) {
                         System.err.println("Missing flag");
                         usage(1);
                     }
    -                flag(vid.id(), args[flag]);
    +                flag(pid, args[flag]);
                 }
                 if (doFlags) {
    -                flags(vid.id());
    +                flags(pid);
                 }
                 if (doSysprops) {
    -                sysprops(vid.id());
    +                sysprops(pid);
                 }
             }
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java
    --- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -91,16 +91,15 @@
             // As more options are added we should create an abstract tool class and
             // have a table to map the options
             ProcessArgumentMatcher ap = new ProcessArgumentMatcher(pidArg);
    -        Collection vids = ap.getVirtualMachineDescriptors(JMap.class);
    +        Collection pids = ap.getVirtualMachinePids(JMap.class);
     
    -        if (vids.isEmpty()) {
    +        if (pids.isEmpty()) {
                 System.err.println("Could not find any processes matching : '" + pidArg + "'");
                 System.exit(1);
             }
     
    -        for (VirtualMachineDescriptor vid : vids) {
    -            String pid = vid.id();
    -            if (vids.size() > 1) {
    +        for (String pid : pids) {
    +            if (pids.size() > 1) {
                     System.out.println("Pid:" + pid);
                 }
                 if (option.equals("-histo")) {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jcmd/share/classes/sun/tools/jstack/JStack.java
    --- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jstack/JStack.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jstack/JStack.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -84,18 +84,18 @@
                 params = new String[0];
             }
             ProcessArgumentMatcher ap = new ProcessArgumentMatcher(pidArg);
    -        Collection vids = ap.getVirtualMachineDescriptors(JStack.class);
    +        Collection pids = ap.getVirtualMachinePids(JStack.class);
     
    -        if (vids.isEmpty()) {
    +        if (pids.isEmpty()) {
                 System.err.println("Could not find any processes matching : '" + pidArg + "'");
                 System.exit(1);
             }
     
    -        for (VirtualMachineDescriptor vid : vids) {
    -            if (vids.size() > 1) {
    -                System.out.println("Pid:" + vid.id());
    +        for (String pid : pids) {
    +            if (pids.size() > 1) {
    +                System.out.println("Pid:" + pid);
                 }
    -            runThreadDump(vid.id(), params);
    +            runThreadDump(pid, params);
             }
         }
     
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jconsole/share/classes/module-info.java
    --- a/jdk/src/jdk.jconsole/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jconsole/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -23,6 +23,13 @@
      * questions.
      */
     
    +/**
    + * Defines the JMX graphical tool, jconsole, for monitoring and managing
    + * a running application.
    + *
    + * @moduleGraph
    + * @since 9
    + */
     module jdk.jconsole {
         requires transitive java.desktop;
         requires transitive java.management;
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jdi/share/classes/module-info.java
    --- a/jdk/src/jdk.jdi/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jdi/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -26,6 +26,7 @@
     /**
      * Defines the Java Debugger Interface.
      *
    + * @moduleGraph
      * @since 9
      */
     module jdk.jdi {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jdwp.agent/share/classes/module-info.java
    --- a/jdk/src/jdk.jdwp.agent/share/classes/module-info.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jdwp.agent/share/classes/module-info.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -26,6 +26,7 @@
     /**
      * Java Debug Wire Protocol.
      *
    + * @moduleGraph
      * @since 9
      */
     module jdk.jdwp.agent {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -35,8 +35,12 @@
     import java.util.Arrays;
     import java.util.LinkedList;
     import java.util.List;
    +import java.util.Locale;
     import java.util.MissingResourceException;
     import java.util.function.Predicate;
    +import java.util.stream.Collectors;
    +import java.util.stream.Stream;
    +
     import jdk.internal.jimage.BasicImageReader;
     import jdk.internal.jimage.ImageHeader;
     import jdk.internal.jimage.ImageLocation;
    @@ -99,7 +103,7 @@
         }
     
         static class OptionsValues {
    -        Task task = Task.LIST;
    +        Task task = null;
             String directory = ".";
             String include = "";
             boolean fullVersion;
    @@ -172,24 +176,31 @@
             }
     
             try {
    -            List unhandled = OPTION_HELPER.handleOptions(this, args);
    +            String command;
    +            String[] remaining = args;
    +            try {
    +                command = args[0];
    +                options.task = Enum.valueOf(Task.class, args[0].toUpperCase(Locale.ENGLISH));
    +                remaining = args.length > 1 ? Arrays.copyOfRange(args, 1, args.length)
    +                                            : new String[0];
    +            } catch (IllegalArgumentException ex) {
    +                command = null;
    +                options.task = null;
    +            }
     
    -            if(!unhandled.isEmpty()) {
    -                try {
    -                    options.task = Enum.valueOf(Task.class, unhandled.get(0).toUpperCase());
    -                } catch (IllegalArgumentException ex) {
    -                    throw TASK_HELPER.newBadArgs("err.not.a.task", unhandled.get(0));
    -                }
    +            // process arguments
    +            List unhandled = OPTION_HELPER.handleOptions(this, remaining);
    +            for (String f : unhandled) {
    +                options.jimages.add(new File(f));
    +            }
     
    -                for(int i = 1; i < unhandled.size(); i++) {
    -                    options.jimages.add(new File(unhandled.get(i)));
    -                }
    -            } else if (!options.help && !options.version && !options.fullVersion) {
    -                throw TASK_HELPER.newBadArgs("err.invalid.task", "");
    +            if (options.task == null && !options.help && !options.version && !options.fullVersion) {
    +                throw TASK_HELPER.newBadArgs("err.not.a.task",
    +                    command != null ? command : "");
                 }
     
                 if (options.help) {
    -                if (unhandled.isEmpty()) {
    +                if (options.task == null) {
                         log.println(TASK_HELPER.getMessage("main.usage", PROGNAME));
                         Arrays.asList(RECOGNIZED_OPTIONS).stream()
                             .filter(option -> !option.isHidden())
    @@ -203,15 +214,19 @@
                             log.println(TASK_HELPER.getMessage("main.usage." +
                                     options.task.toString().toLowerCase()));
                         } catch (MissingResourceException ex) {
    -                        throw TASK_HELPER.newBadArgs("err.not.a.task", unhandled.get(0));
    +                        throw TASK_HELPER.newBadArgs("err.not.a.task", command);
                         }
                     }
                     return EXIT_OK;
                 }
     
                 if (options.version || options.fullVersion) {
    +                if (options.task == null && !unhandled.isEmpty()) {
    +                    throw TASK_HELPER.newBadArgs("err.not.a.task",
    +                        Stream.of(args).collect(Collectors.joining(" ")));
    +                }
    +
                     TASK_HELPER.showVersion(options.fullVersion);
    -
                     if (unhandled.isEmpty()) {
                         return EXIT_OK;
                     }
    @@ -435,7 +450,7 @@
                     iterate(this::listTitle, null, this::verify);
                     break;
                 default:
    -                throw TASK_HELPER.newBadArgs("err.invalid.task",
    +                throw TASK_HELPER.newBadArgs("err.not.a.task",
                             options.task.name()).showUsage(true);
             }
             return true;
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -151,16 +151,8 @@
         @Override
         public void storeFiles(ResourcePool files) {
             try {
    -            // populate targetOsName field up-front because it's used elsewhere.
    -            Optional javaBase = files.moduleView().findModule("java.base");
    -            javaBase.ifPresent(mod -> {
    -                // fill release information available from transformed "java.base" module!
    -                ModuleDescriptor desc = mod.descriptor();
    -                desc.osName().ifPresent(s -> {
    -                    this.targetOsName = s;
    -                });
    -            });
    -
    +            this.targetOsName = files.moduleView().
    +                findModule("java.base").get().osName();
                 if (this.targetOsName == null) {
                     throw new PluginException("ModuleTarget attribute is missing for java.base module");
                 }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -43,6 +43,8 @@
     import java.util.stream.Stream;
     
     import jdk.internal.jimage.decompressor.Decompressor;
    +import jdk.internal.module.ModuleInfo.Attributes;
    +import jdk.internal.module.ModuleTarget;
     import jdk.tools.jlink.plugin.Plugin;
     import jdk.tools.jlink.builder.ImageBuilder;
     import jdk.tools.jlink.plugin.PluginException;
    @@ -298,6 +300,7 @@
                 final ResourcePoolModule module;
                 // lazily initialized
                 ModuleDescriptor descriptor;
    +            ModuleTarget target;
     
                 LastModule(ResourcePoolModule module) {
                     this.module = module;
    @@ -316,10 +319,28 @@
     
                 @Override
                 public ModuleDescriptor descriptor() {
    -                if (descriptor == null) {
    -                    descriptor = ResourcePoolManager.readModuleDescriptor(this);
    +                initModuleAttributes();
    +                return descriptor;
    +            }
    +
    +            @Override
    +            public String osName() {
    +                initModuleAttributes();
    +                return target != null? target.osName() : null;
    +            }
    +
    +            @Override
    +            public String osArch() {
    +                initModuleAttributes();
    +                return target != null? target.osArch() : null;
    +            }
    +
    +            private void initModuleAttributes() {
    +                if (this.descriptor == null) {
    +                    Attributes attr = ResourcePoolManager.readModuleAttributes(this);
    +                    this.descriptor = attr.descriptor();
    +                    this.target = attr.target();
                     }
    -                return descriptor;
                 }
     
                 @Override
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Jlink.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Jlink.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Jlink.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -24,6 +24,8 @@
      */
     package jdk.tools.jlink.internal;
     
    +import java.lang.module.Configuration;
    +import java.lang.module.ModuleFinder;
     import java.lang.reflect.Layer;
     import java.nio.ByteOrder;
     import java.nio.file.Path;
    @@ -33,6 +35,8 @@
     import java.util.Map;
     import java.util.Objects;
     import java.util.Set;
    +
    +import jdk.internal.module.ModulePath;
     import jdk.tools.jlink.plugin.Plugin;
     import jdk.tools.jlink.plugin.PluginException;
     import jdk.tools.jlink.builder.ImageBuilder;
    @@ -147,8 +151,8 @@
             private final Path output;
             private final Set modules;
             private final Set limitmods;
    -
             private final ByteOrder endian;
    +        private final ModuleFinder finder;
     
             /**
              * jlink configuration,
    @@ -160,31 +164,23 @@
              * @param endian Jimage byte order. Native order by default
              */
             public JlinkConfiguration(Path output,
    -                List modulepaths,
    -                Set modules,
    -                Set limitmods,
    -                ByteOrder endian) {
    -            this.output = output;
    -            this.modulepaths = modulepaths == null ? Collections.emptyList() : modulepaths;
    -            this.modules = modules == null ? Collections.emptySet() : modules;
    -            this.limitmods = limitmods == null ? Collections.emptySet() : limitmods;
    -            this.endian = endian == null ? ByteOrder.nativeOrder() : endian;
    -        }
    +                                  List modulepaths,
    +                                  Set modules,
    +                                  Set limitmods,
    +                                  ByteOrder endian) {
    +            if (Objects.requireNonNull(modulepaths).isEmpty()) {
    +                throw new IllegalArgumentException("Empty module path");
    +            }
    +            if (Objects.requireNonNull(modules).isEmpty()) {
    +                throw new IllegalArgumentException("Empty modules");
    +            }
     
    -        /**
    -         * jlink configuration,
    -         *
    -         * @param output Output directory, must not exist.
    -         * @param modulepaths Modules paths
    -         * @param modules Root modules to resolve
    -         * @param limitmods Limit the universe of observable modules
    -         */
    -        public JlinkConfiguration(Path output,
    -                List modulepaths,
    -                Set modules,
    -                Set limitmods) {
    -            this(output, modulepaths, modules, limitmods,
    -                    ByteOrder.nativeOrder());
    +            this.output = output;
    +            this.modulepaths = modulepaths;
    +            this.modules = modules;
    +            this.limitmods = Objects.requireNonNull(limitmods);
    +            this.endian = Objects.requireNonNull(endian);
    +            this.finder = moduleFinder();
             }
     
             /**
    @@ -222,6 +218,45 @@
                 return limitmods;
             }
     
    +        /**
    +         * Returns {@link ModuleFinder} that finds all observable modules
    +         * for this jlink configuration.
    +         */
    +        public ModuleFinder finder() {
    +            return finder;
    +        }
    +
    +        /**
    +         * Returns a {@link Configuration} of the given module path,
    +         * root modules with full service binding.
    +         */
    +        public Configuration resolveAndBind()
    +        {
    +            return Configuration.empty().resolveAndBind(finder,
    +                                                        ModuleFinder.of(),
    +                                                        modules);
    +        }
    +
    +        /**
    +         * Returns a {@link Configuration} of the given module path,
    +         * root modules with no service binding.
    +         */
    +        public Configuration resolve()
    +        {
    +            return Configuration.empty().resolve(finder,
    +                                                 ModuleFinder.of(),
    +                                                 modules);
    +        }
    +
    +        private ModuleFinder moduleFinder() {
    +            Path[] entries = modulepaths.toArray(new Path[0]);
    +            ModuleFinder finder = ModulePath.of(Runtime.version(), true, entries);
    +            if (!limitmods.isEmpty()) {
    +                finder = JlinkTask.limitFinder(finder, limitmods, modules);
    +            }
    +            return finder;
    +        }
    +
             @Override
             public String toString() {
                 StringBuilder builder = new StringBuilder();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -54,7 +54,6 @@
     import jdk.tools.jlink.plugin.PluginException;
     import jdk.tools.jlink.builder.DefaultImageBuilder;
     import jdk.tools.jlink.plugin.Plugin;
    -import jdk.internal.module.Checks;
     import jdk.internal.module.ModulePath;
     import jdk.internal.module.ModuleResolution;
     
    @@ -111,6 +110,12 @@
                 Path path = Paths.get(arg);
                 task.options.output = path;
             }, "--output"),
    +        new Option(false, (task, opt, arg) -> {
    +            task.options.bindServices = true;
    +        }, "--bind-services"),
    +        new Option(false, (task, opt, arg) -> {
    +            task.options.suggestProviders = true;
    +        }, "--suggest-providers", "", true),
             new Option(true, (task, opt, arg) -> {
                 String[] values = arg.split("=");
                 // check values
    @@ -142,6 +147,9 @@
                 }
             }, "--endian"),
             new Option(false, (task, opt, arg) -> {
    +            task.options.verbose = true;
    +        }, "--verbose", "-v"),
    +        new Option(false, (task, opt, arg) -> {
                 task.options.version = true;
             }, "--version"),
             new Option(true, (task, opt, arg) -> {
    @@ -186,6 +194,7 @@
         static class OptionsValues {
             boolean help;
             String  saveoptsfile;
    +        boolean verbose;
             boolean version;
             boolean fullVersion;
             final List modulePath = new ArrayList<>();
    @@ -196,6 +205,8 @@
             Path packagedModulesPath;
             ByteOrder endian = ByteOrder.nativeOrder();
             boolean ignoreSigning = false;
    +        boolean bindServices = false;
    +        boolean suggestProviders = false;
         }
     
         int run(String[] args) {
    @@ -204,7 +215,11 @@
                        new PrintWriter(System.err, true));
             }
             try {
    -            optionsHelper.handleOptionsNoUnhandled(this, args);
    +            List remaining = optionsHelper.handleOptions(this, args);
    +            if (remaining.size() > 0 && !options.suggestProviders) {
    +                throw taskHelper.newBadArgs("err.orphan.arguments", toString(remaining))
    +                                .showUsage(true);
    +            }
                 if (options.help) {
                     optionsHelper.showHelp(PROGNAME);
                     return EXIT_OK;
    @@ -218,17 +233,24 @@
                     return EXIT_OK;
                 }
     
    -            if (taskHelper.getExistingImage() == null) {
    -                if (options.modulePath.isEmpty()) {
    -                    throw taskHelper.newBadArgs("err.modulepath.must.be.specified").showUsage(true);
    -                }
    -                createImage();
    -            } else {
    +            if (taskHelper.getExistingImage() != null) {
                     postProcessOnly(taskHelper.getExistingImage());
    +                return EXIT_OK;
                 }
     
    -            if (options.saveoptsfile != null) {
    -                Files.write(Paths.get(options.saveoptsfile), getSaveOpts().getBytes());
    +            if (options.modulePath.isEmpty()) {
    +                throw taskHelper.newBadArgs("err.modulepath.must.be.specified")
    +                                .showUsage(true);
    +            }
    +
    +            JlinkConfiguration config = initJlinkConfig();
    +            if (options.suggestProviders) {
    +                suggestProviders(config, remaining);
    +            } else {
    +                createImage(config);
    +                if (options.saveoptsfile != null) {
    +                    Files.write(Paths.get(options.saveoptsfile), getSaveOpts().getBytes());
    +                }
                 }
     
                 return EXIT_OK;
    @@ -267,25 +289,13 @@
             Objects.requireNonNull(config.getOutput());
             plugins = plugins == null ? new PluginsConfiguration() : plugins;
     
    -        if (config.getModulepaths().isEmpty()) {
    -            throw new IllegalArgumentException("Empty module paths");
    -        }
    -
    -        ModuleFinder finder = newModuleFinder(config.getModulepaths(),
    -                                              config.getLimitmods(),
    -                                              config.getModules());
    -
    -        if (config.getModules().isEmpty()) {
    -            throw new IllegalArgumentException("No modules to add");
    -        }
    -
             // First create the image provider
             ImageProvider imageProvider =
    -                createImageProvider(finder,
    -                                    config.getModules(),
    -                                    config.getByteOrder(),
    +                createImageProvider(config,
                                         null,
                                         IGNORE_SIGNING_DEFAULT,
    +                                    false,
    +                                    false,
                                         null);
     
             // Then create the Plugin Stack
    @@ -320,20 +330,24 @@
     
         // the token for "all modules on the module path"
         private static final String ALL_MODULE_PATH = "ALL-MODULE-PATH";
    -    private void createImage() throws Exception {
    -        if (options.output == null) {
    -            throw taskHelper.newBadArgs("err.output.must.be.specified").showUsage(true);
    -        }
    -
    +    private JlinkConfiguration initJlinkConfig() throws BadArgs {
             if (options.addMods.isEmpty()) {
                 throw taskHelper.newBadArgs("err.mods.must.be.specified", "--add-modules")
    -                    .showUsage(true);
    +                .showUsage(true);
             }
     
             Set roots = new HashSet<>();
             for (String mod : options.addMods) {
                 if (mod.equals(ALL_MODULE_PATH)) {
    -                ModuleFinder finder = modulePathFinder();
    +                Path[] entries = options.modulePath.toArray(new Path[0]);
    +                ModuleFinder finder = ModulePath.of(Runtime.version(), true, entries);
    +                if (!options.limitMods.isEmpty()) {
    +                    // finder for the observable modules specified in
    +                    // the --module-path and --limit-modules options
    +                    finder = limitFinder(finder, options.limitMods, Collections.emptySet());
    +                }
    +
    +                // all observable modules are roots
                     finder.findAll()
                           .stream()
                           .map(ModuleReference::descriptor)
    @@ -344,40 +358,34 @@
                 }
             }
     
    -        ModuleFinder finder = newModuleFinder(options.modulePath,
    -                                              options.limitMods,
    -                                              roots);
    +        return new JlinkConfiguration(options.output,
    +                                      options.modulePath,
    +                                      roots,
    +                                      options.limitMods,
    +                                      options.endian);
    +    }
     
    +    private void createImage(JlinkConfiguration config) throws Exception {
    +        if (options.output == null) {
    +            throw taskHelper.newBadArgs("err.output.must.be.specified").showUsage(true);
    +        }
     
             // First create the image provider
    -        ImageProvider imageProvider = createImageProvider(finder,
    -                                                          roots,
    -                                                          options.endian,
    +        ImageProvider imageProvider = createImageProvider(config,
                                                               options.packagedModulesPath,
                                                               options.ignoreSigning,
    +                                                          options.bindServices,
    +                                                          options.verbose,
                                                               log);
     
             // Then create the Plugin Stack
    -        ImagePluginStack stack = ImagePluginConfiguration.
    -                parseConfiguration(taskHelper.getPluginsConfig(options.output, options.launchers));
    +        ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(
    +            taskHelper.getPluginsConfig(options.output, options.launchers));
     
             //Ask the stack to proceed
             stack.operate(imageProvider);
         }
     
    -    /**
    -     * Returns a module finder to find the observable modules specified in
    -     * the --module-path and --limit-modules options
    -     */
    -    private ModuleFinder modulePathFinder() {
    -        Path[] entries = options.modulePath.toArray(new Path[0]);
    -        ModuleFinder finder = ModulePath.of(Runtime.version(), true, entries);
    -        if (!options.limitMods.isEmpty()) {
    -            finder = limitFinder(finder, options.limitMods, Collections.emptySet());
    -        }
    -        return finder;
    -    }
    -
         /*
          * Returns a module finder of the given module path that limits
          * the observable modules to those in the transitive closure of
    @@ -406,29 +414,32 @@
             return Paths.get(uri);
         }
     
    -    private static ImageProvider createImageProvider(ModuleFinder finder,
    -                                                     Set roots,
    -                                                     ByteOrder order,
    +
    +    private static ImageProvider createImageProvider(JlinkConfiguration config,
                                                          Path retainModulesPath,
                                                          boolean ignoreSigning,
    +                                                     boolean bindService,
    +                                                     boolean verbose,
                                                          PrintWriter log)
                 throws IOException
         {
    -        if (roots.isEmpty()) {
    -            throw new IllegalArgumentException("empty modules and limitmods");
    -        }
    +        Configuration cf = bindService ? config.resolveAndBind()
    +                                       : config.resolve();
     
    -        Configuration cf = Configuration.empty()
    -                .resolve(finder,
    -                         ModuleFinder.of(),
    -                         roots);
    +        if (verbose && log != null) {
    +            // print modules to be linked in
    +            cf.modules().stream()
    +              .sorted(Comparator.comparing(ResolvedModule::name))
    +              .forEach(rm -> log.format("module %s (%s)%n",
    +                                        rm.name(), rm.reference().location().get()));
     
    -        // emit warning for modules that end with a digit
    -        cf.modules().stream()
    -            .map(ResolvedModule::name)
    -            .filter(mn -> !Checks.hasLegalModuleNameLastCharacter(mn))
    -            .forEach(mn -> System.err.println("WARNING: Module name \""
    -                                              + mn + "\" may soon be illegal"));
    +            // print provider info
    +            Set references = cf.modules().stream()
    +                .map(ResolvedModule::reference).collect(Collectors.toSet());
    +
    +            String msg = String.format("%n%s:", taskHelper.getMessage("providers.header"));
    +            printProviders(log, msg, references);
    +        }
     
             // emit a warning for any incubating modules in the configuration
             if (log != null) {
    @@ -446,16 +457,16 @@
     
             Map mods = cf.modules().stream()
                 .collect(Collectors.toMap(ResolvedModule::name, JlinkTask::toPathLocation));
    -        return new ImageHelper(cf, mods, order, retainModulesPath, ignoreSigning);
    +        return new ImageHelper(cf, mods, config.getByteOrder(), retainModulesPath, ignoreSigning);
         }
     
         /*
          * Returns a ModuleFinder that limits observability to the given root
          * modules, their transitive dependences, plus a set of other modules.
          */
    -    private static ModuleFinder limitFinder(ModuleFinder finder,
    -                                            Set roots,
    -                                            Set otherMods) {
    +    public static ModuleFinder limitFinder(ModuleFinder finder,
    +                                           Set roots,
    +                                           Set otherMods) {
     
             // resolve all root modules
             Configuration cf = Configuration.empty()
    @@ -492,6 +503,147 @@
             };
         }
     
    +    /*
    +     * Returns a map of each service type to the modules that use it
    +     */
    +    private static Map> uses(Set modules) {
    +        // collects the services used by the modules and print uses
    +        Map> uses = new HashMap<>();
    +        modules.stream()
    +               .map(ModuleReference::descriptor)
    +               .forEach(md -> md.uses().forEach(s ->
    +                   uses.computeIfAbsent(s, _k -> new HashSet<>()).add(md.name()))
    +               );
    +        return uses;
    +    }
    +
    +    private static void printProviders(PrintWriter log,
    +                                       String header,
    +                                       Set modules) {
    +        printProviders(log, header, modules, uses(modules));
    +    }
    +
    +    /*
    +     * Prints the providers that are used by the services specified in
    +     * the given modules.
    +     *
    +     * The specified uses maps a service type name to the modules
    +     * using the service type and that may or may not be present
    +     * the given modules.
    +     */
    +    private static void printProviders(PrintWriter log,
    +                                       String header,
    +                                       Set modules,
    +                                       Map> uses) {
    +        if (modules.isEmpty())
    +            return;
    +
    +        // Build a map of a service type to the provider modules
    +        Map> providers = new HashMap<>();
    +        modules.stream()
    +            .map(ModuleReference::descriptor)
    +            .forEach(md -> {
    +                md.provides().stream()
    +                  .filter(p -> uses.containsKey(p.service()))
    +                  .forEach(p -> providers.computeIfAbsent(p.service(), _k -> new HashSet<>())
    +                                         .add(md));
    +            });
    +
    +        if (!providers.isEmpty()) {
    +            log.println(header);
    +        }
    +
    +        // print the providers of the service types used by the specified modules
    +        // sorted by the service type name and then provider's module name
    +        providers.entrySet().stream()
    +            .sorted(Map.Entry.comparingByKey())
    +            .forEach(e -> {
    +                String service = e.getKey();
    +                e.getValue().stream()
    +                 .sorted(Comparator.comparing(ModuleDescriptor::name))
    +                 .forEach(md ->
    +                     md.provides().stream()
    +                       .filter(p -> p.service().equals(service))
    +                       .forEach(p -> log.format("  module %s provides %s, used by %s%n",
    +                                                md.name(), p.service(),
    +                                                uses.get(p.service()).stream()
    +                                                    .sorted()
    +                                                    .collect(Collectors.joining(","))))
    +                 );
    +            });
    +    }
    +
    +    private void suggestProviders(JlinkConfiguration config, List args)
    +        throws BadArgs
    +    {
    +        if (args.size() > 1) {
    +            throw taskHelper.newBadArgs("err.orphan.argument",
    +                                        toString(args.subList(1, args.size())))
    +                            .showUsage(true);
    +        }
    +
    +        if (options.bindServices) {
    +            log.println(taskHelper.getMessage("no.suggested.providers"));
    +            return;
    +        }
    +
    +        ModuleFinder finder = config.finder();
    +        if (args.isEmpty()) {
    +            // print providers used by the modules resolved without service binding
    +            Configuration cf = config.resolve();
    +            Set mrefs = cf.modules().stream()
    +                .map(ResolvedModule::reference)
    +                .collect(Collectors.toSet());
    +
    +            // print uses of the modules that would be linked into the image
    +            mrefs.stream()
    +                 .sorted(Comparator.comparing(mref -> mref.descriptor().name()))
    +                 .forEach(mref -> {
    +                     ModuleDescriptor md = mref.descriptor();
    +                     log.format("module %s located (%s)%n", md.name(),
    +                                mref.location().get());
    +                     md.uses().stream().sorted()
    +                       .forEach(s -> log.format("    uses %s%n", s));
    +                 });
    +
    +            String msg = String.format("%n%s:", taskHelper.getMessage("suggested.providers.header"));
    +            printProviders(log, msg, finder.findAll(), uses(mrefs));
    +
    +        } else {
    +            // comma-separated service types, if specified
    +            Set names = Stream.of(args.get(0).split(","))
    +                .collect(Collectors.toSet());
    +            // find the modules that provide the specified service
    +            Set mrefs = finder.findAll().stream()
    +                .filter(mref -> mref.descriptor().provides().stream()
    +                                    .map(ModuleDescriptor.Provides::service)
    +                                    .anyMatch(names::contains))
    +                .collect(Collectors.toSet());
    +
    +            // the specified services may or may not be in the modules that
    +            // would be linked in.  So find uses declared in all observable modules
    +            Map> uses = uses(finder.findAll());
    +
    +            // check if any name given on the command line are unused service
    +            mrefs.stream()
    +                 .flatMap(mref -> mref.descriptor().provides().stream()
    +                                      .map(ModuleDescriptor.Provides::service))
    +                 .forEach(names::remove);
    +            if (!names.isEmpty()) {
    +                log.println(taskHelper.getMessage("warn.unused.services",
    +                                                  toString(names)));
    +            }
    +
    +            String msg = String.format("%n%s:", taskHelper.getMessage("suggested.providers.header"));
    +            printProviders(log, msg, mrefs, uses);
    +        }
    +    }
    +
    +    private static String toString(Collection collection) {
    +        return collection.stream().sorted()
    +                         .collect(Collectors.joining(","));
    +    }
    +
         private String getSaveOpts() {
             StringBuilder sb = new StringBuilder();
             sb.append('#').append(new Date()).append("\n");
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolConfiguration.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolConfiguration.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolConfiguration.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -66,9 +66,6 @@
     
             md.version().ifPresent(builder::version);
             md.mainClass().ifPresent(builder::mainClass);
    -        md.osName().ifPresent(builder::osName);
    -        md.osArch().ifPresent(builder::osArch);
    -        md.osVersion().ifPresent(builder::osVersion);
     
             return builder.build();
         }
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolManager.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolManager.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolManager.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -35,7 +35,10 @@
     import java.util.Set;
     import java.util.stream.Stream;
     import jdk.internal.jimage.decompressor.CompressedResourceHeader;
    -import jdk.internal.loader.ResourceHelper;
    +import jdk.internal.module.Resources;
    +import jdk.internal.module.ModuleInfo;
    +import jdk.internal.module.ModuleInfo.Attributes;
    +import jdk.internal.module.ModuleTarget;
     import jdk.tools.jlink.plugin.ResourcePool;
     import jdk.tools.jlink.plugin.ResourcePoolBuilder;
     import jdk.tools.jlink.plugin.ResourcePoolEntry;
    @@ -47,8 +50,8 @@
      * A manager for pool of resources.
      */
     public class ResourcePoolManager {
    -    // utility to read ModuleDescriptor of the given ResourcePoolModule
    -    static ModuleDescriptor readModuleDescriptor(ResourcePoolModule mod) {
    +    // utility to read Module Attributes of the given ResourcePoolModule
    +    static Attributes readModuleAttributes(ResourcePoolModule mod) {
             String p = "/" + mod.name() + "/module-info.class";
             Optional content = mod.findEntry(p);
             if (!content.isPresent()) {
    @@ -57,9 +60,9 @@
             }
             ByteBuffer bb = ByteBuffer.wrap(content.get().contentBytes());
             try {
    -            return ModuleDescriptor.read(bb);
    +            return ModuleInfo.read(bb, null);
             } catch (RuntimeException re) {
    -            throw new RuntimeException("module descriptor cannot be read for " + mod.name(), re);
    +            throw new RuntimeException("module info cannot be read for " + mod.name(), re);
             }
         }
     
    @@ -68,7 +71,7 @@
          */
         public static boolean isNamedPackageResource(String path) {
             return (path.endsWith(".class") && !path.endsWith("module-info.class")) ||
    -                !ResourceHelper.isSimpleResource(path);
    +                Resources.canEncapsulate(path);
         }
     
         class ResourcePoolModuleImpl implements ResourcePoolModule {
    @@ -76,6 +79,8 @@
             final Map moduleContent = new LinkedHashMap<>();
             // lazily initialized
             private ModuleDescriptor descriptor;
    +        private ModuleTarget target;
    +
             final String name;
     
             private ResourcePoolModuleImpl(String name) {
    @@ -100,10 +105,28 @@
     
             @Override
             public ModuleDescriptor descriptor() {
    -            if (descriptor == null) {
    -                descriptor = readModuleDescriptor(this);
    +            initModuleAttributes();
    +            return descriptor;
    +        }
    +
    +        @Override
    +        public String osName() {
    +            initModuleAttributes();
    +            return target != null? target.osName() : null;
    +        }
    +
    +        @Override
    +        public String osArch() {
    +            initModuleAttributes();
    +            return target != null? target.osArch() : null;
    +        }
    +
    +        private void initModuleAttributes() {
    +            if (this.descriptor == null) {
    +                Attributes attr = readModuleAttributes(this);
    +                this.descriptor = attr.descriptor();
    +                this.target = attr.target();
                 }
    -            return descriptor;
             }
     
             @Override
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -46,6 +46,7 @@
     import java.util.MissingResourceException;
     import java.util.ResourceBundle;
     import java.util.Set;
    +import java.util.stream.Collectors;
     import java.util.stream.Stream;
     
     import jdk.tools.jlink.internal.plugins.ExcludeJmodSectionPlugin;
    @@ -101,8 +102,15 @@
             final boolean hidden;
             final String name;
             final String shortname;
    +        final boolean terminalOption;
     
    -        public Option(boolean hasArg, Processing processing, boolean hidden, String name, String shortname) {
    +        public Option(boolean hasArg,
    +                      Processing processing,
    +                      boolean hidden,
    +                      String name,
    +                      String shortname,
    +                      boolean isTerminal)
    +        {
                 if (!name.startsWith("--")) {
                     throw new RuntimeException("option name missing --, " + name);
                 }
    @@ -115,24 +123,33 @@
                 this.hidden = hidden;
                 this.name = name;
                 this.shortname = shortname;
    +            this.terminalOption = isTerminal;
    +        }
    +
    +        public Option(boolean hasArg, Processing processing, String name, String shortname, boolean isTerminal) {
    +            this(hasArg, processing, false, name, shortname, isTerminal);
             }
     
             public Option(boolean hasArg, Processing processing, String name, String shortname) {
    -            this(hasArg, processing, false, name, shortname);
    +            this(hasArg, processing, false, name, shortname, false);
             }
     
             public Option(boolean hasArg, Processing processing, boolean hidden, String name) {
    -            this(hasArg, processing, hidden, name, "");
    +            this(hasArg, processing, hidden, name, "", false);
             }
     
             public Option(boolean hasArg, Processing processing, String name) {
    -            this(hasArg, processing, false, name, "");
    +            this(hasArg, processing, false, name, "", false);
             }
     
             public boolean isHidden() {
                 return hidden;
             }
     
    +        public boolean isTerminal() {
    +            return terminalOption;
    +        }
    +
             public boolean matches(String opt) {
                 return opt.equals(name) ||
                        opt.equals(shortname) ||
    @@ -179,12 +196,12 @@
         private static class PluginOption extends Option {
             public PluginOption(boolean hasArg,
                     Processing processing, boolean hidden, String name, String shortname) {
    -            super(hasArg, processing, hidden, name, shortname);
    +            super(hasArg, processing, hidden, name, shortname, false);
             }
     
             public PluginOption(boolean hasArg,
                     Processing processing, boolean hidden, String name) {
    -            super(hasArg, processing, hidden, name, "");
    +            super(hasArg, processing, hidden, name, "", false);
             }
     
             public String resourcePrefix() {
    @@ -498,21 +515,13 @@
                 return null;
             }
     
    -        // used by jimage. Return unhandled arguments like "create", "describe".
    +        /**
    +         * Handles all options.  This method stops processing the argument
    +         * at the first non-option argument i.e. not starts with `-`, or
    +         * at the first terminal option and returns the remaining arguments,
    +         * if any.
    +         */
             public List handleOptions(T task, String[] args) throws BadArgs {
    -            return handleOptions(task, args, true);
    -        }
    -
    -        // used by jlink. No unhandled arguments like "create", "describe".
    -        void handleOptionsNoUnhandled(T task, String[] args) throws BadArgs {
    -            handleOptions(task, args, false);
    -        }
    -
    -        // shared code that handles options for both jlink and jimage. jimage uses arguments like
    -        // "create", "describe" etc. as "task names". Those arguments are unhandled here and returned
    -        // as "unhandled arguments list". jlink does not want such arguments. "collectUnhandled" flag
    -        // tells whether to allow for unhandled arguments or not.
    -        private List handleOptions(T task, String[] args, boolean collectUnhandled) throws BadArgs {
                 // findbugs warning, copy instead of keeping a reference.
                 command = Arrays.copyOf(args, args.length);
     
    @@ -521,7 +530,6 @@
                 // Unit tests can call Task multiple time in same JVM.
                 pluginOptions = new PluginsHelper(null);
     
    -            List rest = collectUnhandled? new ArrayList<>() : null;
                 // process options
                 for (int i = 0; i < args.length; i++) {
                     if (args[i].startsWith("-")) {
    @@ -531,7 +539,6 @@
                         if (option == null) {
                             pluginOption = pluginOptions.getOption(name);
                             if (pluginOption == null) {
    -
                                 throw new BadArgs("err.unknown.option", name).
                                         showUsage(true);
                             }
    @@ -556,20 +563,23 @@
                             pluginOption.process(pluginOptions, name, param);
                         } else {
                             option.process(task, name, param);
    +                        if (option.isTerminal()) {
    +                            return ++i < args.length
    +                                        ? Stream.of(Arrays.copyOfRange(args, i, args.length))
    +                                                .collect(Collectors.toList())
    +                                        : Collections.emptyList();
    +
    +                        }
                         }
                         if (opt.ignoreRest()) {
                             i = args.length;
                         }
                     } else {
    -                    if (collectUnhandled) {
    -                        rest.add(args[i]);
    -                    } else {
    -                        throw new BadArgs("err.orphan.argument", args[i]).
    -                            showUsage(true);
    -                    }
    +                    return Stream.of(Arrays.copyOfRange(args, i, args.length))
    +                                 .collect(Collectors.toList());
                     }
                 }
    -            return rest;
    +            return Collections.emptyList();
             }
     
             private Option getOption(String name) {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
    + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
      * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      *
      * This code is free software; you can redistribute it and/or modify it
    @@ -34,6 +34,7 @@
     import java.io.File;
     import java.io.IOException;
     import java.lang.module.ModuleFinder;
    +import java.nio.ByteOrder;
     import java.nio.file.Path;
     import java.util.ArrayList;
     import java.util.Collections;
    @@ -93,9 +94,12 @@
     
         public void build() throws IOException {
             // jlink main arguments
    -        Jlink.JlinkConfiguration jlinkConfig = new Jlink.JlinkConfiguration(
    -            new File("").toPath(), // Unused
    -            modulePath, addModules, limitModules);
    +        Jlink.JlinkConfiguration jlinkConfig =
    +            new Jlink.JlinkConfiguration(new File("").toPath(), // Unused
    +                                         modulePath,
    +                                         addModules,
    +                                         limitModules,
    +                                         ByteOrder.nativeOrder());
     
             // plugin configuration
             List plugins = new ArrayList();
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -115,7 +115,7 @@
         @Override
         public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
             ResourcePoolModule javaBase = in.moduleView().findModule("java.base").get();
    -        String[] jvmlibs = jvmlibs(javaBase.descriptor().osName().get());
    +        String[] jvmlibs = jvmlibs(javaBase.osName());
             TreeSet existing = new TreeSet<>(new JvmComparator());
             TreeSet removed = new TreeSet<>(new JvmComparator());
             if (!keepAll) {
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -137,15 +137,13 @@
             javaBase.ifPresent(mod -> {
                 // fill release information available from transformed "java.base" module!
                 ModuleDescriptor desc = mod.descriptor();
    -            desc.osName().ifPresent(s -> {
    -                release.put("OS_NAME", quote(s));
    -            });
    -            desc.osVersion().ifPresent(s -> release.put("OS_VERSION", quote(s)));
    -            desc.osArch().ifPresent(s -> release.put("OS_ARCH", quote(s)));
                 desc.version().ifPresent(s -> release.put("JAVA_VERSION",
                         quote(parseVersion(s.toString()))));
                 desc.version().ifPresent(s -> release.put("JAVA_FULL_VERSION",
                         quote(s.toString())));
    +
    +            release.put("OS_NAME", quote(mod.osName()));
    +            release.put("OS_ARCH", quote(mod.osArch()));
             });
     
             // put topological sorted module names separated by space
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -52,6 +52,7 @@
     import jdk.internal.module.ModuleInfo.Attributes;
     import jdk.internal.module.ModuleInfoExtender;
     import jdk.internal.module.ModuleResolution;
    +import jdk.internal.module.ModuleTarget;
     import jdk.internal.module.SystemModules;
     import jdk.internal.org.objectweb.asm.Attribute;
     import jdk.internal.org.objectweb.asm.ClassReader;
    @@ -206,12 +207,12 @@
                 // add ModulePackages attribute if this module contains some packages
                 // and ModulePackages is not present
                 this.addModulePackages = packages.size() > 0 && !hasModulePackages();
    +
                 // drop target attribute only if any OS property is present
    -            if (dropModuleTarget) {
    -                this.dropModuleTarget =
    -                    descriptor.osName().isPresent() ||
    -                    descriptor.osArch().isPresent() ||
    -                    descriptor.osVersion().isPresent();
    +            ModuleTarget target = attrs.target();
    +            if (dropModuleTarget && target != null) {
    +                this.dropModuleTarget = (target.osName() != null)
    +                                        || (target.osArch() != null);
                 } else {
                     this.dropModuleTarget = false;
                 }
    @@ -230,6 +231,10 @@
                 return packages;
             }
     
    +        ModuleTarget target() {
    +            return attrs.target();
    +        }
    +
             ModuleHashes recordedHashes() {
                 return attrs.recordedHashes();
             }
    @@ -372,7 +377,7 @@
                 }
     
                 void dropModuleTarget() {
    -                extender.targetPlatform("", "", "");
    +                extender.targetPlatform("", "");
                 }
     
                 byte[] getBytes() throws IOException {
    @@ -399,6 +404,10 @@
                 "java/lang/module/ModuleDescriptor$Exports$Modifier";
             private static final String OPENS_MODIFIER_CLASSNAME =
                 "java/lang/module/ModuleDescriptor$Opens$Modifier";
    +        private static final String MODULE_TARGET_CLASSNAME  =
    +            "jdk/internal/module/ModuleTarget";
    +        private static final String MODULE_TARGET_ARRAY_SIGNATURE  =
    +            "[Ljdk/internal/module/ModuleTarget;";
             private static final String MODULE_HASHES_ARRAY_SIGNATURE  =
                 "[Ljdk/internal/module/ModuleHashes;";
             private static final String MODULE_RESOLUTION_CLASSNAME  =
    @@ -414,6 +423,7 @@
     
             private final int BUILDER_VAR    = 0;
             private final int MD_VAR         = 1;  // variable for ModuleDescriptor
    +        private final int MT_VAR         = 1;  // variable for ModuleTarget
             private final int MH_VAR         = 1;  // variable for ModuleHashes
             private int nextLocalVar         = 2;  // index to next local variable
     
    @@ -515,11 +525,10 @@
                 if (entry.moduleName().equals("java.base")) {
                     moduleInfo = new ModuleInfo(entry.contentBytes(), packages, false);
                     ModuleDescriptor md = moduleInfo.descriptor;
    -                // drop Moduletarget attribute only if java.base has all OS properties
    -                // otherwise, retain it
    -                if (dropModuleTarget &&
    -                        md.osName().isPresent() && md.osArch().isPresent() &&
    -                        md.osVersion().isPresent()) {
    +                // drop ModuleTarget attribute if java.base has all OS properties
    +                ModuleTarget target = moduleInfo.target();
    +                if (dropModuleTarget
    +                    && (target.osName() != null) && (target.osArch() != null)) {
                         dropModuleTarget = true;
                     } else {
                         dropModuleTarget = false;
    @@ -584,15 +593,20 @@
     
                 // generate SystemModules::descriptors
                 genDescriptorsMethod();
    +
    +            // generate SystemModules::targets
    +            genTargetsMethod();
    +
                 // generate SystemModules::hashes
                 genHashesMethod();
    +
                 // generate SystemModules::moduleResolutions
                 genModuleResolutionsMethod();
     
                 return cw;
             }
     
    -        /*
    +        /**
              * Generate bytecode for SystemModules::descriptors method
              */
             private void genDescriptorsMethod() {
    @@ -616,10 +630,47 @@
                 mv.visitInsn(ARETURN);
                 mv.visitMaxs(0, 0);
                 mv.visitEnd();
    -
             }
     
    -        /*
    +        /**
    +         * Generate bytecode for SystemModules::targets method
    +         */
    +        private void genTargetsMethod() {
    +            MethodVisitor mv = cw.visitMethod(ACC_PUBLIC+ACC_STATIC,
    +                                              "targets",
    +                                              "()" + MODULE_TARGET_ARRAY_SIGNATURE,
    +                                              "()" + MODULE_TARGET_ARRAY_SIGNATURE,
    +                                              null);
    +            mv.visitCode();
    +            pushInt(mv, moduleInfos.size());
    +            mv.visitTypeInsn(ANEWARRAY, MODULE_TARGET_CLASSNAME);
    +            mv.visitVarInsn(ASTORE, MT_VAR);
    +
    +            for (int index=0; index < moduleInfos.size(); index++) {
    +                ModuleInfo minfo = moduleInfos.get(index);
    +                if (minfo.target() != null && !minfo.dropModuleTarget) {
    +                    mv.visitVarInsn(ALOAD, MT_VAR);
    +                    pushInt(mv, index);
    +
    +                    // new ModuleTarget(String, String)
    +                    mv.visitTypeInsn(NEW, MODULE_TARGET_CLASSNAME);
    +                    mv.visitInsn(DUP);
    +                    mv.visitLdcInsn(minfo.target().osName());
    +                    mv.visitLdcInsn(minfo.target().osArch());
    +                    mv.visitMethodInsn(INVOKESPECIAL, MODULE_TARGET_CLASSNAME,
    +                        "", "(Ljava/lang/String;Ljava/lang/String;)V", false);
    +
    +                    mv.visitInsn(AASTORE);
    +                }
    +            }
    +
    +            mv.visitVarInsn(ALOAD, MT_VAR);
    +            mv.visitInsn(ARETURN);
    +            mv.visitMaxs(0, 0);
    +            mv.visitEnd();
    +        }
    +
    +        /**
              * Generate bytecode for SystemModules::hashes method
              */
             private void genHashesMethod() {
    @@ -647,10 +698,9 @@
                 hmv.visitInsn(ARETURN);
                 hmv.visitMaxs(0, 0);
                 hmv.visitEnd();
    -
             }
     
    -        /*
    +        /**
              * Generate bytecode for SystemModules::methodResoultions method
              */
             private void genModuleResolutionsMethod() {
    @@ -749,6 +799,7 @@
                 final ModuleDescriptor md;
                 final Set packages;
                 final int index;
    +
                 ModuleDescriptorBuilder(ModuleDescriptor md, Set packages, int index) {
                     if (md.isAutomatic()) {
                         throw new InternalError("linking automatic module is not supported");
    @@ -786,11 +837,6 @@
                     // main class
                     md.mainClass().ifPresent(this::mainClass);
     
    -                // os name, arch, version
    -                targetPlatform(md.osName().orElse(null),
    -                               md.osArch().orElse(null),
    -                               md.osVersion().orElse(null));
    -
                     putModuleDescriptor();
                 }
     
    @@ -1088,25 +1134,6 @@
                     mv.visitInsn(POP);
                 }
     
    -            /*
    -             * Invoke Builder.osName(String name)
    -             *        Builder.osArch(String arch)
    -             *        Builder.osVersion(String version)
    -             */
    -            void targetPlatform(String osName, String osArch, String osVersion) {
    -                if (osName != null) {
    -                    invokeBuilderMethod("osName", osName);
    -                }
    -
    -                if (osArch != null) {
    -                    invokeBuilderMethod("osArch", osArch);
    -                }
    -
    -                if (osVersion != null) {
    -                    invokeBuilderMethod("osVersion", osVersion);
    -                }
    -            }
    -
                 void invokeBuilderMethod(String methodName, String value) {
                     mv.visitVarInsn(ALOAD, BUILDER_VAR);
                     mv.visitLdcInsn(value);
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ResourcePoolModule.java
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ResourcePoolModule.java	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/ResourcePoolModule.java	Wed Jul 05 23:09:40 2017 +0200
    @@ -28,6 +28,7 @@
     import java.util.Optional;
     import java.util.Set;
     import java.util.stream.Stream;
    +import jdk.internal.module.ModuleTarget;
     
     /**
       * Link-time representation of a module.
    @@ -57,6 +58,20 @@
         public ModuleDescriptor descriptor();
     
         /**
    +     * The module target OS name for this module.
    +     *
    +     * @return The module target OS name
    +     */
    +    public String osName();
    +
    +    /**
    +     * The module target OS arch for this module.
    +     *
    +     * @return The module target OS arch
    +     */
    +    public String osArch();
    +
    +    /**
          * Retrieves all the packages located in this module.
          *
          * @return The set of packages.
    diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties
    --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties	Sat Apr 08 03:25:14 2017 +0000
    +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties	Wed Jul 05 23:09:40 2017 +0200
    @@ -1,5 +1,5 @@
     #
    -# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
    +# Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
     # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     #
     # This code is free software; you can redistribute it and/or modify it
    @@ -24,15 +24,12 @@
     #
     
     main.usage.summary=\
    -Usage: {0}  --module-path  --add-modules  --output\n\
    -\ use --help for a list of possible options
    +Usage: {0}  --module-path  --add-modules [,...]\n\
    +\Use --help for a list of possible options
     
     main.usage=\
    -Usage: {0}  --module-path  --add-modules  --output\n\
    -\ Possible options include:
    -
    -error.prefix=Error:
    -warn.prefix=Warning:
    +Usage: {0}  --module-path  --add-modules [,...]\n\
    +\Possible options include:
     
     main.opt.help=\
     \  -h, --help                            Print this help message
    @@ -54,9 +51,18 @@
     \      --output                    Location of output path
     
     main.opt.launcher=\
    -\      --launcher =     Launcher command name for the module\n\
    -\      --launcher =/
    \n\ -\ Launcher command name for the module and the main class +\ --launcher =[/]\n\ +\ Add a launcher command of the given\n\ +\ name for the module and the main class\n\ +\ if specified + +main.opt.bind-services=\ +\ --bind-services Do full service binding + +main.opt.suggest-providers=\ +\ --suggest-providers [,...] Suggest providers of services used by\n\ +\ the modules that would be linked, or\n\ +\ of the given service types main.command.files=\ \ @ Read options from file @@ -75,6 +81,9 @@ \ signed modular JARs are not copied to\n\ \ the runtime image. +main.opt.verbose=\ +\ -v, --verbose Enable verbose tracing + main.msg.bug=\ An exception has occurred in jlink. \ Please file a bug at the Java Bug Database (http://bugreport.java.com/bugreport/) \ @@ -95,6 +104,9 @@ \n\ +error.prefix=Error: +warn.prefix=Warning: + err.unknown.byte.order:unknown byte order {0} err.launcher.main.class.empty:launcher main class name cannot be empty: {0} err.launcher.module.name.empty:launcher module name cannot be empty: {0} @@ -111,12 +123,12 @@ err.dir.exists={0} already exists err.badpattern=bad pattern {0} err.unknown.option=unknown option: {0} -err.orphan.argument=orphan argument: {0} err.missing.arg=no value given for {0} err.internal.error=internal error: {0} {1} {2} err.invalid.arg.for.option=invalid argument for option: {0} err.option.after.class=option must be specified before classes: {0} err.option.unsupported={0} not supported: {1} +err.orphan.arguments=invalid argument: {0} err.config.defaults=property {0} is missing from configuration err.config.defaults.value=wrong value in defaults property: {0} err.bom.generation=bom file generation failed: {0} @@ -126,3 +138,7 @@ warn.signing=WARNING: signed modular JAR {0} is currently not supported warn.invalid.arg=invalid classname or pathname not exist: {0} warn.split.package=package {0} defined in {1} {2} +warn.unused.services=Services specified in --suggest-providers not used: {0} +no.suggested.providers=--bind-services option is specified. No additional providers suggested. +suggested.providers.header=Suggested providers +providers.header=Providers diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java Wed Jul 05 23:09:40 2017 +0200 @@ -96,13 +96,14 @@ import jdk.internal.joptsimple.OptionSet; import jdk.internal.joptsimple.OptionSpec; import jdk.internal.joptsimple.ValueConverter; -import jdk.internal.loader.ResourceHelper; import jdk.internal.module.ModuleHashes; import jdk.internal.module.ModuleHashesBuilder; import jdk.internal.module.ModuleInfo; import jdk.internal.module.ModuleInfoExtender; import jdk.internal.module.ModulePath; import jdk.internal.module.ModuleResolution; +import jdk.internal.module.ModuleTarget; +import jdk.internal.module.Resources; import jdk.tools.jlink.internal.Utils; import static java.util.stream.Collectors.joining; @@ -178,7 +179,6 @@ String mainClass; String osName; String osArch; - String osVersion; Pattern modulesToHash; ModuleResolution moduleResolution; boolean dryrun; @@ -311,7 +311,9 @@ try (JmodFile jf = new JmodFile(options.jmodFile)) { try (InputStream in = jf.getInputStream(Section.CLASSES, MODULE_INFO)) { ModuleInfo.Attributes attrs = ModuleInfo.read(in, null); - printModuleDescriptor(attrs.descriptor(), attrs.recordedHashes()); + printModuleDescriptor(attrs.descriptor(), + attrs.target(), + attrs.recordedHashes()); return true; } catch (IOException e) { throw new CommandException("err.module.descriptor.not.found"); @@ -325,7 +327,9 @@ .collect(joining(" ")); } - private void printModuleDescriptor(ModuleDescriptor md, ModuleHashes hashes) + private void printModuleDescriptor(ModuleDescriptor md, + ModuleTarget target, + ModuleHashes hashes) throws IOException { StringBuilder sb = new StringBuilder(); @@ -365,11 +369,14 @@ md.mainClass().ifPresent(v -> sb.append("\n main-class " + v)); - md.osName().ifPresent(v -> sb.append("\n operating-system-name " + v)); - - md.osArch().ifPresent(v -> sb.append("\n operating-system-architecture " + v)); - - md.osVersion().ifPresent(v -> sb.append("\n operating-system-version " + v)); + if (target != null) { + String osName = target.osName(); + if (osName != null) + sb.append("\n operating-system-name " + osName); + String osArch = target.osArch(); + if (osArch != null) + sb.append("\n operating-system-architecture " + osArch); + } if (hashes != null) { hashes.names().stream().sorted().forEach( @@ -432,7 +439,6 @@ final String mainClass = options.mainClass; final String osName = options.osName; final String osArch = options.osArch; - final String osVersion = options.osVersion; final List excludes = options.excludes; final ModuleResolution moduleResolution = options.moduleResolution; @@ -528,9 +534,9 @@ if (mainClass != null) extender.mainClass(mainClass); - // --os-name, --os-arch, --os-version - if (osName != null || osArch != null || osVersion != null) - extender.targetPlatform(osName, osArch, osVersion); + // --os-name, --os-arch + if (osName != null || osArch != null) + extender.targetPlatform(osName, osArch); // --module-version if (moduleVersion != null) @@ -675,7 +681,7 @@ */ boolean isResource(String name) { name = name.replace(File.separatorChar, '/'); - return name.endsWith(".class") || !ResourceHelper.isSimpleResource(name); + return name.endsWith(".class") || Resources.canEncapsulate(name); } @@ -1331,11 +1337,6 @@ .withRequiredArg() .describedAs(getMessage("main.opt.os-arch.arg")); - OptionSpec osVersion - = parser.accepts("os-version", getMessage("main.opt.os-version")) - .withRequiredArg() - .describedAs(getMessage("main.opt.os-version.arg")); - OptionSpec doNotResolveByDefault = parser.accepts("do-not-resolve-by-default", getMessage("main.opt.do-not-resolve-by-default")); @@ -1403,8 +1404,6 @@ options.osName = getLastElement(opts.valuesOf(osName)); if (opts.has(osArch)) options.osArch = getLastElement(opts.valuesOf(osArch)); - if (opts.has(osVersion)) - options.osVersion = getLastElement(opts.valuesOf(osVersion)); if (opts.has(warnIfResolved)) options.moduleResolution = getLastElement(opts.valuesOf(warnIfResolved)); if (opts.has(doNotResolveByDefault)) { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties Wed Jul 05 23:09:40 2017 +0200 @@ -68,8 +68,6 @@ main.opt.os-name.arg=os-name main.opt.os-arch=Operating system architecture main.opt.os-arch.arg=os-arch -main.opt.os-version=Operating system version -main.opt.os-version.arg=os-version main.opt.module-path=Module path main.opt.hash-modules=Compute and record hashes to tie a packaged module\ \ with modules matching the given and depending upon it directly\ diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jlink/share/classes/module-info.java --- a/jdk/src/jdk.jlink/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.jlink/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,12 @@ * questions. */ +/** + * Defines the Java linker tool, jlink. + * + * @moduleGraph + * @since 9 + */ module jdk.jlink { requires jdk.internal.opt; requires jdk.jdeps; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jsobject/share/classes/module-info.java --- a/jdk/src/jdk.jsobject/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.jsobject/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,12 @@ * questions. */ +/** + * Defines the API for the JavaScript Object. + * + * @moduleGraph + * @since 9 + */ module jdk.jsobject { requires java.desktop; exports netscape.javascript; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.jstatd/share/classes/module-info.java --- a/jdk/src/jdk.jstatd/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,13 @@ * questions. */ +/** + * Defines the tool for starting a daemon for the jstat tool to monitor + * JVM statistics remotely. + * + * @moduleGraph + * @since 9 + */ module jdk.jstatd { requires java.rmi; requires jdk.internal.jvmstat; @@ -32,4 +39,3 @@ provides sun.jvmstat.monitor.MonitoredHostService with sun.jvmstat.perfdata.monitor.protocol.rmi.MonitoredHostRmiService; } - diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.localedata/share/classes/module-info.java --- a/jdk/src/jdk.localedata/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.localedata/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,12 @@ * questions. */ +/** + * Locale data provider for locales other than {@linkplain java.util.Locale#US US locale}. + * + * @moduleGraph + * @since 9 + */ module jdk.localedata { provides sun.util.locale.provider.LocaleDataMetaInfo with sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo, diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.management.agent/share/classes/module-info.java --- a/jdk/src/jdk.management.agent/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.management.agent/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,12 @@ * questions. */ +/** + * Define the JMX management agent. + * + * @moduleGraph + * @since 9 + */ module jdk.management.agent { requires java.management; requires java.management.rmi; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.management/share/classes/module-info.java --- a/jdk/src/jdk.management/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.management/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,12 @@ * questions. */ +/** + * Defines the JDK-specific Management Interfaces for JVM. + * + * @moduleGraph + * @since 9 + */ module jdk.management { requires transitive java.management; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.naming.dns/share/classes/module-info.java --- a/jdk/src/jdk.naming.dns/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.naming.dns/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,12 @@ * questions. */ +/** + * DNS Java Naming provider. + * + * @moduleGraph + * @since 9 + */ module jdk.naming.dns { requires java.naming; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.naming.rmi/share/classes/module-info.java --- a/jdk/src/jdk.naming.rmi/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.naming.rmi/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,12 @@ * questions. */ +/** + * RMI Java Naming provider. + * + * @moduleGraph + * @since 9 + */ module jdk.naming.rmi { requires java.naming; requires java.rmi; diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.net/share/classes/module-info.java --- a/jdk/src/jdk.net/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.net/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,12 @@ * questions. */ +/** + * Defines the JDK-specific Networking API. + * + * @moduleGraph + * @since 9 + */ module jdk.net { exports jdk.net; } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.sctp/share/classes/module-info.java --- a/jdk/src/jdk.sctp/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.sctp/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,12 @@ * questions. */ +/** + * Defines the JDK-specific API for SCTP. + * + * @moduleGraph + * @since 9 + */ module jdk.sctp { exports com.sun.nio.sctp; } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.security.auth/share/classes/module-info.java --- a/jdk/src/jdk.security.auth/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.security.auth/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,6 +27,7 @@ * Contains the implementation of the javax.security.auth.* interfaces and * various authentication modules. * + * @moduleGraph * @since 9 */ module jdk.security.auth { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.security.jgss/share/classes/module-info.java --- a/jdk/src/jdk.security.jgss/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.security.jgss/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,6 +27,7 @@ * Defines Java extensions to the GSS-API and an implementation of the SASL * GSSAPI mechanism. * + * @moduleGraph * @since 9 */ module jdk.security.jgss { diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java --- a/jdk/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java Wed Jul 05 23:09:40 2017 +0200 @@ -813,6 +813,7 @@ /** * Tells the VM to define a class, without security checks. By default, the * class loader and protection domain come from the caller's class. + * @see java.lang.invoke.MethodHandles.Lookup#defineClass(byte[]) */ @ForceInline public Class defineClass(String name, byte[] b, int off, int len, diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java --- a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.Runtime.Version; +import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.Arrays; import java.util.HashMap; @@ -86,12 +87,12 @@ } } - private boolean isMultiReleaseJar() { + private boolean isMultiReleaseJar() throws IOException { try (InputStream is = newInputStream(getBytes("/META-INF/MANIFEST.MF"))) { - return (new Manifest(is)).getMainAttributes() - .containsKey(new Attributes.Name("Multi-Release")); - // fixme change line above after JarFile integration to contain Attributes.Name.MULTI_RELEASE - } catch (IOException x) { + String multiRelease = new Manifest(is).getMainAttributes() + .getValue(Attributes.Name.MULTI_RELEASE); + return "true".equalsIgnoreCase(multiRelease); + } catch (NoSuchFileException x) { return false; } } diff -r 18569c523d38 -r c61cc8a34456 jdk/src/jdk.zipfs/share/classes/module-info.java --- a/jdk/src/jdk.zipfs/share/classes/module-info.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/src/jdk.zipfs/share/classes/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,12 @@ * questions. */ +/** + * Zip file system provider. + * + * @moduleGraph + * @since 9 + */ module jdk.zipfs { provides java.nio.file.spi.FileSystemProvider with jdk.nio.zipfs.ZipFileSystemProvider; } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/ProblemList.txt Wed Jul 05 23:09:40 2017 +0200 @@ -180,8 +180,6 @@ java/nio/channels/DatagramChannel/ChangingAddress.java 7141822 macosx-all -java/nio/channels/Selector/OutOfBand.java 7132677 macosx-all - java/nio/file/WatchService/Basic.java 7158947 solaris-all Solaris 11 java/nio/file/WatchService/MayFlies.java 7158947 solaris-all Solaris 11 java/nio/file/WatchService/LotsOfEvents.java 7158947 solaris-all Solaris 11 @@ -215,9 +213,8 @@ javax/net/ssl/DTLS/PacketLossRetransmission.java 8169086 macosx-x64 javax/net/ssl/DTLS/RespondToRetransmit.java 8169086 macosx-x64 -sun/security/krb5/auto/Basic.java 8176296 generic-all +sun/security/ssl/X509KeyManager/PreferredKey.java 8176354 generic-all -sun/security/ssl/X509KeyManager/PreferredKey.java 8176354 generic-all ############################################################################ # jdk_sound @@ -292,6 +289,7 @@ java/util/BitSet/BitSetStreamTest.java 8079538 generic-all +jdk/internal/util/jar/TestVersionedStream.java 8177640 windows-all ############################################################################ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/TEST.groups --- a/jdk/test/TEST.groups Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/TEST.groups Wed Jul 05 23:09:40 2017 +0200 @@ -28,8 +28,6 @@ tier1 = \ :jdk_lang \ :jdk_util \ - -java/util/concurrent/ThreadPoolExecutor/ConfigChanges.java \ - -java/util/concurrent/forkjoin/FJExceptionTableLeak.java \ sun/nio/cs/ISO8859x.java \ java/nio/Buffer \ com/sun/crypto/provider/Cipher \ @@ -37,8 +35,6 @@ tools/pack200 tier2 = \ - java/util/concurrent/ThreadPoolExecutor/ConfigChanges.java \ - java/util/concurrent/forkjoin/FJExceptionTableLeak.java \ :jdk_io \ :jdk_nio \ -sun/nio/cs/ISO8859x.java \ @@ -74,9 +70,11 @@ sun/reflect \ jdk/internal/reflect \ jdk/lambda \ + jdk/internal/loader \ jdk/internal/misc \ jdk/internal/ref \ jdk/internal/jimage \ + jdk/internal/math \ jdk/modules \ vm @@ -91,6 +89,7 @@ jdk_util_other = \ java/util \ sun/util \ + jdk/internal/util \ -:jdk_collections \ -:jdk_concurrent \ -:jdk_stream @@ -145,8 +144,7 @@ java/util/stream jdk_math = \ - java/math \ - jdk/internal/math + java/math jdk_io = \ java/io @@ -181,6 +179,7 @@ jdk_security3 = \ javax/security \ -javax/security/auth/kerberos \ + com/sun/jarsigner \ com/sun/security \ -com/sun/security/jgss \ com/sun/org/apache/xml/internal/security \ @@ -211,7 +210,8 @@ jdk_management = \ java/lang/management \ com/sun/management \ - sun/management + sun/management \ + jdk/internal/agent jdk_instrument = \ java/lang/instrument diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/AcceptTimeout.java --- a/jdk/test/com/sun/jdi/AcceptTimeout.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/AcceptTimeout.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,8 +24,7 @@ /* @test * @bug 6198277 * @summary Test that each ListeningConnector that supports a "timeout" argument will - * timeout with TransportTimeoutException - * @modules jdk.jdi + * timeout with TransportTimeoutException */ import com.sun.jdi.Bootstrap; import com.sun.jdi.connect.Connector; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/AccessSpecifierTest.java --- a/jdk/test/com/sun/jdi/AccessSpecifierTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/AccessSpecifierTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4359628 - * @summary Test fix for JDI: methods Accessible.is...() lie about array types + * @test + * @bug 4359628 + * @summary Test fix for JDI: methods Accessible.is...() lie about array types + * @author Tim Bell * - * @author Tim Bell - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g AccessSpecifierTest.java - * @run driver AccessSpecifierTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g AccessSpecifierTest.java + * @run driver AccessSpecifierTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/AfterThreadDeathTest.java --- a/jdk/test/com/sun/jdi/AfterThreadDeathTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/AfterThreadDeathTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4364671 - * @summary Creating a StepRequest on a nonexistant thread fails + * @test + * @bug 4364671 + * @summary Creating a StepRequest on a nonexistant thread fails + * @author jjh * - * @author jjh - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g AfterThreadDeathTest.java - * @run driver AfterThreadDeathTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g AfterThreadDeathTest.java + * @run driver AfterThreadDeathTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/AllLineLocations.java --- a/jdk/test/com/sun/jdi/AllLineLocations.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/AllLineLocations.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,16 @@ */ /** - * @test - * @bug 4248728 - * @summary Test ReferenceType.allLineLocations - * @author Gordon Hirsch + * @test + * @bug 4248728 + * @summary Test ReferenceType.allLineLocations + * @author Gordon Hirsch * - * @modules jdk.jdi - * @run build JDIScaffold VMConnection - * @run compile -g RefTypes.java - * @run build AllLineLocations + * @run build JDIScaffold VMConnection + * @run compile -g RefTypes.java + * @run build AllLineLocations * - * @run driver AllLineLocations RefTypes + * @run driver AllLineLocations RefTypes */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ArrayRangeTest.java --- a/jdk/test/com/sun/jdi/ArrayRangeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ArrayRangeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,18 +22,16 @@ */ /** - * @test - * @bug 4439631 - * @bug 4448721 - * @bug 4448603 - * @summary Test access to ranges within ArrayReferences + * @test + * @bug 4439631 + * @bug 4448721 + * @bug 4448603 + * @summary Test access to ranges within ArrayReferences + * @author Robert Field * - * @author Robert Field - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g ArrayRangeTest.java - * @run driver ArrayRangeTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g ArrayRangeTest.java + * @run driver ArrayRangeTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/BacktraceFieldTest.java --- a/jdk/test/com/sun/jdi/BacktraceFieldTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/BacktraceFieldTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,15 @@ */ /** - * @test - * @bug 4446677 - * @bug 8158237 - * @summary debuggee used to crash when debugging under jbuilder + * @test + * @bug 4446677 + * @bug 8158237 + * @summary debuggee used to crash when debugging under jbuilder + * @author jjh * - * @author jjh - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g BacktraceFieldTest.java - * @run driver BacktraceFieldTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g BacktraceFieldTest.java + * @run driver BacktraceFieldTest */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ClassLoaderClassesTest.java --- a/jdk/test/com/sun/jdi/ClassLoaderClassesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ClassLoaderClassesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,10 +27,8 @@ * @summary Test ClassLoaderReference.visibleClasses() which is * a direct pass-through of the JVMDI function GetClassLoaderClasses * for inclusion of primitive arrays. - * * @author Robert Field * - * @modules jdk.jdi * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -g ClassLoaderClassesTest.java * @run driver ClassLoaderClassesTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ClassesByName.java --- a/jdk/test/com/sun/jdi/ClassesByName.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ClassesByName.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,16 +24,14 @@ /** * @test * @bug 4287992 + * @summary ClassesByName verifies that all the classes in the + * loaded class list can be found with classesByName.. * @author Robert Field * - * @modules jdk.jdi * @run build JDIScaffold VMConnection * @run compile -g HelloWorld.java * @run build ClassesByName * - * @summary ClassesByName verifies that all the classes in the - * loaded class list can be found with classesByName.. - * * @run driver ClassesByName HelloWorld */ import com.sun.jdi.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ClassesByName2Test.java --- a/jdk/test/com/sun/jdi/ClassesByName2Test.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ClassesByName2Test.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,17 @@ */ /** - * @test - * @bug 4406439 4925740 - * @summary ClassesByName2 verifies that all the classes in the loaded class list can be found with classesByName.. + * @test + * @bug 4406439 4925740 + * @summary ClassesByName2 verifies that all the classes in the loaded class list can be found with classesByName.. + * @author Tim Bell (based on ClassesByName by Robert Field) * - * @author Tim Bell (based on ClassesByName by Robert Field) + * @modules jdk.jdi + * java.desktop * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g ClassesByName2Test.java - * @run driver ClassesByName2Test + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g ClassesByName2Test.java + * @run driver ClassesByName2Test */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/CompatibleConnectors.java --- a/jdk/test/com/sun/jdi/CompatibleConnectors.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/CompatibleConnectors.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * * This test checks that VirtualMachineManager creates Connectors that * are "compatible" those created by 1.4 or earilier releases. - * @modules jdk.jdi */ import com.sun.jdi.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ConnectedVMs.java --- a/jdk/test/com/sun/jdi/ConnectedVMs.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ConnectedVMs.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,20 +22,18 @@ */ /** - * @test - * @bug 4329140 - * @author Robert Field - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g InstTarg.java - * @run driver ConnectedVMs Kill - * @run driver ConnectedVMs Resume-to-exit - * @run driver ConnectedVMs dispose() - * @run driver ConnectedVMs exit() - * + * @test + * @bug 4329140 * @summary ConnectedVMs checks the method * VirtualMachineManager.connectedVirtualMachines() + * @author Robert Field + * + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g InstTarg.java + * @run driver ConnectedVMs Kill + * @run driver ConnectedVMs Resume-to-exit + * @run driver ConnectedVMs dispose() + * @run driver ConnectedVMs exit() */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ConstantPoolInfo.java --- a/jdk/test/com/sun/jdi/ConstantPoolInfo.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ConstantPoolInfo.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 5024104 - * @summary Test ReferenceType.majorVersion(), minorVersion, constantPoolCount and ConstantPool apis. + * @test + * @bug 5024104 + * @summary Test ReferenceType.majorVersion(), minorVersion, constantPoolCount and ConstantPool apis. + * @author Swamy Venkataramanappa * - * @author Swamy Venkataramanappa - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection - * @run compile -g ConstantPoolInfo.java - * @run driver ConstantPoolInfo + * @run build TestScaffold VMConnection + * @run compile -g ConstantPoolInfo.java + * @run driver ConstantPoolInfo */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ConstantPoolInfoGC.java --- a/jdk/test/com/sun/jdi/ConstantPoolInfoGC.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ConstantPoolInfoGC.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,16 @@ */ /* - * @test - * @bug 6822627 - * @summary Test that ReferenceType.constantPool does not produce an NPE + * @test + * @bug 6822627 + * @summary Test that ReferenceType.constantPool does not produce an NPE + * @author Egor Ushakov * - * @author Egor Ushakov + * @modules jdk.jdi/com.sun.tools.jdi:+open * - * @modules jdk.jdi/com.sun.tools.jdi:+open - * @run build TestScaffold VMConnection - * @run compile -g ConstantPoolInfoGC.java - * @run main/othervm ConstantPoolInfoGC + * @run build TestScaffold VMConnection + * @run compile -g ConstantPoolInfoGC.java + * @run main/othervm ConstantPoolInfoGC */ import com.sun.jdi.ReferenceType; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/CountEvent.java --- a/jdk/test/com/sun/jdi/CountEvent.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/CountEvent.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,15 @@ */ /** - * @test - * @bug 4315352 - * @summary disabling EventRequest expired with addCountFilter() throws - * InternalException. + * @test + * @bug 4315352 + * @summary disabling EventRequest expired with addCountFilter() throws + * InternalException. + * @author Robert Field * - * @author Robert Field - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetAdapter TargetListener - * @run compile -g CountEvent.java - * @run driver CountEvent + * @run build TestScaffold VMConnection TargetAdapter TargetListener + * @run compile -g CountEvent.java + * @run driver CountEvent */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/CountFilterTest.java --- a/jdk/test/com/sun/jdi/CountFilterTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/CountFilterTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4321339 - * @summary Check correct processing of filters after a count filter + * @test + * @bug 4321339 + * @summary Check correct processing of filters after a count filter + * @author Robert Field * - * @author Robert Field - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g CountFilterTest.java - * @run driver CountFilterTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g CountFilterTest.java + * @run driver CountFilterTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/DebuggerThreadTest.java --- a/jdk/test/com/sun/jdi/DebuggerThreadTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/DebuggerThreadTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4513488 - * @summary Test for JDI: Internal JDI helper threads should setDaemon(true) + * @test + * @bug 4513488 + * @summary Test for JDI: Internal JDI helper threads should setDaemon(true) + * @author Tim Bell * - * @author Tim Bell - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g DebuggerThreadTest.java - * @run driver DebuggerThreadTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g DebuggerThreadTest.java + * @run driver DebuggerThreadTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/DeleteAllBkptsTest.java --- a/jdk/test/com/sun/jdi/DeleteAllBkptsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/DeleteAllBkptsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,16 @@ */ /** - * @test - * @bug 4528948 - * @summary Unable to finish a debugging in NetBeans IDE - * - * @author jjh + * @test + * @bug 4528948 + * @summary Unable to finish a debugging in NetBeans IDE + * @author jjh * - * @library .. - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g DeleteAllBkptsTest.java - * @run driver DeleteAllBkptsTest + * @library .. + * + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g DeleteAllBkptsTest.java + * @run driver DeleteAllBkptsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/DeleteEventRequestsTest.java --- a/jdk/test/com/sun/jdi/DeleteEventRequestsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/DeleteEventRequestsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4331872 - * @summary erm.deleteEventRequests(erm.breakpointRequests()) throws exception + * @test + * @bug 4331872 + * @summary erm.deleteEventRequests(erm.breakpointRequests()) throws exception + * @author Robert Field * - * @author Robert Field - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g DeleteEventRequestsTest.java - * @run driver DeleteEventRequestsTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g DeleteEventRequestsTest.java + * @run driver DeleteEventRequestsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/EarlyReturnNegativeTest.java --- a/jdk/test/com/sun/jdi/EarlyReturnNegativeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/EarlyReturnNegativeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,15 +22,14 @@ */ /** - * @test - * @bug 6431735 - * @summary Unexpected ClassCastException in ThreadReference.forceEarlyReturn - * @author Jim Holmlund + * @test + * @bug 6431735 + * @summary Unexpected ClassCastException in ThreadReference.forceEarlyReturn + * @author Jim Holmlund * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g EarlyReturnNegativeTest.java - * @run driver EarlyReturnNegativeTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g EarlyReturnNegativeTest.java + * @run driver EarlyReturnNegativeTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/EarlyReturnTest.java --- a/jdk/test/com/sun/jdi/EarlyReturnTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/EarlyReturnTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,22 +22,21 @@ */ /* - * @test - * @bug 6175634 - * @summary Allow early return from methods + * @test + * @bug 6175634 + * @summary Allow early return from methods * - * @bug 6431720 - * @summary Unexpected InvalidTypeException when call ThreadReference.forceEarlyReturn with VoidValue + * @bug 6431720 + * @summary Unexpected InvalidTypeException when call ThreadReference.forceEarlyReturn with VoidValue * - * @bug 6432855 - * @summary Need a way to create JDI VoidValue for use in ThreadReference.forceEarlyReturn - * - * @author Tim Bell (based on MethodExitReturnValuesTest by Jim Holmlund) + * @bug 6432855 + * @summary Need a way to create JDI VoidValue for use in ThreadReference.forceEarlyReturn * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g EarlyReturnTest.java - * @run driver EarlyReturnTest + * @author Tim Bell (based on MethodExitReturnValuesTest by Jim Holmlund) + * + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g EarlyReturnTest.java + * @run driver EarlyReturnTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/EnumTest.java --- a/jdk/test/com/sun/jdi/EnumTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/EnumTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4728816 - * @summary JPDA: Add support for enums + * @test + * @bug 4728816 + * @summary JPDA: Add support for enums + * @author jjh * - * @author jjh - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g EnumTest.java - * @run driver EnumTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g EnumTest.java + * @run driver EnumTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/EventQueueDisconnectTest.java --- a/jdk/test/com/sun/jdi/EventQueueDisconnectTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/EventQueueDisconnectTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,21 +22,20 @@ */ /** - * @test - * @bug 4425852 - * @author Robert Field + * @test + * @bug 4425852 + * @author Robert Field * - * @modules jdk.jdi - * @run build VMConnection - * @run compile -g EventQueueDisconnectTest.java - * @run driver EventQueueDisconnectTest - * - * @summary EventQueueDisconnectTest checks to see that - * VMDisconnectedException is never thrown before VMDisconnectEvent. + * @summary EventQueueDisconnectTest checks to see that + * VMDisconnectedException is never thrown before VMDisconnectEvent. * * Failure mode for this test is throwing VMDisconnectedException * on vm.eventQueue().remove(); * Does not use a scaffold since we don't want that hiding the exception. + * + * @run build VMConnection + * @run compile -g EventQueueDisconnectTest.java + * @run driver EventQueueDisconnectTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ExceptionEvents.java --- a/jdk/test/com/sun/jdi/ExceptionEvents.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ExceptionEvents.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,43 +22,41 @@ */ /** - * @test - * @bug 4407397 - * @summary Test the requesting of exception events - * - * @author Robert Field + * @test + * @bug 4407397 + * @key intermittent + * @summary Test the requesting of exception events + * @author Robert Field * - * @key intermittent - * @modules jdk.jdi - * @run build TestScaffold VMConnection - * @run compile -g ExceptionEvents.java + * @run build TestScaffold VMConnection + * @run compile -g ExceptionEvents.java * - * @run driver ExceptionEvents N A StackOverflowCaughtTarg java.lang.Exception - * @run driver ExceptionEvents C A StackOverflowCaughtTarg null - * @run driver ExceptionEvents C A StackOverflowCaughtTarg java.lang.Error - * @run driver ExceptionEvents C A StackOverflowCaughtTarg java.lang.StackOverflowError - * @run driver ExceptionEvents N A StackOverflowCaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N A StackOverflowCaughtTarg java.lang.Exception + * @run driver ExceptionEvents C A StackOverflowCaughtTarg null + * @run driver ExceptionEvents C A StackOverflowCaughtTarg java.lang.Error + * @run driver ExceptionEvents C A StackOverflowCaughtTarg java.lang.StackOverflowError + * @run driver ExceptionEvents N A StackOverflowCaughtTarg java.lang.NullPointerException - * @run driver ExceptionEvents N T StackOverflowCaughtTarg java.lang.Exception - * @run driver ExceptionEvents C T StackOverflowCaughtTarg null - * @run driver ExceptionEvents C T StackOverflowCaughtTarg java.lang.Error - * @run driver ExceptionEvents C T StackOverflowCaughtTarg java.lang.StackOverflowError - * @run driver ExceptionEvents N T StackOverflowCaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N T StackOverflowCaughtTarg java.lang.Exception + * @run driver ExceptionEvents C T StackOverflowCaughtTarg null + * @run driver ExceptionEvents C T StackOverflowCaughtTarg java.lang.Error + * @run driver ExceptionEvents C T StackOverflowCaughtTarg java.lang.StackOverflowError + * @run driver ExceptionEvents N T StackOverflowCaughtTarg java.lang.NullPointerException - * @run driver ExceptionEvents N N StackOverflowCaughtTarg java.lang.Exception - * @run driver ExceptionEvents C N StackOverflowCaughtTarg null - * @run driver ExceptionEvents C N StackOverflowCaughtTarg java.lang.Error - * @run driver ExceptionEvents C N StackOverflowCaughtTarg java.lang.StackOverflowError - * @run driver ExceptionEvents N N StackOverflowCaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N N StackOverflowCaughtTarg java.lang.Exception + * @run driver ExceptionEvents C N StackOverflowCaughtTarg null + * @run driver ExceptionEvents C N StackOverflowCaughtTarg java.lang.Error + * @run driver ExceptionEvents C N StackOverflowCaughtTarg java.lang.StackOverflowError + * @run driver ExceptionEvents N N StackOverflowCaughtTarg java.lang.NullPointerException - * @run driver ExceptionEvents N A StackOverflowUncaughtTarg java.lang.Exception - * @run driver ExceptionEvents U A StackOverflowUncaughtTarg null - * @run driver ExceptionEvents U A StackOverflowUncaughtTarg java.lang.Error - * @run driver ExceptionEvents U A StackOverflowUncaughtTarg java.lang.StackOverflowError - * @run driver ExceptionEvents N A StackOverflowUncaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N A StackOverflowUncaughtTarg java.lang.Exception + * @run driver ExceptionEvents U A StackOverflowUncaughtTarg null + * @run driver ExceptionEvents U A StackOverflowUncaughtTarg java.lang.Error + * @run driver ExceptionEvents U A StackOverflowUncaughtTarg java.lang.StackOverflowError + * @run driver ExceptionEvents N A StackOverflowUncaughtTarg java.lang.NullPointerException - * @run driver ExceptionEvents N T StackOverflowUncaughtTarg java.lang.NullPointerException - * @run driver ExceptionEvents N N StackOverflowUncaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N T StackOverflowUncaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents N N StackOverflowUncaughtTarg java.lang.NullPointerException */ import com.sun.jdi.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ExpiredRequestDeletionTest.java --- a/jdk/test/com/sun/jdi/ExpiredRequestDeletionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ExpiredRequestDeletionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,16 @@ */ /** - * @test - * @bug 4453310 - * @summary Test the deletion of event requests that are expired - * by virtue of addCountFilter. + * @test + * @bug 4453310 + * @summary Test the deletion of event requests that are expired + * by virtue of addCountFilter. * - * @author Robert Field + * @author Robert Field * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g ExpiredRequestDeletionTest.java - * @run driver ExpiredRequestDeletionTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g ExpiredRequestDeletionTest.java + * @run driver ExpiredRequestDeletionTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/FieldWatchpoints.java --- a/jdk/test/com/sun/jdi/FieldWatchpoints.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/FieldWatchpoints.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4408582 - * @summary Test fix for: JDWP: WatchpointEvents outside of class filtered out + * @test + * @bug 4408582 + * @summary Test fix for: JDWP: WatchpointEvents outside of class filtered out + * @author Tim Bell * - * @author Tim Bell - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g FieldWatchpoints.java - * @run driver FieldWatchpoints + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g FieldWatchpoints.java + * @run driver FieldWatchpoints */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/FilterMatch.java --- a/jdk/test/com/sun/jdi/FilterMatch.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/FilterMatch.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4331522 - * @summary addClassFilter("Foo") acts like "Foo*" + * @test + * @bug 4331522 + * @summary addClassFilter("Foo") acts like "Foo*" + * @author Robert Field/Jim Holmlund * - * @author Robert Field/Jim Holmlund - * - * @modules jdk.jdi - * @run build JDIScaffold VMConnection - * @run compile -g HelloWorld.java - * @run driver FilterMatch + * @run build JDIScaffold VMConnection + * @run compile -g HelloWorld.java + * @run driver FilterMatch */ /* Look at patternMatch in JDK file: diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/FilterNoMatch.java --- a/jdk/test/com/sun/jdi/FilterNoMatch.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/FilterNoMatch.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4331522 - * @summary addClassFilter("Foo") acts like "Foo*" + * @test + * @bug 4331522 + * @summary addClassFilter("Foo") acts like "Foo*" + * @author Robert Field/Jim Holmlund * - * @author Robert Field/Jim Holmlund - * - * @modules jdk.jdi - * @run build JDIScaffold VMConnection - * @run compile -g HelloWorld.java - * @run driver FilterNoMatch + * @run build JDIScaffold VMConnection + * @run compile -g HelloWorld.java + * @run driver FilterNoMatch */ /* This tests the patternMatch function in JDK file: diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/FinalLocalsTest.java --- a/jdk/test/com/sun/jdi/FinalLocalsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/FinalLocalsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,18 +22,16 @@ */ /** - * @test - * @bug 4326648 4768329 - * @summary Test to verify that table entries are generated for all final - * locals when a class is built for debug, even if they could be - * inlined otherwise. + * @test + * @bug 4326648 4768329 + * @summary Test to verify that table entries are generated for all final + * locals when a class is built for debug, even if they could be + * inlined otherwise. + * @author Tim Bell * - * @author Tim Bell - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g FinalLocalsTest.java - * @run driver FinalLocalsTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g FinalLocalsTest.java + * @run driver FinalLocalsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/FinalizerTest.java --- a/jdk/test/com/sun/jdi/FinalizerTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/FinalizerTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,15 @@ */ /** - * @test - * @bug 4272800 4274208 4392010 - * @summary Test debugger operations in finalize() methods - * @author Gordon Hirsch (modified for HotSpot by tbell & rfield) + * @test + * @bug 4272800 4274208 4392010 + * @summary Test debugger operations in finalize() methods + * @author Gordon Hirsch (modified for HotSpot by tbell & rfield) * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g FinalizerTest.java + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g FinalizerTest.java * - * @run driver FinalizerTest + * @run driver FinalizerTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/FramesTest.java --- a/jdk/test/com/sun/jdi/FramesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/FramesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4434232 - * @summary Test ThreadReference.frames(int,int) + * @test + * @bug 4434232 + * @summary Test ThreadReference.frames(int,int) + * @author Robert Field * - * @author Robert Field - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g FramesTest.java - * @run driver FramesTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g FramesTest.java + * @run driver FramesTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/GenericsTest.java --- a/jdk/test/com/sun/jdi/GenericsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/GenericsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4421040 - * @summary JPDA: Add support for JSR-014 Generics + * @test + * @bug 4421040 + * @summary JPDA: Add support for JSR-014 Generics + * @author jjh * - * @author jjh - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g GenericsTest.java - * @run driver GenericsTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g GenericsTest.java + * @run driver GenericsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/GetLocalVariables2Test.java --- a/jdk/test/com/sun/jdi/GetLocalVariables2Test.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/GetLocalVariables2Test.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4349534 4690242 4695338 - * @summary regression - bad LocalVariableTable attribute when no initialization needed + * @test + * @bug 4349534 4690242 4695338 + * @summary regression - bad LocalVariableTable attribute when no initialization needed + * @author Tim Bell * - * @author Tim Bell - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g GetLocalVariables2Test.java - * @run driver GetLocalVariables2Test + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g GetLocalVariables2Test.java + * @run driver GetLocalVariables2Test */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/GetUninitializedStringValue.java --- a/jdk/test/com/sun/jdi/GetUninitializedStringValue.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/GetUninitializedStringValue.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 8021897 - * @summary Test getting the value for an uninitialized String object + * @test + * @bug 8021897 + * @summary Test getting the value for an uninitialized String object + * @author Staffan Larsen * - * @author Staffan Larsen - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g GetUninitializedStringValue.java - * @run driver GetUninitializedStringValue + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g GetUninitializedStringValue.java + * @run driver GetUninitializedStringValue */ import com.sun.jdi.ReferenceType; import com.sun.jdi.StackFrame; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/HomeTest.java --- a/jdk/test/com/sun/jdi/HomeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/HomeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4446294 - * @summary JDI spec/impl: default "home" for CommandLineLaunch isn't java.home + * @test + * @bug 4446294 + * @summary JDI spec/impl: default "home" for CommandLineLaunch isn't java.home + * @author Tim Bell (based on "HomeTest.java" by Eugene I. Latkin) * - * @author Tim Bell (based on "HomeTest.java" by Eugene I. Latkin) - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g HomeTest.java - * @run driver HomeTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g HomeTest.java + * @run driver HomeTest */ import com.sun.jdi.*; import com.sun.jdi.connect.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ImmutableResourceTest.sh --- a/jdk/test/com/sun/jdi/ImmutableResourceTest.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ImmutableResourceTest.sh Wed Jul 05 23:09:40 2017 +0200 @@ -21,13 +21,15 @@ # questions. # -# @test -# @bug 6287579 -# @summary SubClasses of ListResourceBundle should fix getContents() -# @author Tim Bell # -# @run shell ImmutableResourceTest.sh +# @test +# @bug 6287579 +# @summary SubClasses of ListResourceBundle should fix getContents() +# @author Tim Bell # +# @modules jdk.jdi/com.sun.tools.example.debug.tty +# +# @run shell ImmutableResourceTest.sh # # Beginning of subroutines: diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/InstanceFilter.java --- a/jdk/test/com/sun/jdi/InstanceFilter.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/InstanceFilter.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,15 @@ */ /** - * @test - * @bug 4312961 - * @summary Verify that an instance filter on a MethodEntryRequest works - * properly. + * @test + * @bug 4312961 + * @summary Verify that an instance filter on a MethodEntryRequest works + * properly. + * @author Robert Field/Jim Holmlund * - * @author Robert Field/Jim Holmlund - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetAdapter TargetListener - * @run compile -g InstanceFilter.java - * @run driver InstanceFilter + * @run build TestScaffold VMConnection TargetAdapter TargetListener + * @run compile -g InstanceFilter.java + * @run driver InstanceFilter */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/InstancesTest.java --- a/jdk/test/com/sun/jdi/InstancesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/InstancesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,15 +22,14 @@ */ /** - * @test - * @bug 5024119 - * @summary Add ReferenceType.getAllInstances () method to JDI. - * @author jjh + * @test + * @bug 5024119 + * @summary Add ReferenceType.getAllInstances () method to JDI. + * @author jjh * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g InstancesTest.java - * @run driver InstancesTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g InstancesTest.java + * @run driver InstancesTest */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/InterfaceMethodsTest.java --- a/jdk/test/com/sun/jdi/InterfaceMethodsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/InterfaceMethodsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,15 @@ */ /** - * @test - * @bug 8031195 - * @bug 8071657 - * @bug 8165827 - * @summary JDI: Add support for static, private and default methods in interfaces + * @test + * @bug 8031195 + * @bug 8071657 + * @bug 8165827 + * @summary JDI: Add support for static, private and default methods in interfaces * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run build InterfaceMethodsTest - * @run driver InterfaceMethodsTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run build InterfaceMethodsTest + * @run driver InterfaceMethodsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/InterruptHangTest.java --- a/jdk/test/com/sun/jdi/InterruptHangTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/InterruptHangTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,16 +26,14 @@ import com.sun.jdi.request.*; /** - * @test - * @bug 6459476 - * @summary Debuggee is blocked, looks like running + * @test + * @bug 6459476 + * @summary Debuggee is blocked, looks like running + * @author jjh * - * @author jjh - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g InterruptHangTest.java - * @run driver InterruptHangTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g InterruptHangTest.java + * @run driver InterruptHangTest */ /** diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/InvokeHangTest.java --- a/jdk/test/com/sun/jdi/InvokeHangTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/InvokeHangTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,18 @@ */ /** - * @test - * @bug 6293795 - * @summary Backend hangs when invokeMethod is called from a JDI eventHandler - * - * @author jjh + * @test + * @bug 6293795 + * @summary Backend hangs when invokeMethod is called from a JDI eventHandler + * @author jjh * - * @modules jdk.jdi - * @library /test/lib - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g InvokeHangTest.java - * @run driver InvokeHangTest + * @library /test/lib + * @modules java.management + * jdk.jdi + * + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g InvokeHangTest.java + * @run driver InvokeHangTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/InvokeTest.java --- a/jdk/test/com/sun/jdi/InvokeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/InvokeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,16 @@ */ /** - * @test - * @bug 4451941 4527072 - * @summary Test argument types for invoke - * - * @author Robert Field + * @test + * @bug 4451941 4527072 + * @summary Test argument types for invoke + * @author Robert Field * - * @library .. - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g InvokeTest.java - * @run driver InvokeTest + * @library .. + * + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g InvokeTest.java + * @run driver InvokeTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/JITDebug.sh --- a/jdk/test/com/sun/jdi/JITDebug.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/JITDebug.sh Wed Jul 05 23:09:40 2017 +0200 @@ -24,17 +24,16 @@ # # -# @test JITDebug.sh 1.7 03/09/05 -# @bug 4291701 4376819 4422312 4522770 4913748 -# @summary Test JIT debugging - assure that launching on -# uncaught exception works -# @author Tim Bell -# Based on test/java/awt/TEMPLATE/AutomaticShellTest.sh +# @test JITDebug.sh 1.7 03/09/05 +# @bug 4291701 4376819 4422312 4522770 4913748 +# @summary Test JIT debugging - assure that launching on +# uncaught exception works +# @author Tim Bell +# Based on test/java/awt/TEMPLATE/AutomaticShellTest.sh # -# @modules jdk.jdi -# @run build TestScaffold VMConnection TargetListener TargetAdapter -# @run compile -g JITDebug.java -# @run shell JITDebug.sh +# @run build TestScaffold VMConnection TargetListener TargetAdapter +# @run compile -g JITDebug.java +# @run shell JITDebug.sh # Beginning of subroutines: status=1 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/Java_gTest.java --- a/jdk/test/com/sun/jdi/Java_gTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/Java_gTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4500906 4433599 4740097 - * @summary vmexec= debug java fails for SunCommandLineLauncher + * @test + * @bug 4500906 4433599 4740097 + * @summary vmexec= debug java fails for SunCommandLineLauncher + * @author jjh * - * @author jjh - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g Java_gTest.java - * @run driver Java_gTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g Java_gTest.java + * @run driver Java_gTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/LambdaStepTest.java --- a/jdk/test/com/sun/jdi/LambdaStepTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/LambdaStepTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,15 +22,13 @@ */ /** - * @test - * @summary Test stepping through lambdas - * - * @author Staffan Larsen + * @test + * @summary Test stepping through lambdas + * @author Staffan Larsen * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g LambdaStepTest.java - * @run driver LambdaStepTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g LambdaStepTest.java + * @run driver LambdaStepTest */ import com.sun.jdi.LocalVariable; import com.sun.jdi.ObjectReference; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/LaunchCommandLine.java --- a/jdk/test/com/sun/jdi/LaunchCommandLine.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/LaunchCommandLine.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,16 @@ */ /** - * @test - * @bug 4245011 - * @summary Test launcher command line construction - * @author Gordon Hirsch + * @test + * @bug 4245011 + * @summary Test launcher command line construction + * @author Gordon Hirsch * - * @modules jdk.jdi - * @run build JDIScaffold VMConnection - * @run compile -g HelloWorld.java - * @run build LaunchCommandLine + * @run build JDIScaffold VMConnection + * @run compile -g HelloWorld.java + * @run build LaunchCommandLine * - * @run driver LaunchCommandLine + * @run driver LaunchCommandLine */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/LineNumberInfo.java --- a/jdk/test/com/sun/jdi/LineNumberInfo.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/LineNumberInfo.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Test javac regressions in the generation of line number info * @author Gordon Hirsch * - * @modules jdk.jdi * @run build TestScaffold VMConnection TargetListener TargetAdapter * @run compile -XDstringConcat=inline -g LineNumberInfo.java ControlFlow.java * diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ListenAddress.java --- a/jdk/test/com/sun/jdi/ListenAddress.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ListenAddress.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @summary Test that startListening(Map) method of the com.sun.jdi.SocketListen * Connector returns an address that is usable for the address option on * remove debuggees. - * @modules jdk.jdi */ import java.net.InetAddress; import java.net.Inet4Address; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/LocalVariableEqual.java --- a/jdk/test/com/sun/jdi/LocalVariableEqual.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/LocalVariableEqual.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4916263 - * @summary Test + * @test + * @bug 4916263 + * @summary Test + * @author Serguei Spitsyn * - * @author Serguei Spitsyn - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g LocalVariableEqual.java - * @run driver LocalVariableEqual + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g LocalVariableEqual.java + * @run driver LocalVariableEqual */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/LocationTest.java --- a/jdk/test/com/sun/jdi/LocationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/LocationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4419453 - * @summary Test that Method.location() returns the right values + * @test + * @bug 4419453 + * @summary Test that Method.location() returns the right values + * @author Robert Field * - * @author Robert Field - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g LocationTest.java - * @run driver LocationTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g LocationTest.java + * @run driver LocationTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/MethodEntryExitEvents.java --- a/jdk/test/com/sun/jdi/MethodEntryExitEvents.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/MethodEntryExitEvents.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,16 @@ */ /** - * @test - * @bug 4409241 4432820 - * @summary Test the bug fix for: MethodExitEvents disappear when Object-Methods are called from main - * @author Tim Bell + * @test + * @bug 4409241 4432820 + * @summary Test the bug fix for: MethodExitEvents disappear when Object-Methods are called from main + * @author Tim Bell * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g MethodEntryExitEvents.java - * @run driver MethodEntryExitEvents SUSPEND_EVENT_THREAD MethodEntryExitEventsDebugee - * @run driver MethodEntryExitEvents SUSPEND_NONE MethodEntryExitEventsDebugee - * @run driver MethodEntryExitEvents SUSPEND_ALL MethodEntryExitEventsDebugee + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g MethodEntryExitEvents.java + * @run driver MethodEntryExitEvents SUSPEND_EVENT_THREAD MethodEntryExitEventsDebugee + * @run driver MethodEntryExitEvents SUSPEND_NONE MethodEntryExitEventsDebugee + * @run driver MethodEntryExitEvents SUSPEND_ALL MethodEntryExitEventsDebugee */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java --- a/jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,15 +22,14 @@ */ /** - * @test - * @bug 4195445 6204179 - * @summary JDWP, JDI: Add return value to Method Exit Event - * @author Jim Holmlund + * @test + * @bug 4195445 6204179 + * @summary JDWP, JDI: Add return value to Method Exit Event + * @author Jim Holmlund * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g MethodExitReturnValuesTest.java - * @run driver MethodExitReturnValuesTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g MethodExitReturnValuesTest.java + * @run driver MethodExitReturnValuesTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/MixedSuspendTest.sh --- a/jdk/test/com/sun/jdi/MixedSuspendTest.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/MixedSuspendTest.sh Wed Jul 05 23:09:40 2017 +0200 @@ -23,16 +23,14 @@ # questions. # -# @test -# @bug 6224859 -# @summary JDWP: Mixing application suspends and debugger suspends can cause hangs -# -# @author Jim Holmlund -# -# @key intermittent -# @modules jdk.jdi -# @run build TestScaffold VMConnection TargetListener TargetAdapter -# @run shell MixedSuspendTest.sh +# @test +# @bug 6224859 +# @key intermittent +# @summary JDWP: Mixing application suspends and debugger suspends can cause hangs +# @author Jim Holmlund +# +# @run build TestScaffold VMConnection TargetListener TargetAdapter +# @run shell MixedSuspendTest.sh classname=MixedSuspendTarg @@ -84,7 +82,7 @@ int i = 0; } } - + System.out.println("Debuggee: end of thread"); } @@ -113,7 +111,7 @@ for ii in . $TESTSRC $TESTSRC/.. ; do if [ -r "$ii/ShellScaffold.sh" ] ; then - . $ii/ShellScaffold.sh + . $ii/ShellScaffold.sh break fi done diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ModificationWatchpoints.java --- a/jdk/test/com/sun/jdi/ModificationWatchpoints.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ModificationWatchpoints.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,15 @@ */ /** - * @test - * @bug 4409582 - * @summary Test all info returned by modification watchpoints + * @test + * @bug 4409582 + * @summary Test all info returned by modification watchpoints + * @author Daniel Prusa (or someone in the FFJ group) + * @author Robert Field (modified to JDIScaffold) * - * @author Daniel Prusa (or someone in the FFJ group) - * @author Robert Field (modified to JDIScaffold) - * - * @modules jdk.jdi - * @run build JDIScaffold VMConnection - * @run compile -g ModificationWatchpoints.java - * @run driver ModificationWatchpoints + * @run build JDIScaffold VMConnection + * @run compile -g ModificationWatchpoints.java + * @run driver ModificationWatchpoints */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ModulesTest.java --- a/jdk/test/com/sun/jdi/ModulesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ModulesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,14 +22,13 @@ */ /** - * @test - * @bug 8049365 - * @summary Tests the JDI and JDWP update for modules + * @test + * @bug 8049365 + * @summary Tests the JDI and JDWP update for modules * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g ModulesTest.java - * @run driver ModulesTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g ModulesTest.java + * @run driver ModulesTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/MonitorEventTest.java --- a/jdk/test/com/sun/jdi/MonitorEventTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/MonitorEventTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4401399 - * @summary Simple basic test of jdi Monitor request and event. + * @test + * @bug 4401399 + * @summary Simple basic test of jdi Monitor request and event. + * @author Swamy Venkataramanappa * - * @author Swamy Venkataramanappa - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g MonitorEventTest.java - * @run driver MonitorEventTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g MonitorEventTest.java + * @run driver MonitorEventTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/MonitorFrameInfo.java --- a/jdk/test/com/sun/jdi/MonitorFrameInfo.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/MonitorFrameInfo.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,16 @@ */ /** - * @test - * @bug 6230699 - * @summary Test ThreadReference.ownedMonitorsAndFrames() - * @bug 6701700 - * @summary MonitorInfo objects aren't invalidated when the owning thread is resumed - * @author Swamy Venkataramanappa + * @test + * @bug 6230699 + * @summary Test ThreadReference.ownedMonitorsAndFrames() + * @bug 6701700 + * @summary MonitorInfo objects aren't invalidated when the owning thread is resumed + * @author Swamy Venkataramanappa * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g MonitorFrameInfo.java - * @run driver MonitorFrameInfo + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g MonitorFrameInfo.java + * @run driver MonitorFrameInfo */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/MultiBreakpointsTest.java --- a/jdk/test/com/sun/jdi/MultiBreakpointsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/MultiBreakpointsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,16 +23,14 @@ /** - * @test - * @bug 4359247 - * @summary Breakpoints on multiple threads have problems. + * @test + * @bug 4359247 + * @summary Breakpoints on multiple threads have problems. + * @author tbell, jjh * - * @author tbell, jjh - * - * @modules jdk.jdi - * @build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g MultiBreakpointsTest.java - * @run driver MultiBreakpointsTest + * @build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g MultiBreakpointsTest.java + * @run driver MultiBreakpointsTest */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/NativeInstanceFilter.java --- a/jdk/test/com/sun/jdi/NativeInstanceFilter.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/NativeInstanceFilter.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 6426034 - * @summary Instance filter doesn't filter event if it occurs in native method + * @test + * @bug 6426034 + * @summary Instance filter doesn't filter event if it occurs in native method + * @author Keith McGuigan * - * @author Keith McGuigan - * - * @modules jdk.jdi - * @run build JDIScaffold VMConnection - * @compile -XDignore.symbol.file NativeInstanceFilterTarg.java - * @run driver NativeInstanceFilter + * @run build JDIScaffold VMConnection + * @compile -XDignore.symbol.file NativeInstanceFilterTarg.java + * @run driver NativeInstanceFilter */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/NewInstanceTest.java --- a/jdk/test/com/sun/jdi/NewInstanceTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/NewInstanceTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,15 @@ */ /** - * @test - * @bug 4419450 - * @summary Test newInstance() for arrays - currently covers - * only reference type arrays (see bug #4450091). + * @test + * @bug 4419450 + * @summary Test newInstance() for arrays - currently covers + * only reference type arrays (see bug #4450091). + * @author Robert Field * - * @author Robert Field - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g NewInstanceTest.java - * @run driver NewInstanceTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g NewInstanceTest.java + * @run driver NewInstanceTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/NoLaunchOptionTest.java --- a/jdk/test/com/sun/jdi/NoLaunchOptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/NoLaunchOptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -30,8 +30,9 @@ * @bug 4554734 4724714 * @summary Test for -Xrunjdwp:[onthrow,onuncaught] suboptions require launch suboption * @author Tim Bell + * * @library /lib/testlibrary - * @modules jdk.jdi + * * @run compile -g NoLaunchOptionTest.java * @build jdk.testlibrary.* VMConnection * @run driver NoLaunchOptionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/NoLocInfoTest.java --- a/jdk/test/com/sun/jdi/NoLocInfoTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/NoLocInfoTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,15 @@ */ /** - * @test - * @bug 4642611 - * @summary Test that method.allLineLocations() should - * throw AbsentInformationException exception + * @test + * @bug 4642611 + * @summary Test that method.allLineLocations() should + * throw AbsentInformationException exception + * @author Serguei Spitsyn * - * @author Serguei Spitsyn - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g:none NoLocInfoTest.java - * @run driver NoLocInfoTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g:none NoLocInfoTest.java + * @run driver NoLocInfoTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/NullThreadGroupNameTest.java --- a/jdk/test/com/sun/jdi/NullThreadGroupNameTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/NullThreadGroupNameTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,13 +22,12 @@ */ /** - * @test - * @bug 7105883 - * @summary Ensure that JDWP doesn't crash with a null thread group name + * @test + * @bug 7105883 + * @summary Ensure that JDWP doesn't crash with a null thread group name * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run driver NullThreadGroupNameTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run driver NullThreadGroupNameTest */ import com.sun.jdi.*; import com.sun.jdi.connect.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/OnThrowTest.java --- a/jdk/test/com/sun/jdi/OnThrowTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/OnThrowTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,15 @@ */ /* - * @test OnThrowTest.java - * @bug 6263814 - * @summary Test for -agentlib::[onthrow,launch] - * @author Kelly O'Hair + * @test OnThrowTest.java + * @bug 6263814 + * @summary Test for -agentlib::[onthrow,launch] + * @author Kelly O'Hair * - * @modules jdk.jdi - * @run compile -g OnThrowTest.java - * @run compile -g OnThrowTarget.java - * @run compile -g VMConnection.java - * @run driver OnThrowTest + * @run compile -g OnThrowTest.java + * @run compile -g OnThrowTarget.java + * @run compile -g VMConnection.java + * @run driver OnThrowTest */ import java.io.File; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/OptionTest.java --- a/jdk/test/com/sun/jdi/OptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/OptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,15 @@ */ /* - * @test OptionTest - * @bug 5095072 - * @summary Test for misc jdwp options, just that the option is parsed - * @author Kelly O'Hair (copied from Tim Bell's NoLaunchOptionTest) + * @test OptionTest + * @bug 5095072 + * @summary Test for misc jdwp options, just that the option is parsed + * @author Kelly O'Hair (copied from Tim Bell's NoLaunchOptionTest) * - * @modules jdk.jdi - * @run compile -g OptionTest.java - * @run compile -g HelloWorld.java - * @run compile -g VMConnection.java - * @run driver OptionTest + * @run compile -g OptionTest.java + * @run compile -g HelloWorld.java + * @run compile -g VMConnection.java + * @run driver OptionTest */ import java.net.ServerSocket; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/PopAndInvokeTest.java --- a/jdk/test/com/sun/jdi/PopAndInvokeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/PopAndInvokeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,16 @@ */ /** - * @test - * @bug 6517249 - * @modules jdk.jdi - * @ignore 6951287 - * @summary JDWP: Cannot do an invokeMethod after a popFrames operation + * @test + * @bug 6517249 + * @summary JDWP: Cannot do an invokeMethod after a popFrames operation + * @author jjh * - * @author jjh + * @ignore 6951287 * - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g PopAndInvokeTest.java - * @run driver PopAndInvokeTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g PopAndInvokeTest.java + * @run driver PopAndInvokeTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/PopAsynchronousTest.java --- a/jdk/test/com/sun/jdi/PopAsynchronousTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/PopAsynchronousTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,15 @@ */ /** - * @test - * @bug 4467564 - * @summary Test the popping of frames in an asynchronous context - * (that is, when suspended by the debugger at random points) + * @test + * @bug 4467564 + * @summary Test the popping of frames in an asynchronous context + * (that is, when suspended by the debugger at random points) + * @author Robert Field * - * @author Robert Field - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g PopAsynchronousTest.java - * @run driver PopAsynchronousTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g PopAsynchronousTest.java + * @run driver PopAsynchronousTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/PopSynchronousTest.java --- a/jdk/test/com/sun/jdi/PopSynchronousTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/PopSynchronousTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,15 @@ */ /** - * @test - * @bug 4467564 - * @summary Test the popping of frames in synchronous context - * (that is, when stopped at an event) + * @test + * @bug 4467564 + * @summary Test the popping of frames in synchronous context + * (that is, when stopped at an event) + * @author Robert Field * - * @author Robert Field - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g PopSynchronousTest.java - * @run driver PopSynchronousTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g PopSynchronousTest.java + * @run driver PopSynchronousTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/RedefineCrossEvent.java --- a/jdk/test/com/sun/jdi/RedefineCrossEvent.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/RedefineCrossEvent.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,52 +22,52 @@ */ /** - * @test - * @bug 4628726 - * @summary Test class redefinition at each event cross tested with other tests + * @test + * @bug 4628726 + * @summary Test class redefinition at each event cross tested with other tests + * @author Robert Field * - * @author Robert Field + * @modules java.corba + * jdk.jdi * - * @modules java.corba - * jdk.jdi - * @run build TestScaffold VMConnection TargetAdapter TargetListener - * @run compile -g AccessSpecifierTest.java - * @run compile -g AfterThreadDeathTest.java - * @run compile -g ArrayRangeTest.java - * @run compile -g BacktraceFieldTest.java - * @run compile -g ClassesByName2Test.java - * @run compile -g DebuggerThreadTest.java - * @run compile -g DeleteEventRequestsTest.java - * @run compile -g ExceptionEvents.java - * @run compile -g ExpiredRequestDeletionTest.java - * @run compile -g FieldWatchpoints.java - * @run build InstanceFilter - * @run compile -g LocationTest.java - * @run compile -g NewInstanceTest.java - * @run compile -g PopSynchronousTest.java - * @run compile -g RepStepTarg.java - * @run compile -g RequestReflectionTest.java + * @run build TestScaffold VMConnection TargetAdapter TargetListener + * @run compile -g AccessSpecifierTest.java + * @run compile -g AfterThreadDeathTest.java + * @run compile -g ArrayRangeTest.java + * @run compile -g BacktraceFieldTest.java + * @run compile -g ClassesByName2Test.java + * @run compile -g DebuggerThreadTest.java + * @run compile -g DeleteEventRequestsTest.java + * @run compile -g ExceptionEvents.java + * @run compile -g ExpiredRequestDeletionTest.java + * @run compile -g FieldWatchpoints.java + * @run build InstanceFilter + * @run compile -g LocationTest.java + * @run compile -g NewInstanceTest.java + * @run compile -g PopSynchronousTest.java + * @run compile -g RepStepTarg.java + * @run compile -g RequestReflectionTest.java * - * @run driver AccessSpecifierTest -redefstart -redefevent - * @run driver AfterThreadDeathTest -redefstart -redefevent - * @run driver ArrayRangeTest -redefstart -redefevent - * @run driver BacktraceFieldTest -redefstart -redefevent - * @run driver ClassesByName2Test -redefstart -redefevent - * @run driver DebuggerThreadTest -redefstart -redefevent - * @run driver DeleteEventRequestsTest -redefstart -redefevent - * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.Exception - * @run driver ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg null - * @run driver ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg java.lang.StackOverflowError - * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.NullPointerException - * @run driver ExceptionEvents -redefstart -redefevent C T StackOverflowCaughtTarg java.lang.Error - * @run driver ExceptionEvents -redefstart -redefevent N T StackOverflowCaughtTarg java.lang.NullPointerException - * @run driver ExceptionEvents -redefstart -redefevent N N StackOverflowCaughtTarg java.lang.Exception - * @run driver ExceptionEvents -redefstart -redefevent C N StackOverflowCaughtTarg java.lang.Error - * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowUncaughtTarg java.lang.Exception - * @run driver ExpiredRequestDeletionTest -redefstart -redefevent - * @run driver FieldWatchpoints -redefstart -redefevent - * @run driver InstanceFilter -redefstart -redefevent - * @run driver LocationTest -redefstart -redefevent - * @run driver NewInstanceTest -redefstart -redefevent - * @run driver RequestReflectionTest -redefstart -redefevent + * @run driver AccessSpecifierTest -redefstart -redefevent + * @run driver AfterThreadDeathTest -redefstart -redefevent + * @run driver ArrayRangeTest -redefstart -redefevent + * @run driver BacktraceFieldTest -redefstart -redefevent + * @run driver ClassesByName2Test -redefstart -redefevent + * @run driver DebuggerThreadTest -redefstart -redefevent + * @run driver DeleteEventRequestsTest -redefstart -redefevent + * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.Exception + * @run driver ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg null + * @run driver ExceptionEvents -redefstart -redefevent C A StackOverflowCaughtTarg java.lang.StackOverflowError + * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowCaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents -redefstart -redefevent C T StackOverflowCaughtTarg java.lang.Error + * @run driver ExceptionEvents -redefstart -redefevent N T StackOverflowCaughtTarg java.lang.NullPointerException + * @run driver ExceptionEvents -redefstart -redefevent N N StackOverflowCaughtTarg java.lang.Exception + * @run driver ExceptionEvents -redefstart -redefevent C N StackOverflowCaughtTarg java.lang.Error + * @run driver ExceptionEvents -redefstart -redefevent N A StackOverflowUncaughtTarg java.lang.Exception + * @run driver ExpiredRequestDeletionTest -redefstart -redefevent + * @run driver FieldWatchpoints -redefstart -redefevent + * @run driver InstanceFilter -redefstart -redefevent + * @run driver LocationTest -redefstart -redefevent + * @run driver NewInstanceTest -redefstart -redefevent + * @run driver RequestReflectionTest -redefstart -redefevent */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/RedefineCrossStart.java --- a/jdk/test/com/sun/jdi/RedefineCrossStart.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/RedefineCrossStart.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,29 +22,28 @@ */ /** - * @test - * @bug 4628726 - * @summary Test class redefinition at start only (they use breakpoint - * or resumeTo()) cross tested with other tests. - * ExceptionEvents/StackOverflowUncaughtTarg are here because they hit - * an unrelated crash in event testing. + * @test + * @bug 4628726 + * @summary Test class redefinition at start only (they use breakpoint + * or resumeTo()) cross tested with other tests. + * ExceptionEvents/StackOverflowUncaughtTarg are here because they hit + * an unrelated crash in event testing. * - * @author Robert Field + * @author Robert Field * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g CountEvent.java - * @run compile -g CountFilterTest.java - * @run compile -g FramesTest.java - * @run compile -g InvokeTest.java + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g CountEvent.java + * @run compile -g CountFilterTest.java + * @run compile -g FramesTest.java + * @run compile -g InvokeTest.java * - * @run driver CountEvent -redefstart - * @run driver CountFilterTest -redefstart - * @run driver FramesTest -redefstart - * @run driver InvokeTest -redefstart + * @run driver CountEvent -redefstart + * @run driver CountFilterTest -redefstart + * @run driver FramesTest -redefstart + * @run driver InvokeTest -redefstart * - * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg null - * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.Error - * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.StackOverflowError - * @run driver PopSynchronousTest -redefstart + * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg null + * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.Error + * @run driver ExceptionEvents -redefstart U A StackOverflowUncaughtTarg java.lang.StackOverflowError + * @run driver PopSynchronousTest -redefstart */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ReferrersTest.java --- a/jdk/test/com/sun/jdi/ReferrersTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ReferrersTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,15 +22,14 @@ */ /** - * @test - * @bug 5089849 - * @summary Add support for backtracking reference graph. - * @author jjh + * @test + * @bug 5089849 + * @summary Add support for backtracking reference graph. + * @author jjh * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g ReferrersTest.java - * @run driver ReferrersTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g ReferrersTest.java + * @run driver ReferrersTest */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/RepStep.java --- a/jdk/test/com/sun/jdi/RepStep.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/RepStep.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,18 +22,16 @@ */ /** - * @test - * @bug 4334008 - * @author Robert Field - * - * @modules jdk.jdi - * @run compile -g RepStepTarg.java - * @run build VMConnection RepStep - * - * @run driver RepStep - * + * @test + * @bug 4334008 * @summary RepStep detects missed step events due to lack of * frame pop events (in back-end). + * @author Robert Field + * + * @run compile -g RepStepTarg.java + * @run build VMConnection RepStep + * + * @run driver RepStep */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/RequestReflectionTest.java --- a/jdk/test/com/sun/jdi/RequestReflectionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/RequestReflectionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,15 @@ */ /** - * @test - * @bug 4425840 - * @author Robert Field + * @test + * @bug 4425840 + * @summary RequestReflectionTest checks to see that reflective + * accessors on EventRequests return what they are given. + * @author Robert Field * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g RequestReflectionTest.java - * @run driver RequestReflectionTest - * - * @summary RequestReflectionTest checks to see that reflective - * accessors on EventRequests return what they are given. + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g RequestReflectionTest.java + * @run driver RequestReflectionTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ResumeOneThreadTest.java --- a/jdk/test/com/sun/jdi/ResumeOneThreadTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ResumeOneThreadTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 6700889 - * @summary Thread resume invalidates all stack frames, even from other threads + * @test + * @bug 6700889 + * @summary Thread resume invalidates all stack frames, even from other threads + * @author jjh * - * @author jjh - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g ResumeOneThreadTest.java - * @run driver ResumeOneThreadTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g ResumeOneThreadTest.java + * @run driver ResumeOneThreadTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/SDENullTest.java --- a/jdk/test/com/sun/jdi/SDENullTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/SDENullTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,15 @@ */ /** - * @test - * @bug 4621289 - * @summary vm.setDefaultStratum(null) causes a Null Ptr exception + * @test + * @bug 4621289 + * @summary vm.setDefaultStratum(null) causes a Null Ptr exception * - * @author jjh + * @author jjh * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g SDENullTest.java - * @run driver SDENullTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g SDENullTest.java + * @run driver SDENullTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/SimulResumerTest.java --- a/jdk/test/com/sun/jdi/SimulResumerTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/SimulResumerTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,15 @@ */ /** - * @test - * @bug 6751643 - * @summary ThreadReference.ownedMonitors() can return null - * - * @author jjh + * @test + * @bug 6751643 + * @key intermittent + * @summary ThreadReference.ownedMonitors() can return null + * @author jjh * - * @key intermittent - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g SimulResumerTest.java - * @run driver SimulResumerTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g SimulResumerTest.java + * @run driver SimulResumerTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/SourceNameFilterTest.java --- a/jdk/test/com/sun/jdi/SourceNameFilterTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/SourceNameFilterTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,18 +22,16 @@ */ /** - * @test - * @bug 4836939 6646613 - * @summary JDI add addSourceNameFilter to ClassPrepareRequest - * - * @author jjh + * @test + * @bug 4836939 6646613 + * @summary JDI add addSourceNameFilter to ClassPrepareRequest + * @author jjh * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g SourceNameFilterTest.java - * @run driver SourceNameFilterTest - * @run compile -g:none SourceNameFilterTest.java - * @run driver SourceNameFilterTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g SourceNameFilterTest.java + * @run driver SourceNameFilterTest + * @run compile -g:none SourceNameFilterTest.java + * @run driver SourceNameFilterTest */ // The compile -g:none suppresses the lineNumber table to trigger bug 6646613. diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/StepTest.java --- a/jdk/test/com/sun/jdi/StepTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/StepTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,15 @@ */ /** - * @test - * @bug 4270488 4787861 - * @author Gordon Hirsch + * @test + * @bug 4270488 4787861 + * @author Gordon Hirsch * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetAdapter TargetListener - * @run compile -g MethodCalls.java - * @run compile -g MethodCallsReflection.java - * @run compile -g ControlFlow.java - * @run build StepTest + * @run build TestScaffold VMConnection TargetAdapter TargetListener + * @run compile -g MethodCalls.java + * @run compile -g MethodCallsReflection.java + * @run compile -g ControlFlow.java + * @run build StepTest * * @summary StepTest starts at a method named "go()" in the debuggee and * repetitively steps. It will do a step into until the maximum @@ -46,21 +45,21 @@ * for the debuggee files- MethodCalls.java, ... * See LineNumberInfo.java for more info. * - * +--- maximum stack depth in debuggee - * | +--- step granularity: "line" or "min" - * | | +---Expected number of steps - * | | | +--- Debuggee command Line - * V V V V Workaround-----+ - * V - * @run driver StepTest 2 line 2 MethodCalls - * @run driver StepTest 3 line 14 MethodCalls + * +--- maximum stack depth in debuggee + * | +--- step granularity: "line" or "min" + * | | +---Expected number of steps + * | | | +--- Debuggee command Line + * V V V V Workaround-----+ + * V + * @run driver StepTest 2 line 2 MethodCalls + * @run driver StepTest 3 line 14 MethodCalls * - * @run driver StepTest 2 line 18 MethodCallsReflection 12 + * @run driver StepTest 2 line 18 MethodCallsReflection 12 * - * @run driver StepTest 2 min 4 MethodCalls - * @run driver StepTest 3 min 43 MethodCalls + * @run driver StepTest 2 min 4 MethodCalls + * @run driver StepTest 3 min 43 MethodCalls * - * @run driver StepTest 2 line 65 ControlFlow 64 + * @run driver StepTest 2 line 65 ControlFlow 64 */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/SuspendThreadTest.java --- a/jdk/test/com/sun/jdi/SuspendThreadTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/SuspendThreadTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 6485605 - * @summary com.sun.jdi.InternalException: Inconsistent suspend policy in internal event handler + * @test + * @bug 6485605 + * @summary com.sun.jdi.InternalException: Inconsistent suspend policy in internal event handler + * @author jjh * - * @author jjh - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g SuspendThreadTest.java - * @run driver SuspendThreadTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g SuspendThreadTest.java + * @run driver SuspendThreadTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/com/sun/jdi/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = jdk.jdi + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/TemplateTest.java --- a/jdk/test/com/sun/jdi/TemplateTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/TemplateTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,16 +25,14 @@ // TEMPLATE: change bug number and fill out and // TEMPLATE: delete TEMPLATE lines /** - * @test - * @bug 0000000 - * @summary + * @test + * @bug 0000000 + * @summary + * @author * - * @author - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g TemplateTest.java - * @run driver TemplateTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g TemplateTest.java + * @run driver TemplateTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/ThreadGroupTest.java --- a/jdk/test/com/sun/jdi/ThreadGroupTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/ThreadGroupTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,15 @@ */ /** - * @test - * @bug 4893530 - * @summary If JDI is initially started from a thread group that is subsequently - * destroyed this should not impact subsequent thread creation by - * the virtual machine manager. + * @test + * @bug 4893530 + * @summary If JDI is initially started from a thread group that is subsequently + * destroyed this should not impact subsequent thread creation by + * the virtual machine manager. * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile ThreadGroupTest.java - * @run driver ThreadGroupTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile ThreadGroupTest.java + * @run driver ThreadGroupTest */ import com.sun.jdi.*; import com.sun.jdi.connect.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/TwoThreadsTest.java --- a/jdk/test/com/sun/jdi/TwoThreadsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/TwoThreadsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 6296125 - * @summary JDI: Disabling an EventRequest can cause a multi-threaded debuggee to hang + * @test + * @bug 6296125 + * @summary JDI: Disabling an EventRequest can cause a multi-threaded debuggee to hang + * @author jjh * - * @author jjh - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g TwoThreadsTest.java - * @run driver TwoThreadsTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g TwoThreadsTest.java + * @run driver TwoThreadsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/UTF8Test.java --- a/jdk/test/com/sun/jdi/UTF8Test.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/UTF8Test.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 5033550 - * @summary JDWP back end uses modified UTF-8 + * @test + * @bug 5033550 + * @summary JDWP back end uses modified UTF-8 + * @author jjh * - * @author jjh - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g UTF8Test.java - * @run driver UTF8Test + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g UTF8Test.java + * @run driver UTF8Test */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/UnpreparedByName.java --- a/jdk/test/com/sun/jdi/UnpreparedByName.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/UnpreparedByName.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,18 +22,17 @@ */ /** - * @test - * @bug 4368402 - * @summary UnpreparedByName verifies that unprepared classes - * won't be returned by classesByName. - * @author Robert Field + * @test + * @bug 4368402 + * @summary UnpreparedByName verifies that unprepared classes + * won't be returned by classesByName. + * @author Robert Field * - * @modules jdk.jdi - * @run build JDIScaffold VMConnection - * @run compile -g InnerTarg.java - * @run build UnpreparedByName + * @run build JDIScaffold VMConnection + * @run compile -g InnerTarg.java + * @run build UnpreparedByName * - * @run driver UnpreparedByName InnerTarg + * @run driver UnpreparedByName InnerTarg */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/UnpreparedClasses.java --- a/jdk/test/com/sun/jdi/UnpreparedClasses.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/UnpreparedClasses.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,18 +22,17 @@ */ /** - * @test - * @bug 4368402 - * @summary UnpreparedClasses verifies that all the classes in the - * loaded class list are prepared classes. - * @author Robert Field + * @test + * @bug 4368402 + * @summary UnpreparedClasses verifies that all the classes in the + * loaded class list are prepared classes. + * @author Robert Field * - * @modules jdk.jdi - * @run build JDIScaffold VMConnection - * @run compile -g InnerTarg.java - * @run build UnpreparedClasses + * @run build JDIScaffold VMConnection + * @run compile -g InnerTarg.java + * @run build UnpreparedClasses * - * @run driver UnpreparedClasses InnerTarg + * @run driver UnpreparedClasses InnerTarg */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/VMDeathLastTest.java --- a/jdk/test/com/sun/jdi/VMDeathLastTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/VMDeathLastTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,17 +22,15 @@ */ /** - * @test - * @bug 4420844 4449394 - * @summary Checks that no events are sent after VMDeath, and test vm.canBeModified - * - * @author Robert Field + * @test + * @bug 4420844 4449394 + * @summary Checks that no events are sent after VMDeath, and test vm.canBeModified + * @author Robert Field * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g HelloWorld.java - * @run build VMDeathLastTest - * @run driver VMDeathLastTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g HelloWorld.java + * @run build VMDeathLastTest + * @run driver VMDeathLastTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/VMDeathRequestTest.java --- a/jdk/test/com/sun/jdi/VMDeathRequestTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/VMDeathRequestTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,22 +22,20 @@ */ /** - * @test - * @bug 4419314 - * @author Robert Field - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g HelloWorld.java - * @run build VMDeathRequestTest - * @run driver VMDeathRequestTest - * + * @test + * @bug 4419314 * @summary VMDeathRequestTest checks to see that * VMDisconnectedException is never thrown before VMDisconnectEvent. * * Failure mode for this test is throwing VMDisconnectedException * on vm.eventQueue().remove(); * Does not use a scaffold since we don't want that hiding the exception. + * @author Robert Field + * + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g HelloWorld.java + * @run build VMDeathRequestTest + * @run driver VMDeathRequestTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/VarargsTest.java --- a/jdk/test/com/sun/jdi/VarargsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/VarargsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @bug 4870984 - * @summary JPDA: Add support for RFE 4856541 - varargs + * @test + * @bug 4870984 + * @summary JPDA: Add support for RFE 4856541 - varargs + * @author jjh * - * @author jjh - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g VarargsTest.java - * @run driver VarargsTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g VarargsTest.java + * @run driver VarargsTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/Vars.java --- a/jdk/test/com/sun/jdi/Vars.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/Vars.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,15 +22,13 @@ */ /** - * @test - * @summary Test Method.variables() and the like. - * - * @author Robert Field + * @test + * @summary Test Method.variables() and the like. + * @author Robert Field * - * @modules jdk.jdi - * @run build JDIScaffold VMConnection - * @run compile -g Vars.java - * @run driver Vars + * @run build JDIScaffold VMConnection + * @run compile -g Vars.java + * @run driver Vars */ import com.sun.jdi.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/VisibleMethods.java --- a/jdk/test/com/sun/jdi/VisibleMethods.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/VisibleMethods.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,16 +22,14 @@ */ /** - * @test - * @summary Test ReferenceType.visibleMethods - * @bug 8028430 + * @test + * @summary Test ReferenceType.visibleMethods + * @bug 8028430 + * @author Staffan Larsen * - * @author Staffan Larsen - * - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g VisibleMethods.java - * @run driver VisibleMethods + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g VisibleMethods.java + * @run driver VisibleMethods */ import com.sun.jdi.Method; import com.sun.jdi.ReferenceType; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/connect/spi/GeneratedConnectors.java --- a/jdk/test/com/sun/jdi/connect/spi/GeneratedConnectors.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/connect/spi/GeneratedConnectors.java Wed Jul 05 23:09:40 2017 +0200 @@ -30,7 +30,6 @@ * to encapsulate the transport. This tests that the connectors are * created and that they have an "address" argument. * - * @modules jdk.jdi/com.sun.tools.jdi * @build GeneratedConnectors NullTransportService SimpleLaunchingConnector * @run main/othervm GeneratedConnectors */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/redefine/RedefineTest.java --- a/jdk/test/com/sun/jdi/redefine/RedefineTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/redefine/RedefineTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,20 +22,20 @@ */ /** - * @test - * @bug 4287595 - * @bug 4462989 - * @bug 4531511 - * @summary Test class redefinition + * @test + * @bug 4287595 + * @bug 4462989 + * @bug 4531511 + * @summary Test class redefinition * - * @author Robert Field + * @author Robert Field + * + * @library .. * - * @library .. - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g RedefineTest.java - * @run shell RedefineSetUp.sh - * @run driver RedefineTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g RedefineTest.java + * @run shell RedefineSetUp.sh + * @run driver RedefineTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/redefineMethod/RedefineTest.java --- a/jdk/test/com/sun/jdi/redefineMethod/RedefineTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/redefineMethod/RedefineTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,19 +22,18 @@ */ /** - * @test - * @bug 4628726 - * @summary Test class redefinition - method data line numbers and local vars, - * - * @author Robert Field + * @test + * @bug 4628726 + * @summary Test class redefinition - method data line numbers and local vars, + * @author Robert Field * - * @library .. - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter - * @run compile -g RedefineTest.java - * @run shell RedefineSetUp.sh - * @run driver RedefineTest -repeat 3 - * @run driver RedefineTest + * @library .. + * + * @run build TestScaffold VMConnection TargetListener TargetAdapter + * @run compile -g RedefineTest.java + * @run shell RedefineSetUp.sh + * @run driver RedefineTest -repeat 3 + * @run driver RedefineTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/sde/FilterMangleTest.java --- a/jdk/test/com/sun/jdi/sde/FilterMangleTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/sde/FilterMangleTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,31 +1,30 @@ /** - * @test - * @bug 4836939 - * @summary JDI add addSourceNameFilter to ClassPrepareRequest + * @test + * @bug 4836939 + * @key intermittent + * @summary JDI add addSourceNameFilter to ClassPrepareRequest + * @author Robert Field / Jim Holmlund * - * @author Robert Field / Jim Holmlund + * @library .. * - * @key intermittent - * @library .. - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE - * @run compile FilterMangleTest.java - * @run compile -g onion/pickle/Mangle.java - * @run driver FilterMangleTest - * @run driver FilterMangleTest SDE-pMangle.java* - * @run driver FilterMangleTest SDE-pMangle.jav* - * @run driver FilterMangleTest SDE-pMangle.j* - * @run driver FilterMangleTest SDE-p*Mangle.java - * @run driver FilterMangleTest SDE-p*angle.java - * @run driver FilterMangleTest SDE-p*java - * @run driver FilterMangleTest SDE-pMangle.xyz - * @run driver FilterMangleTest SDE-pIncl.rats* - * @run driver FilterMangleTest SDE-pIncl.rat* - * @run driver FilterMangleTest SDE-p*angle.rats - * @run driver FilterMangleTest SDE-f*Incl.rat - * @run driver FilterMangleTest SDE-ffred - * @run driver FilterMangleTest SDE-f*ratsx - * @run driver FilterMangleTest SDE-fMangle.javax* + * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE + * @run compile FilterMangleTest.java + * @run compile -g onion/pickle/Mangle.java + * @run driver FilterMangleTest + * @run driver FilterMangleTest SDE-pMangle.java* + * @run driver FilterMangleTest SDE-pMangle.jav* + * @run driver FilterMangleTest SDE-pMangle.j* + * @run driver FilterMangleTest SDE-p*Mangle.java + * @run driver FilterMangleTest SDE-p*angle.java + * @run driver FilterMangleTest SDE-p*java + * @run driver FilterMangleTest SDE-pMangle.xyz + * @run driver FilterMangleTest SDE-pIncl.rats* + * @run driver FilterMangleTest SDE-pIncl.rat* + * @run driver FilterMangleTest SDE-p*angle.rats + * @run driver FilterMangleTest SDE-f*Incl.rat + * @run driver FilterMangleTest SDE-ffred + * @run driver FilterMangleTest SDE-f*ratsx + * @run driver FilterMangleTest SDE-fMangle.javax* */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/sde/MangleStepTest.java --- a/jdk/test/com/sun/jdi/sde/MangleStepTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/sde/MangleStepTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,21 +1,20 @@ /** - * @test - * @bug 4390869 - * @bug 4460328 - * @summary Test Stepping in the new SourceDebugExtension facility + * @test + * @bug 4390869 + * @bug 4460328 + * @summary Test Stepping in the new SourceDebugExtension facility + * @author Robert Field * - * @author Robert Field + * @library .. * - * @library .. - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE - * @run compile MangleStepTest.java - * @run compile -g onion/pickle/Mangle.java - * @run driver MangleStepTest unset - * @run driver MangleStepTest Java - * @run driver MangleStepTest XYZ - * @run driver MangleStepTest Rats - * @run driver MangleStepTest bogus + * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE + * @run compile MangleStepTest.java + * @run compile -g onion/pickle/Mangle.java + * @run driver MangleStepTest unset + * @run driver MangleStepTest Java + * @run driver MangleStepTest XYZ + * @run driver MangleStepTest Rats + * @run driver MangleStepTest bogus */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/sde/MangleTest.java --- a/jdk/test/com/sun/jdi/sde/MangleTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/sde/MangleTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,17 +1,16 @@ /** - * @test - * @bug 4390869 - * @bug 4460328 - * @summary Test the new SourceDebugExtension facility + * @test + * @bug 4390869 + * @bug 4460328 + * @summary Test the new SourceDebugExtension facility + * @author Robert Field * - * @author Robert Field + * @library .. * - * @library .. - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE - * @run compile MangleTest.java - * @run compile -g onion/pickle/Mangle.java - * @run driver MangleTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE + * @run compile MangleTest.java + * @run compile -g onion/pickle/Mangle.java + * @run driver MangleTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/sde/SourceDebugExtensionTest.java --- a/jdk/test/com/sun/jdi/sde/SourceDebugExtensionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/sde/SourceDebugExtensionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,17 +1,16 @@ /** - * @test - * @bug 4390869 - * @bug 4460328 - * @summary Test the new SourceDebugExtension facility + * @test + * @bug 4390869 + * @bug 4460328 + * @summary Test the new SourceDebugExtension facility + * @author Robert Field * - * @author Robert Field + * @library .. * - * @library .. - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE - * @run compile SourceDebugExtensionTest.java - * @run compile -g SourceDebugExtensionTarg.java - * @run driver SourceDebugExtensionTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE + * @run compile SourceDebugExtensionTest.java + * @run compile -g SourceDebugExtensionTarg.java + * @run driver SourceDebugExtensionTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/jdi/sde/TemperatureTableTest.java --- a/jdk/test/com/sun/jdi/sde/TemperatureTableTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/jdi/sde/TemperatureTableTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,17 +1,16 @@ /** - * @test - * @bug 4390869 - * @bug 4460328 - * @summary Test the new SourceDebugExtension facility + * @test + * @bug 4390869 + * @bug 4460328 + * @summary Test the new SourceDebugExtension facility + * @author Robert Field * - * @author Robert Field + * @library .. * - * @library .. - * @modules jdk.jdi - * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE HelloWorld - * @run compile TemperatureTableTest.java - * @run compile -g TemperatureTableServlet.java - * @run driver TemperatureTableTest + * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE HelloWorld + * @run compile TemperatureTableTest.java + * @run compile -g TemperatureTableServlet.java + * @run driver TemperatureTableTest */ import com.sun.jdi.*; import com.sun.jdi.event.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanDoubleInvocationTest.java --- a/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanDoubleInvocationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanDoubleInvocationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Basic Test for the DiagnosticCommandMBean * @author Frederic Parain, Shanliang JIANG * - * @modules jdk.management * @run main/othervm DcmdMBeanDoubleInvocationTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanInvocationTest.java --- a/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanInvocationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanInvocationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Basic Test for the DiagnosticCommandMBean * @author Frederic Parain, Shanliang JIANG * - * @modules jdk.management * @run main/othervm DcmdMBeanInvocationTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanPermissionsTest.java --- a/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanPermissionsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanPermissionsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,9 @@ * @summary Permissions Tests for the DiagnosticCommandMBean * @author Frederic Parain * - * @modules jdk.management + * @modules java.logging + * java.management + * * @run main/othervm DcmdMBeanPermissionsTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanTest.java --- a/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/DiagnosticCommandMBean/DcmdMBeanTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Basic Test for the DiagnosticCommandMBean * @author Frederic Parain, Shanliang JIANG * - * @modules jdk.management * @run main/othervm DcmdMBeanTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/GarbageCollectorMXBean/LastGCInfo.java --- a/jdk/test/com/sun/management/GarbageCollectorMXBean/LastGCInfo.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/GarbageCollectorMXBean/LastGCInfo.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Sanity Test for GarbageCollectorMXBean.getLastGcInfo(). * @author Mandy Chung * - * @modules jdk.management * @run main/othervm -XX:-ExplicitGCInvokesConcurrent LastGCInfo */ // Passing "-XX:-ExplicitGCInvokesConcurrent" to force System.gc() diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/HotSpotDiagnosticMXBean/GetDiagnosticOptions.java --- a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/GetDiagnosticOptions.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/GetDiagnosticOptions.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Basic Test for HotSpotDiagnosticMXBean.getDiagnosticOptions() * @author Daniel Fuchs * - * @modules jdk.management * @run main GetDiagnosticOptions */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/HotSpotDiagnosticMXBean/GetDoubleVMOption.java --- a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/GetDoubleVMOption.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/GetDoubleVMOption.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Basic Test for HotSpotDiagnosticMXBean.getVMOption() and double values * @author Jaroslav Bachorik * - * @modules jdk.management * @run main/othervm -XX:CompileThresholdScaling=0.14 GetDoubleVMOption */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/HotSpotDiagnosticMXBean/GetVMOption.java --- a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/GetVMOption.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/GetVMOption.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Basic Test for HotSpotDiagnosticMXBean.getVMOption() * @author Mandy Chung * - * @modules jdk.management * @run main/othervm -XX:+HeapDumpOnOutOfMemoryError GetVMOption */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/HotSpotDiagnosticMXBean/SetAllVMOptions.java --- a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/SetAllVMOptions.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/SetAllVMOptions.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Basic Test for HotSpotDiagnosticMXBean.setVMOption() * @author Tomas Hurka, Daniel Fuchs * - * @modules jdk.management * @run main SetAllVMOptions */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/HotSpotDiagnosticMXBean/SetVMOption.java --- a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/SetVMOption.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/SetVMOption.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,6 @@ * @author Mandy Chung * @author Jaroslav Bachorik * - * @modules jdk.management * @run main/othervm -XX:+HeapDumpOnOutOfMemoryError SetVMOption */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/OperatingSystemMXBean/GetCommittedVirtualMemorySize.java --- a/jdk/test/com/sun/management/OperatingSystemMXBean/GetCommittedVirtualMemorySize.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/OperatingSystemMXBean/GetCommittedVirtualMemorySize.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 4858522 6191542 * @summary Basic unit test of OperatingSystemMXBean.getCommittedVirtualMemorySize() * @author Steve Bohne - * @modules jdk.management */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/OperatingSystemMXBean/GetFreePhysicalMemorySize.java --- a/jdk/test/com/sun/management/OperatingSystemMXBean/GetFreePhysicalMemorySize.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/OperatingSystemMXBean/GetFreePhysicalMemorySize.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 4858522 * @summary Basic unit test of OperatingSystemMXBean.getFreePhysicalMemorySize() * @author Steve Bohne - * @modules jdk.management */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/OperatingSystemMXBean/GetFreeSwapSpaceSize.java --- a/jdk/test/com/sun/management/OperatingSystemMXBean/GetFreeSwapSpaceSize.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/OperatingSystemMXBean/GetFreeSwapSpaceSize.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 4858522 * @summary Basic unit test of OperatingSystemMXBean.getFreeSwapSpaceSize() * @author Steve Bohne - * @modules jdk.management */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/OperatingSystemMXBean/GetProcessCpuLoad.java --- a/jdk/test/com/sun/management/OperatingSystemMXBean/GetProcessCpuLoad.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/OperatingSystemMXBean/GetProcessCpuLoad.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 7028071 * @summary Basic unit test of OperatingSystemMXBean.getProcessCpuLoad() * - * @modules jdk.management * @run main GetProcessCpuLoad */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/OperatingSystemMXBean/GetProcessCpuTime.java --- a/jdk/test/com/sun/management/OperatingSystemMXBean/GetProcessCpuTime.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/OperatingSystemMXBean/GetProcessCpuTime.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 4858522 * @summary Basic unit test of OperatingSystemMXBean.getProcessCpuTime() * @author Steve Bohne - * @modules jdk.management */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/OperatingSystemMXBean/GetSystemCpuLoad.java --- a/jdk/test/com/sun/management/OperatingSystemMXBean/GetSystemCpuLoad.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/OperatingSystemMXBean/GetSystemCpuLoad.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 7028071 * @summary Basic unit test of OperatingSystemMXBean.getProcessCpuLoad() * - * @modules jdk.management * @run main GetSystemCpuLoad */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/OperatingSystemMXBean/GetTotalPhysicalMemorySize.java --- a/jdk/test/com/sun/management/OperatingSystemMXBean/GetTotalPhysicalMemorySize.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/OperatingSystemMXBean/GetTotalPhysicalMemorySize.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 4858522 * @summary Basic unit test of OperatingSystemMXBean.getTotalPhysicalMemorySize() * @author Steve Bohne - * @modules jdk.management */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/OperatingSystemMXBean/MemoryStatusOverflow.java --- a/jdk/test/com/sun/management/OperatingSystemMXBean/MemoryStatusOverflow.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/OperatingSystemMXBean/MemoryStatusOverflow.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,6 @@ * the GlobalMemoryStatus function can return incorrect information, * reporting a value of -1 to indicate an overflow. * - * @modules jdk.management * @run main MemoryStatusOverflow */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.java --- a/jdk/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,14 +25,13 @@ * @test * @bug 4858522 * @summary Basic unit test of OperatingSystemMXBean.getTotalSwapSpaceSize() + * @author Steve Bohne + * @author Jaroslav Bachorik * * @library /lib/testlibrary - * @modules jdk.management + * * @build TestTotalSwap jdk.testlibrary.* * @run main TestTotalSwap - * - * @author Steve Bohne - * @author Jaroslav Bachorik */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/com/sun/management/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = jdk.management + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/ThreadMXBean/ThreadAllocatedMemory.java --- a/jdk/test/com/sun/management/ThreadMXBean/ThreadAllocatedMemory.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/ThreadMXBean/ThreadAllocatedMemory.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6173675 * @summary Basic test of ThreadMXBean.getThreadAllocatedBytes * @author Paul Hohensee - * @modules jdk.management */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/ThreadMXBean/ThreadAllocatedMemoryArray.java --- a/jdk/test/com/sun/management/ThreadMXBean/ThreadAllocatedMemoryArray.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/ThreadMXBean/ThreadAllocatedMemoryArray.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6173675 * @summary Basic test of ThreadMXBean.getThreadAllocatedBytes(long[]) * @author Paul Hohensee - * @modules jdk.management */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java --- a/jdk/test/com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/ThreadMXBean/ThreadCpuTimeArray.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,11 +24,10 @@ /* * @test * @bug 6173675 + * @key randomness * @summary Basic test of ThreadMXBean.getThreadCpuTime(long[]) and * getThreadUserTime(long[]). * @author Paul Hohensee - * @key randomness - * @modules jdk.management */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/UnixOperatingSystemMXBean/GetMaxFileDescriptorCount.sh --- a/jdk/test/com/sun/management/UnixOperatingSystemMXBean/GetMaxFileDescriptorCount.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/UnixOperatingSystemMXBean/GetMaxFileDescriptorCount.sh Wed Jul 05 23:09:40 2017 +0200 @@ -24,10 +24,9 @@ # # @test # @bug 4858522 -# @summary +# @summary # @author Steve Bohne # -# @modules jdk.management # @run shell GetMaxFileDescriptorCount.sh # @@ -40,7 +39,7 @@ fi runOne() -{ +{ echo "runOne $@" $COMPILEJAVA/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d $TESTCLASSES \ $TESTSRC/$@.java || exit 2 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/UnixOperatingSystemMXBean/GetOpenFileDescriptorCount.sh --- a/jdk/test/com/sun/management/UnixOperatingSystemMXBean/GetOpenFileDescriptorCount.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/UnixOperatingSystemMXBean/GetOpenFileDescriptorCount.sh Wed Jul 05 23:09:40 2017 +0200 @@ -24,10 +24,9 @@ # # @test # @bug 4858522 -# @summary +# @summary # @author Steve Bohne # -# @modules jdk.management # @run shell GetOpenFileDescriptorCount.sh # @@ -39,7 +38,7 @@ COMPILEJAVA="${TESTJAVA}" fi runOne() -{ +{ echo "runOne $@" $COMPILEJAVA/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d $TESTCLASSES \ $TESTSRC/$@.java || exit 2 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/management/VMOptionOpenDataTest.java --- a/jdk/test/com/sun/management/VMOptionOpenDataTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/management/VMOptionOpenDataTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -38,7 +38,6 @@ * @test * @bug 8042901 * @summary Check that MappedMXBeanType.toOpenTypeData supports VMOption - * @modules jdk.management/com.sun.management * @author Shanliang Jiang */ public class VMOptionOpenDataTest { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/tools/attach/BasicTests.java --- a/jdk/test/com/sun/tools/attach/BasicTests.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/tools/attach/BasicTests.java Wed Jul 05 23:09:40 2017 +0200 @@ -40,16 +40,17 @@ /* * @test * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 - * @summary Basic unit tests for the VM attach mechanism. * @key intermittent + * @summary Basic unit tests for the VM attach mechanism. This test will perform + * a number of basic attach tests. + * * @library /lib/testlibrary * @modules java.instrument - * java.management + * jdk.attach * jdk.jartool/sun.tools.jar + * * @run build jdk.testlibrary.* Agent BadAgent RedefineAgent Application RedefineDummy RunnerUtil * @run main BasicTests - * - * This test will perform a number of basic attach tests. */ public class BasicTests { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/tools/attach/PermissionTest.java --- a/jdk/test/com/sun/tools/attach/PermissionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/tools/attach/PermissionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -31,17 +31,15 @@ /* * @test * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 - * @summary Basic unit tests for the VM attach mechanism. - * @modules jdk.jartool/sun.tools.jar + * @summary Basic unit tests for the VM attach mechanism. Unit test for Attach + * API - this checks that a SecurityException is thrown as expected. + * * @library /lib/testlibrary - * @modules java.management - * jdk.attach + * @modules jdk.attach * jdk.jartool/sun.tools.jar + * * @run build jdk.testlibrary.* Application * @run main PermissionTest - * - * Unit test for Attach API - - * this checks that a SecurityException is thrown as expected. */ public class PermissionTest { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/tools/attach/ProviderTest.java --- a/jdk/test/com/sun/tools/attach/ProviderTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/tools/attach/ProviderTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -31,16 +31,15 @@ /* * @test * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 - * @summary Basic unit tests for the VM attach mechanism. - * @modules jdk.jartool/sun.tools.jar + * @summary Basic unit tests for the VM attach mechanism. The test will attach + * and detach to/from the running Application. + * * @library /lib/testlibrary - * @modules java.management - * jdk.attach + * @modules jdk.attach * jdk.jartool/sun.tools.jar + * * @run build jdk.testlibrary.* SimpleProvider * @run main ProviderTest - * - * The test will attach and detach to/from the running Application. */ public class ProviderTest { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/tools/attach/StartManagementAgent.java --- a/jdk/test/com/sun/tools/attach/StartManagementAgent.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/tools/attach/StartManagementAgent.java Wed Jul 05 23:09:40 2017 +0200 @@ -39,11 +39,12 @@ /* * @test * @summary Test for VirtualMachine.startManagementAgent and VirtualMachine.startLocalManagementAgent - * @modules jdk.jartool/sun.tools.jar + * * @library /lib/testlibrary - * @modules jdk.management.agent + * @modules java.management * jdk.attach * jdk.jartool/sun.tools.jar + * * @run build Application SimpleProvider jdk.testlibrary.* * @run main/timeout=300 StartManagementAgent */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/com/sun/tools/attach/TempDirTest.java --- a/jdk/test/com/sun/tools/attach/TempDirTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/com/sun/tools/attach/TempDirTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -37,10 +37,11 @@ * @test * @bug 8033104 * @summary Test to make sure attach and jvmstat works correctly when java.io.tmpdir is set - * @modules jdk.jartool/sun.tools.jar + * * @library /lib/testlibrary - * @modules java.management + * @modules jdk.attach * jdk.jartool/sun.tools.jar + * * @run build jdk.testlibrary.* Application RunnerUtil * @run main/timeout=200 TempDirTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/awt/Choice/ChoicePopupLocation/ChoicePopupLocation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Choice/ChoicePopupLocation/ChoicePopupLocation.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Choice; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Insets; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.event.InputEvent; + +/** + * @test + * @bug 8176448 + * @run main/timeout=300 ChoicePopupLocation + */ +public final class ChoicePopupLocation { + + private static final int SIZE = 350; + private static int frameWidth; + + public static void main(final String[] args) throws Exception { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] sds = ge.getScreenDevices(); + Point left = null; + Point right = null; + for (GraphicsDevice sd : sds) { + GraphicsConfiguration gc = sd.getDefaultConfiguration(); + Rectangle bounds = gc.getBounds(); + if (left == null || left.x > bounds.x) { + left = new Point(bounds.x, bounds.y + bounds.height / 2); + } + if (right == null || right.x < bounds.x + bounds.width) { + right = new Point(bounds.x + bounds.width, + bounds.y + bounds.height / 2); + } + + Point point = new Point(bounds.x, bounds.y); + Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc); + while (point.y < bounds.y + bounds.height - insets.bottom - SIZE ) { + while (point.x < bounds.x + bounds.width - insets.right - SIZE) { + test(point); + point.translate(bounds.width / 5, 0); + } + point.setLocation(bounds.x, point.y + bounds.height / 5); + } + + } + if (left != null) { + left.translate(-50, 0); + test(left); + } + if (right != null) { + right.translate(-frameWidth + 50, 0); + test(right); + } + } + + private static void test(final Point tmp) throws Exception { + Choice choice = new Choice(); + for (int i = 1; i < 7; i++) { + choice.add("Long-long-long-long-long text in the item-" + i); + } + Frame frame = new Frame(); + try { + frame.setAlwaysOnTop(true); + frame.setLayout(new FlowLayout()); + frame.add(choice); + frame.pack(); + frameWidth = frame.getWidth(); + frame.setSize(frameWidth, SIZE); + frame.setVisible(true); + frame.setLocation(tmp.x, tmp.y); + openPopup(choice); + } finally { + frame.dispose(); + } + } + + private static void openPopup(final Choice choice) throws Exception { + Robot robot = new Robot(); + robot.setAutoDelay(100); + robot.setAutoWaitForIdle(true); + robot.waitForIdle(); + Point pt = choice.getLocationOnScreen(); + robot.mouseMove(pt.x + choice.getWidth() / 2, + pt.y + choice.getHeight() / 2); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + int x = pt.x + choice.getWidth() / 2; + int y = pt.y + choice.getHeight() / 2 + 70; + robot.mouseMove(x, y); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + if (choice.getSelectedIndex() == 0) { + throw new RuntimeException(); + } + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/awt/PopupMenu/PopupMenuLocation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/PopupMenu/PopupMenuLocation.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Insets; +import java.awt.Point; +import java.awt.PopupMenu; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; +import java.awt.event.*; + +/** + * @test + * @bug 8160270 + * @run main/timeout=300 PopupMenuLocation + */ +public final class PopupMenuLocation { + + private static final int SIZE = 350; + public static final String TEXT = + "Long-long-long-long-long-long-long text in the item-"; + private static volatile boolean action = false; + + public static void main(final String[] args) throws Exception { + GraphicsEnvironment ge = + GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] sds = ge.getScreenDevices(); + for (GraphicsDevice sd : sds) { + GraphicsConfiguration gc = sd.getDefaultConfiguration(); + Rectangle bounds = gc.getBounds(); + Point point = new Point(bounds.x, bounds.y); + Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc); + while (point.y < bounds.y + bounds.height - insets.bottom - SIZE) { + while (point.x + < bounds.x + bounds.width - insets.right - SIZE) { + test(point); + point.translate(bounds.width / 5, 0); + } + point.setLocation(bounds.x, point.y + bounds.height / 5); + } + } + } + + private static void test(final Point tmp) throws Exception { + PopupMenu pm = new PopupMenu(); + for (int i = 1; i < 7; i++) { + pm.add(TEXT + i); + } + pm.addActionListener(e -> action = true); + Frame frame = new Frame(); + try { + frame.setAlwaysOnTop(true); + frame.setLayout(new FlowLayout()); + frame.add(pm); + frame.pack(); + frame.setSize(SIZE, SIZE); + frame.setVisible(true); + frame.setLocation(tmp.x, tmp.y); + frame.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + show(e); + } + + public void mouseReleased(MouseEvent e) { + show(e); + } + + private void show(MouseEvent e) { + if (e.isPopupTrigger()) { + pm.show(frame, 0, 50); + } + } + }); + openPopup(frame); + } finally { + frame.dispose(); + } + } + + private static void openPopup(final Frame frame) throws Exception { + Robot robot = new Robot(); + robot.setAutoDelay(200); + robot.waitForIdle(); + Point pt = frame.getLocationOnScreen(); + robot.mouseMove(pt.x + frame.getWidth() / 2, pt.y + 50); + robot.mousePress(InputEvent.BUTTON3_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK); + int x = pt.x + frame.getWidth() / 2; + int y = pt.y + 130; + robot.mouseMove(x, y); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + if (!action) { + throw new RuntimeException(); + } + action = false; + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/io/FileInputStream/LargeFileAvailable.java --- a/jdk/test/java/io/FileInputStream/LargeFileAvailable.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/io/FileInputStream/LargeFileAvailable.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ * @key intermittent * @summary Test if available returns correct value when reading * a large file. + * @run main/timeout=300 LargeFileAvailable */ import java.io.*; @@ -34,6 +35,7 @@ import java.nio.channels.*; import java.nio.file.Files; import static java.nio.file.StandardOpenOption.*; +import java.util.concurrent.TimeUnit; public class LargeFileAvailable { public static void main(String args[]) throws Exception { @@ -110,7 +112,12 @@ CREATE_NEW, WRITE, SPARSE)) { ByteBuffer bb = ByteBuffer.allocate(1).put((byte)1); bb.rewind(); + System.out.println(" Writing large file..."); + long t0 = System.nanoTime(); int rc = fc.write(bb, filesize - 1); + long t1 = System.nanoTime(); + System.out.printf(" Wrote large file in %d ns (%d ms) %n", + t1 - t0, TimeUnit.NANOSECONDS.toMillis(t1 - t0)); if (rc != 1) { throw new RuntimeException("Failed to write 1 byte" diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/io/FilePermission/ReadFileOnPath.java --- a/jdk/test/java/io/FilePermission/ReadFileOnPath.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/io/FilePermission/ReadFileOnPath.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8164705 * @library /lib/testlibrary /test/lib * @modules java.base/jdk.internal.misc - * java.compiler + * jdk.compiler * @run main ReadFileOnPath * @summary Still able to read file on the same path */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java --- a/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -380,6 +380,7 @@ permissions.add(new RuntimePermission("closeClassLoader")); permissions.add(new RuntimePermission("getClassLoader")); permissions.add(new RuntimePermission("accessDeclaredMembers")); + permissions.add(new RuntimePermission("accessSystemModules")); permissions.add(new ReflectPermission("suppressAccessChecks")); permissions.add(new PropertyPermission("*", "read")); permissions.add(new FilePermission("<>", "read")); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/ClassLoader/getResource/automaticmodules/Driver.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/ClassLoader/getResource/automaticmodules/Driver.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @library /lib/testlibrary + * @build Driver Main JarUtils jdk.testlibrary.ProcessTools + * @run main Driver + * @summary Test ClassLoader.getResourceXXX to locate resources in an automatic + * module + */ + +import java.lang.module.ModuleFinder; +import java.lang.module.ModuleReference; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.jar.Attributes; +import java.util.jar.Manifest; + +import jdk.testlibrary.ProcessTools; + +/** + * The driver creates a JAR file containing p/Foo.class, p/foo.properties, + * and p/resources/bar.properties. This ensures there are is a resource in + * a module package and a resource that is not in the module package. The + * test is then launched to locate every resource in the JAR file. + */ + +public class Driver { + + private static final String TEST_CLASSES = System.getProperty("test.classes"); + + public static void main(String[] args) throws Exception { + // create content for JAR file + Path dir = Files.createTempDirectory("classes"); + Path p = Files.createDirectory(dir.resolve("p")); + Files.createFile(p.resolve("Foo.class")); + Files.createFile(p.resolve("foo.properties")); + Path resources = Files.createDirectory(p.resolve("resources")); + Files.createFile(resources.resolve("bar.properties")); + + // create the JAR file, including a manifest + Path jarFile = Paths.get("library-1.0.jar"); + Manifest man = new Manifest(); + Attributes attrs = man.getMainAttributes(); + attrs.put(Attributes.Name.MANIFEST_VERSION, "1.0.0"); + JarUtils.createJarFile(jarFile, man, dir, p); + + // get the module name + ModuleFinder finder = ModuleFinder.of(jarFile); + ModuleReference mref = finder.findAll().stream().findAny().orElse(null); + if (mref == null) + throw new RuntimeException("Module not found!!!"); + String name = mref.descriptor().name(); + + // launch the test with the JAR file on the module path + if (ProcessTools.executeTestJava("-p", jarFile.toString(), + "--add-modules", name, + "-cp", TEST_CLASSES, + "Main", name) + .outputTo(System.out) + .errorTo(System.out) + .getExitValue() != 0) + throw new RuntimeException("Test failed - see output"); + } + +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/ClassLoader/getResource/automaticmodules/Main.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/ClassLoader/getResource/automaticmodules/Main.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.lang.module.ModuleReader; +import java.lang.module.ModuleReference; +import java.lang.module.ResolvedModule; +import java.lang.reflect.Layer; +import java.net.URL; +import java.util.Enumeration; + +/** + * Usage: Main $MODULE + * + * Finds $MODULE in the boot layer and then tests that it can locate every + * resource in the module content (JAR file). + */ + +public class Main { + + static void testFind(String name) throws Exception { + // getResource + URL url = Main.class.getClassLoader().getResource(name); + if (url == null) + throw new RuntimeException("Unable to locate: " + name); + System.out.println(name + " => " + url); + + // getResources + Enumeration urls = Main.class.getClassLoader().getResources(name); + if (!urls.hasMoreElements()) + throw new RuntimeException("Unable to locate: " + name); + URL first = urls.nextElement(); + if (!first.toURI().equals(url.toURI())) + throw new RuntimeException("found " + first + " ???"); + + // getResourceAsStream + if (!url.toString().endsWith("/")) { + InputStream in = Main.class.getClassLoader().getResourceAsStream(name); + if (in == null) + throw new RuntimeException("Unable to locate: " + name); + in.close(); + } + } + + static void testFindUnchecked(String name) { + try { + testFind(name); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) throws Exception { + String mn = args[0]; + + ModuleReference mref = Layer.boot() + .configuration() + .findModule(mn) + .map(ResolvedModule::reference) + .orElseThrow(() -> new RuntimeException(mn + " not resolved!!")); + + try (ModuleReader reader = mref.open()) { + reader.list().forEach(name -> { + testFindUnchecked(name); + + // if the resource is a directory then find without trailing slash + if (name.endsWith("/")) { + testFindUnchecked(name.substring(0, name.length() - 1)); + } + }); + } + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/Package/annotation/PackageInfoTest.java --- a/jdk/test/java/lang/Package/annotation/PackageInfoTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/Package/annotation/PackageInfoTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,8 +25,7 @@ * @test * @summary Basic test of package-info in named module and duplicate * package-info in unnamed module - * @modules java.compiler - * java.desktop + * @modules java.desktop * jdk.compiler * jdk.xml.dom * @build jdk.xml.dom/org.w3c.dom.css.Fake diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/ProcessHandle/JavaChild.java --- a/jdk/test/java/lang/ProcessHandle/JavaChild.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/ProcessHandle/JavaChild.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,6 @@ import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.IOException; -import java.io.PrintStream; import java.io.Reader; import java.io.PrintWriter; import java.lang.InterruptedException; @@ -39,9 +38,11 @@ import java.util.Arrays; import java.util.Collections; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.Optional; import java.util.function.Consumer; @@ -437,6 +438,11 @@ case "threaddump": Thread.dumpStack(); break; + case "waitpid": + long pid = Long.parseLong(args[nextArg++]); + Optional s = ProcessHandle.of(pid).map(ph -> waitAlive(ph)); + sendResult(action, s.orElse("pid not valid: " + pid)); + break; default: throw new Error("JavaChild action unknown: " + action); } @@ -447,6 +453,17 @@ } } + private static String waitAlive(ProcessHandle ph) { + String status; + try { + boolean isAlive = ph.onExit().get().isAlive(); + status = Boolean.toString(isAlive); + } catch (InterruptedException | ExecutionException ex ) { + status = "interrupted"; + } + return status; + } + static synchronized void sendRaw(String s) { System.out.println(s); System.out.flush(); @@ -476,6 +493,7 @@ System.err.println(" spawn command... - spawn n new children and send command"); System.err.println(" child command... - send command to all live children"); System.err.println(" child_eof - send eof to all live children"); + System.err.println(" waitpid - wait for the pid to exit"); System.err.println(" exit "); System.err.println(" out arg..."); System.err.println(" err arg..."); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/ProcessHandle/OnExitTest.java --- a/jdk/test/java/lang/ProcessHandle/OnExitTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/ProcessHandle/OnExitTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,11 @@ import java.time.Instant; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; import jdk.test.lib.Utils; @@ -196,4 +198,95 @@ } } + /** + * Verify that onExit completes for a non-child process only when + * the process has exited. + * Spawn a child (A) waiting to be commanded to exit. + * Spawn a child (B) to wait for that process to exit. + * Command (A) to exit. + * Check that (B) does not complete until (A) has exited. + */ + @Test + public static void peerOnExitTest() { + String line = null; + ArrayBlockingQueue alines = new ArrayBlockingQueue<>(100); + ArrayBlockingQueue blines = new ArrayBlockingQueue<>(100); + JavaChild A = null; + try { + String[] split; + A = JavaChild.spawnJavaChild("stdin"); + A.forEachOutputLine(l -> alines.add(l)); + + // Verify A is running + A.sendAction("pid"); + do { + split = getSplitLine(alines); + } while (!"pid".equals(split[1])); + + JavaChild B = null; + try { + B = JavaChild.spawnJavaChild("stdin"); + B.forEachOutputLine(l -> blines.add(l)); + + // Verify B is running + B.sendAction("pid"); + do { + split = getSplitLine(blines); + } while (!"pid".equals(split[1])); + + // Tell B to wait for A's pid + B.sendAction("waitpid", A.getPid()); + + // Wait a bit to see if B will prematurely report the termination of A + try { + line = blines.poll(5L, TimeUnit.SECONDS); + } catch (InterruptedException ie) { + Assert.fail("interrupted", ie); + } + Assert.assertNull(line, "waitpid didn't wait"); + + A.sendAction("exit", 0L); + + // Look for B to report that A has exited + do { + split = getSplitLine(blines); + } while (!"waitpid".equals(split[1])); + + Assert.assertEquals(split[2], "false", "Process A should not be alive"); + + B.sendAction("exit", 0L); + } catch (IOException ioe) { + Assert.fail("unable to start JavaChild B", ioe); + } finally { + B.destroyForcibly(); + } + } catch (IOException ioe2) { + Assert.fail("unable to start JavaChild A", ioe2); + } finally { + A.destroyForcibly(); + } + } + + private static boolean DEBUG = true; + + /** + * Get a line from the queue and split into words on whitespace. + * Log to stdout if requested. + * @param queue a queue of strings + * @return the words split from the line. + */ + private static String[] getSplitLine(ArrayBlockingQueue queue) { + try { + String line = queue.take(); + String[] split = line.split("\\s"); + if (DEBUG) { + System.out.printf(" Child Output: %s%n", line); + } + return split; + } catch (InterruptedException ie) { + Assert.fail("interrupted", ie); + return null; + } + } + } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/Runtime/Version/Basic.java --- a/jdk/test/java/lang/Runtime/Version/Basic.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/Runtime/Version/Basic.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,7 @@ /* * @test * @summary Unit test for java.lang.Runtime.Version. - * @bug 8072379 8144062 8161236 + * @bug 8072379 8144062 8161236 8160956 */ import java.lang.reflect.InvocationTargetException; @@ -129,6 +129,9 @@ testEHC("9", "10", false, false, -1, -1); testEHC("9", "8", false, false, 1, 1); + testEHC("10.512.1", "10.512.2", false, false, -1, -1); + testEHC("512.10.1", "512.11.1", false, false, -1, -1); + // $OPT comparison testEHC("9", "9+-oink", false, true, -1, 0); testEHC("9+-ribbit", "9+-moo", false, true, 1, 0); @@ -140,7 +143,7 @@ testEHC("9.1.1.2-2a", "9.1.1.2-12", false, false, 1, 1); testEHC("9.1.1.2-12", "9.1.1.2-4", false, false, 1, 1); - testEHC("27.16", "27.16+120", false, false, 1, 1); + testEHC("27.16", "27.16+120", false, false, -1, -1); testEHC("10", "10-ea", false, false, 1, 1); testEHC("10.1+1", "10.1-ea+1", false, false, 1, 1); testEHC("10.0.1+22", "10.0.1+21", false, false, 1, 1); @@ -152,7 +155,7 @@ testEHC("9-internal", "9", false, false, -1, -1); testEHC("9-ea+120", "9+120", false, false, -1, -1); testEHC("9-ea+120", "9+120", false, false, -1, -1); - testEHC("9+101", "9", false, false, -1, -1); + testEHC("9+101", "9", false, false, 1, 1); testEHC("9+101", "9+102", false, false, -1, -1); testEHC("1.9-ea", "9-ea", false, false, -1, -1); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/StackWalker/CallerSensitiveMethod/csm/jdk/test/CallerSensitiveTest.java --- a/jdk/test/java/lang/StackWalker/CallerSensitiveMethod/csm/jdk/test/CallerSensitiveTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/StackWalker/CallerSensitiveMethod/csm/jdk/test/CallerSensitiveTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -50,7 +50,7 @@ if (args.length > 0 && args[0].equals("sm")) { sm = true; PermissionCollection perms = new Permissions(); - perms.add(new StackFramePermission("retainClassReference")); + perms.add(new RuntimePermission("getStackWalkerWithClassReference")); Policy.setPolicy(new Policy() { @Override public boolean implies(ProtectionDomain domain, Permission p) { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/StackWalker/GetCallerClassTest.java --- a/jdk/test/java/lang/StackWalker/GetCallerClassTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/StackWalker/GetCallerClassTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -55,7 +55,7 @@ public static void main(String... args) throws Exception { if (args.length > 0 && args[0].equals("sm")) { PermissionCollection perms = new Permissions(); - perms.add(new StackFramePermission("retainClassReference")); + perms.add(new RuntimePermission("getStackWalkerWithClassReference")); Policy.setPolicy(new Policy() { @Override public boolean implies(ProtectionDomain domain, Permission p) { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/StackWalker/stackwalk.policy --- a/jdk/test/java/lang/StackWalker/stackwalk.policy Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/StackWalker/stackwalk.policy Wed Jul 05 23:09:40 2017 +0200 @@ -1,4 +1,4 @@ grant { - permission java.lang.StackFramePermission "retainClassReference"; + permission java.lang.RuntimePermission "getStackWalkerWithClassReference"; }; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/StackWalker/stackwalktest.policy --- a/jdk/test/java/lang/StackWalker/stackwalktest.policy Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/StackWalker/stackwalktest.policy Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ grant { - permission java.lang.StackFramePermission "retainClassReference"; + permission java.lang.RuntimePermission "getStackWalkerWithClassReference"; permission java.util.PropertyPermission "seed", "read"; }; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/System/LoggerFinder/LoggerFinderAPI/LoggerFinderAPI.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/LoggerFinderAPI/LoggerFinderAPI.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.lang.System.Logger; +import java.lang.System.Logger.Level; +import java.lang.System.LoggerFinder; +import java.lang.reflect.Module; +import java.util.Enumeration; +import java.util.Locale; +import java.util.Objects; +import java.util.ResourceBundle; +import java.util.concurrent.ConcurrentHashMap; +// Can't use testng because testng requires java.logging +//import org.testng.annotations.Test; + +/** + * @test + * @bug 8177835 + * @summary Checks that the DefaultLoggerFinder and LoggingProviderImpl + * implementations of the System.LoggerFinder conform to the + * LoggerFinder specification, in particular with respect to + * throwing NullPointerException. The test uses --limit-module + * to force the selection of one or the other. + * @author danielfuchs + * @build LoggerFinderAPI + * @run main/othervm --limit-modules java.base,java.logging + * -Djava.util.logging.SimpleFormatter.format=LOG-%4$s:-[%2$s]-%5$s%6$s%n + * LoggerFinderAPI + * @run main/othervm -Djdk.system.logger.format=LOG-%4$s:-[%2$s]-%5$s%6$s%n + * --limit-modules java.base + * LoggerFinderAPI + */ +public class LoggerFinderAPI { + + // Simplified log format string. No white space for main/othervm line + static final String TEST_FORMAT = "LOG-%4$s:-[%2$s]-%5$s%6$s%n"; + static final String JDK_FORMAT_PROP_KEY = "jdk.system.logger.format"; + static final String JUL_FORMAT_PROP_KEY = + "java.util.logging.SimpleFormatter.format"; + + static class RecordStream extends OutputStream { + static final Object LOCK = new Object[0]; + final PrintStream out; + final PrintStream err; + final ByteArrayOutputStream bos = new ByteArrayOutputStream(); + boolean record; + RecordStream(PrintStream out, PrintStream err) { + this.out = out; + this.err = err; + } + + @Override + public void write(int i) throws IOException { + if (record) { + bos.write(i); + out.write(i); + } else { + err.write(i); + } + } + + void startRecording() { + out.flush(); + err.flush(); + bos.reset(); + record = true; + } + byte[] stopRecording() { + out.flush(); + err.flush(); + record = false; + return bos.toByteArray(); + } + } + + static final PrintStream ERR = System.err; + static final PrintStream OUT = System.out; + static final RecordStream LOG_STREAM = new RecordStream(OUT, ERR); + static { + Locale.setDefault(Locale.US); + PrintStream perr = new PrintStream(LOG_STREAM); + System.setErr(perr); + } + + public static class MyResourceBundle extends ResourceBundle { + final ConcurrentHashMap map = new ConcurrentHashMap<>(); + @Override + protected Object handleGetObject(String string) { + return map.computeIfAbsent(string, s -> "[localized] " + s); + } + + @Override + public Enumeration getKeys() { + return map.keys(); + } + + } + + public static void main(String[] args) { + // Set on the command line, to ensure that the test will fail if + // the 'wrong' provider gets selected. + // System.setProperty(JDK_FORMAT_PROP_KEY, TEST_FORMAT); + // System.setProperty(JUL_FORMAT_PROP_KEY, TEST_FORMAT); + LoggerFinder finder = System.LoggerFinder.getLoggerFinder(); + System.out.println("LoggerFinder is " + finder.getClass().getName()); + + LoggerFinderAPI apiTest = new LoggerFinderAPI(); + for (Object[] params : getLoggerDataProvider()) { + apiTest.testGetLogger((String)params[0], + (String)params[1], + (Module)params[2], + Throwable.class.getClass().cast(params[3])); + } + for (Object[] params : getLocalizedLoggerDataProvider()) { + apiTest.testGetLocalizedLogger((String)params[0], + (String)params[1], + (ResourceBundle)params[2], + (Module)params[3], + Throwable.class.getClass().cast(params[4])); + } + } + + //Can't use testng because testng requires java.logging + //@Test(dataProvider = "testGetLoggerDataProvider") + void testGetLogger(String desc, String name, Module mod, Class thrown) { + try { + LoggerFinder finder = System.LoggerFinder.getLoggerFinder(); + Logger logger = finder.getLogger(name, mod); + if (thrown != null) { + throw new AssertionError("Exception " + thrown.getName() + + " not thrown for " + + "LoggerFinder.getLogger" + + " with " + desc); + } + // Make sure we don't fail if tests are run in parallel + synchronized(RecordStream.LOCK) { + LOG_STREAM.startRecording(); + try { + logger.log(Level.INFO, "{0} with {1}: PASSED", + "LoggerFinder.getLogger", + desc); + } finally { + byte[] logged = LOG_STREAM.stopRecording(); + check(logged, "testGetLogger", desc, null, + "LoggerFinder.getLogger"); + } + } + } catch (Throwable x) { + if (thrown != null && thrown.isInstance(x)) { + System.out.printf("Got expected exception for %s with %s: %s\n", + "LoggerFinder.getLogger", desc, String.valueOf(x)); + } else throw x; + } + } + + //Can't use testng because testng requires java.logging + //@Test(dataProvider = "getLocalizedLoggerDataProvider") + void testGetLocalizedLogger(String desc, String name, ResourceBundle bundle, + Module mod, Class thrown) { + try { + LoggerFinder finder = System.LoggerFinder.getLoggerFinder(); + Logger logger = finder.getLocalizedLogger(name, bundle, mod); + if (thrown != null) { + throw new AssertionError("Exception " + thrown.getName() + + " not thrown for " + + "LoggerFinder.getLocalizedLogger" + + " with " + desc); + } + // Make sure we don't fail if tests are run in parallel + synchronized(RecordStream.LOCK) { + LOG_STREAM.startRecording(); + try { + logger.log(Level.INFO, "{0} with {1}: PASSED", + "LoggerFinder.getLocalizedLogger", + desc); + } finally { + byte[] logged = LOG_STREAM.stopRecording(); + check(logged, "testGetLocalizedLogger", desc, bundle, + "LoggerFinder.getLocalizedLogger"); + } + } + } catch (Throwable x) { + if (thrown != null && thrown.isInstance(x)) { + System.out.printf("Got expected exception for %s with %s: %s\n", + "LoggerFinder.getLocalizedLogger", desc, String.valueOf(x)); + } else throw x; + } + } + + private void check(byte[] logged, String test, String desc, + ResourceBundle bundle, String meth) { + String msg = new String(logged); + String expected = String.format(TEST_FORMAT, null, + "LoggerFinderAPI " + test, null, Level.INFO.name(), + (bundle==null?"":"[localized] ") + meth + " with " + desc + ": PASSED", + ""); + if (!Objects.equals(msg, expected)) { + throw new AssertionError("Expected log message not found: " + + "\n\texpected: " + expected + + "\n\tretrieved: " + msg); + } + } + + + static final Module MODULE = LoggerFinderAPI.class.getModule(); + static final ResourceBundle BUNDLE = new MyResourceBundle(); + static final Object[][] GET_LOGGER = { + {"null name", null, MODULE , NullPointerException.class}, + {"null module", "foo", null, NullPointerException.class}, + {"null name and module", null, null, NullPointerException.class}, + {"non null name and module", "foo", MODULE, null}, + }; + static final Object[][] GET_LOCALIZED_LOGGER = { + {"null name", null, BUNDLE, MODULE , NullPointerException.class}, + {"null module", "foo", BUNDLE, null, NullPointerException.class}, + {"null name and module", null, BUNDLE, null, NullPointerException.class}, + {"non null name and module", "foo", BUNDLE, MODULE, null}, + {"null name and bundle", null, null, MODULE , NullPointerException.class}, + {"null module and bundle", "foo", null, null, NullPointerException.class}, + {"null name and module and bundle", null, null, null, NullPointerException.class}, + {"non null name and module, null bundle", "foo", null, MODULE, null}, + }; + public static Object[][] getLoggerDataProvider() { + return GET_LOGGER; + } + public static Object[][] getLocalizedLoggerDataProvider() { + return GET_LOCALIZED_LOGGER; + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/instrument/RedefineModuleTest.java --- a/jdk/test/java/lang/instrument/RedefineModuleTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/instrument/RedefineModuleTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,7 +24,7 @@ /** * @test * @summary Basic test for redefineModule - * @modules java.instrument + * * @build java.base/java.lang.TestProvider * java.base/jdk.internal.test.TestProviderImpl1 * java.base/jdk.internal.test.TestProviderImpl2 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/instrument/TestAgentWithLimitMods.java --- a/jdk/test/java/lang/instrument/TestAgentWithLimitMods.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/instrument/TestAgentWithLimitMods.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @test * @summary Tests that the -javaagent option adds the java.instrument into * the module graph - * @modules java.instrument + * * @run shell MakeJAR3.sh SimpleAgent * @run main/othervm -javaagent:SimpleAgent.jar --limit-modules java.base TestAgentWithLimitMods * diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/invoke/DefineClassTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/invoke/DefineClassTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,352 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @modules java.base/java.lang:open + * java.base/jdk.internal.org.objectweb.asm + * @run testng/othervm test.DefineClassTest + * @summary Basic test for java.lang.invoke.MethodHandles.Lookup.defineClass + */ + +package test; + +import java.lang.invoke.MethodHandles.Lookup; +import static java.lang.invoke.MethodHandles.*; +import static java.lang.invoke.MethodHandles.Lookup.*; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.Path; + +import jdk.internal.org.objectweb.asm.ClassWriter; +import jdk.internal.org.objectweb.asm.MethodVisitor; +import static jdk.internal.org.objectweb.asm.Opcodes.*; + +import org.testng.annotations.Test; +import static org.testng.Assert.*; + +public class DefineClassTest { + private static final String THIS_PACKAGE = DefineClassTest.class.getPackageName(); + + /** + * Test that a class has the same class loader, and is in the same package and + * protection domain, as a lookup class. + */ + void testSameAbode(Class clazz, Class lc) { + assertTrue(clazz.getClassLoader() == lc.getClassLoader()); + assertEquals(clazz.getPackageName(), lc.getPackageName()); + assertTrue(clazz.getProtectionDomain() == lc.getProtectionDomain()); + } + + /** + * Tests that a class is discoverable by name using Class.forName and + * lookup.findClass + */ + void testDiscoverable(Class clazz, Lookup lookup) throws Exception { + String cn = clazz.getName(); + ClassLoader loader = clazz.getClassLoader(); + assertTrue(Class.forName(cn, false, loader) == clazz); + assertTrue(lookup.findClass(cn) == clazz); + } + + /** + * Basic test of defineClass to define a class in the same package as test. + */ + @Test + public void testDefineClass() throws Exception { + final String CLASS_NAME = THIS_PACKAGE + ".Foo"; + Lookup lookup = lookup().dropLookupMode(PRIVATE); + Class clazz = lookup.defineClass(generateClass(CLASS_NAME)); + + // test name + assertEquals(clazz.getName(), CLASS_NAME); + + // test loader/package/protection-domain + testSameAbode(clazz, lookup.lookupClass()); + + // test discoverable + testDiscoverable(clazz, lookup); + + // attempt defineClass again + try { + lookup.defineClass(generateClass(CLASS_NAME)); + assertTrue(false); + } catch (LinkageError expected) { } + } + + /** + * Test public/package/protected/private access from class defined with defineClass. + */ + @Test + public void testAccess() throws Exception { + final String THIS_CLASS = this.getClass().getName(); + final String CLASS_NAME = THIS_PACKAGE + ".Runner"; + Lookup lookup = lookup().dropLookupMode(PRIVATE); + + // public + byte[] classBytes = generateRunner(CLASS_NAME + nextNumber(), THIS_CLASS, "method1"); + testInvoke(lookup.defineClass(classBytes)); + + // package + classBytes = generateRunner(CLASS_NAME + nextNumber(), THIS_CLASS, "method2"); + testInvoke(lookup.defineClass(classBytes)); + + // protected (same package) + classBytes = generateRunner(CLASS_NAME + nextNumber(), THIS_CLASS, "method3"); + testInvoke(lookup.defineClass(classBytes)); + + // private + classBytes = generateRunner(CLASS_NAME + nextNumber(), THIS_CLASS, "method4"); + Class clazz = lookup.defineClass(classBytes); + Runnable r = (Runnable) clazz.newInstance(); + try { + r.run(); + assertTrue(false); + } catch (IllegalAccessError expected) { } + } + + public static void method1() { } + static void method2() { } + protected static void method3() { } + private static void method4() { } + + void testInvoke(Class clazz) throws Exception { + Object obj = clazz.newInstance(); + ((Runnable) obj).run(); + } + + /** + * Test that defineClass does not run the class initializer + */ + @Test + public void testInitializerNotRun() throws Exception { + final String THIS_CLASS = this.getClass().getName(); + final String CLASS_NAME = THIS_PACKAGE + ".ClassWithClinit"; + + byte[] classBytes = generateClassWithInitializer(CLASS_NAME, THIS_CLASS, "fail"); + Lookup lookup = lookup().dropLookupMode(PRIVATE); + + Class clazz = lookup.defineClass(classBytes); + // trigger initializer to run + try { + clazz.newInstance(); + assertTrue(false); + } catch (ExceptionInInitializerError e) { + assertTrue(e.getCause() instanceof IllegalCallerException); + } + } + + static void fail() { throw new IllegalCallerException(); } + + + /** + * Test defineClass to define classes in a package containing classes with + * different protection domains. + */ + @Test + public void testTwoProtectionDomains() throws Exception { + // p.C1 in one exploded directory + Path dir1 = Files.createTempDirectory("classes"); + Path p = Files.createDirectory(dir1.resolve("p")); + Files.write(p.resolve("C1.class"), generateClass("p.C1")); + URL url1 = dir1.toUri().toURL(); + + // p.C2 in another exploded directory + Path dir2 = Files.createTempDirectory("classes"); + p = Files.createDirectory(dir2.resolve("p")); + Files.write(p.resolve("C2.class"), generateClass("p.C2")); + URL url2 = dir2.toUri().toURL(); + + // load p.C1 and p.C2 + ClassLoader loader = new URLClassLoader(new URL[] { url1, url2 }); + Class target1 = Class.forName("p.C1", false, loader); + Class target2 = Class.forName("p.C2", false, loader); + assertTrue(target1.getClassLoader() == loader); + assertTrue(target1.getClassLoader() == loader); + assertNotEquals(target1.getProtectionDomain(), target2.getProtectionDomain()); + + // protection domain 1 + Lookup lookup1 = privateLookupIn(target1, lookup()).dropLookupMode(PRIVATE); + + Class clazz = lookup1.defineClass(generateClass("p.Foo")); + testSameAbode(clazz, lookup1.lookupClass()); + testDiscoverable(clazz, lookup1); + + // protection domain 2 + Lookup lookup2 = privateLookupIn(target2, lookup()).dropLookupMode(PRIVATE); + + clazz = lookup2.defineClass(generateClass("p.Bar")); + testSameAbode(clazz, lookup2.lookupClass()); + testDiscoverable(clazz, lookup2); + } + + /** + * Test defineClass defining a class to the boot loader + */ + @Test + public void testBootLoader() throws Exception { + Lookup lookup = privateLookupIn(Thread.class, lookup()).dropLookupMode(PRIVATE); + assertTrue(lookup.getClass().getClassLoader() == null); + + Class clazz = lookup.defineClass(generateClass("java.lang.Foo")); + assertEquals(clazz.getName(), "java.lang.Foo"); + testSameAbode(clazz, Thread.class); + testDiscoverable(clazz, lookup); + } + + @Test(expectedExceptions = { IllegalArgumentException.class }) + public void testWrongPackage() throws Exception { + Lookup lookup = lookup().dropLookupMode(PRIVATE); + lookup.defineClass(generateClass("other.C")); + } + + @Test(expectedExceptions = { IllegalAccessException.class }) + public void testNoPackageAccess() throws Exception { + Lookup lookup = lookup().dropLookupMode(PACKAGE); + lookup.defineClass(generateClass(THIS_PACKAGE + ".C")); + } + + @Test(expectedExceptions = { UnsupportedOperationException.class }) + public void testHasPrivateAccess() throws Exception { + Lookup lookup = lookup(); + assertTrue(lookup.hasPrivateAccess()); + lookup.defineClass(generateClass(THIS_PACKAGE + ".C")); + } + + @Test(expectedExceptions = { ClassFormatError.class }) + public void testTruncatedClassFile() throws Exception { + Lookup lookup = lookup().dropLookupMode(PRIVATE); + lookup.defineClass(new byte[0]); + } + + @Test(expectedExceptions = { NullPointerException.class }) + public void testNull() throws Exception { + Lookup lookup = lookup().dropLookupMode(PRIVATE); + lookup.defineClass(null); + } + + /** + * Generates a class file with the given class name + */ + byte[] generateClass(String className) { + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + + ClassWriter.COMPUTE_FRAMES); + cw.visit(V1_9, + ACC_PUBLIC + ACC_SUPER, + className.replace(".", "/"), + null, + "java/lang/Object", + null); + + // + MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 0); + mv.visitEnd(); + + cw.visitEnd(); + return cw.toByteArray(); + } + + /** + * Generate a class file with the given class name. The class implements Runnable + * with a run method to invokestatic the given targetClass/targetMethod. + */ + byte[] generateRunner(String className, + String targetClass, + String targetMethod) throws Exception { + + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + + ClassWriter.COMPUTE_FRAMES); + cw.visit(V1_9, + ACC_PUBLIC + ACC_SUPER, + className.replace(".", "/"), + null, + "java/lang/Object", + new String[] { "java/lang/Runnable" }); + + // + MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 0); + mv.visitEnd(); + + // run() + String tc = targetClass.replace(".", "/"); + mv = cw.visitMethod(ACC_PUBLIC, "run", "()V", null, null); + mv.visitMethodInsn(INVOKESTATIC, tc, targetMethod, "()V", false); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 0); + mv.visitEnd(); + + cw.visitEnd(); + return cw.toByteArray(); + } + + /** + * Generate a class file with the given class name. The class will initializer + * to invokestatic the given targetClass/targetMethod. + */ + byte[] generateClassWithInitializer(String className, + String targetClass, + String targetMethod) throws Exception { + + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + + ClassWriter.COMPUTE_FRAMES); + cw.visit(V1_9, + ACC_PUBLIC + ACC_SUPER, + className.replace(".", "/"), + null, + "java/lang/Object", + null); + + // + MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 0); + mv.visitEnd(); + + // + String tc = targetClass.replace(".", "/"); + mv = cw.visitMethod(ACC_STATIC, "", "()V", null, null); + mv.visitMethodInsn(INVOKESTATIC, tc, targetMethod, "()V", false); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 0); + mv.visitEnd(); + + cw.visitEnd(); + return cw.toByteArray(); + } + + private int nextNumber() { + return ++nextNumber; + } + + private int nextNumber; +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ClassLoadingMXBean/LoadCounts.java --- a/jdk/test/java/lang/management/ClassLoadingMXBean/LoadCounts.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ClassLoadingMXBean/LoadCounts.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * ClassLoadingMXBean.getTotalLoadedClassCount() * ClassLoadingMXBean.getUnloadedClassCount() * @author Alexei Guibadoulline - * @modules java.management + * * @run main/othervm LoadCounts */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/CompilationMXBean/Basic.java --- a/jdk/test/java/lang/management/CompilationMXBean/Basic.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/CompilationMXBean/Basic.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 5011189 8004928 * @summary Unit test for java.lang.management.CompilationMXBean * - * @modules java.management * @run main/othervm -Xcomp -Xbatch Basic */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/CompositeData/MemoryUsageCompositeData.java --- a/jdk/test/java/lang/management/CompositeData/MemoryUsageCompositeData.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/CompositeData/MemoryUsageCompositeData.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * or throw exception if the input CompositeData is invalid. * @author Mandy Chung * - * @modules java.management * @build MemoryUsageCompositeData * @run main MemoryUsageCompositeData */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java --- a/jdk/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/CompositeData/ThreadInfoCompositeData.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,6 @@ * the input CompositeData is invalid. * @author Mandy Chung * - * @modules java.management * @compile OpenTypeConverter.java * @build ThreadInfoCompositeData * @run main ThreadInfoCompositeData diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/GetObjectName.java --- a/jdk/test/java/lang/management/ManagementFactory/GetObjectName.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/GetObjectName.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @summary Test if getObjectName handles properly when called by * multiple threads simultaneously. Run in othervm mode to * make sure the object name is not initialized to begin with. - * @modules java.management + * * @run main/othervm GetObjectName */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/GetPlatformMXBeans.java --- a/jdk/test/java/lang/management/ManagementFactory/GetPlatformMXBeans.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/GetPlatformMXBeans.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * methods and PlatformManagedObject.getObjectName() * @author Mandy Chung * - * @modules jdk.management * @run main GetPlatformMXBeans */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/GetPlatformManagementInterfaces.java --- a/jdk/test/java/lang/management/ManagementFactory/GetPlatformManagementInterfaces.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/GetPlatformManagementInterfaces.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * ManagementFactory.getPlatformManagementInterfaces() method * @author Frederic Parain * - * @modules jdk.management * @run main GetPlatformManagementInterfaces */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/MBeanServerMXBeanUnsupportedTest.java --- a/jdk/test/java/lang/management/ManagementFactory/MBeanServerMXBeanUnsupportedTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/MBeanServerMXBeanUnsupportedTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that all the platform MXBeans are wrapped in StandardMBean so * an MBeanServer which does not have support for MXBeans can be used. * @author Luis-Miguel Alventosa - * @modules jdk.management + * * @run clean MBeanServerMXBeanUnsupportedTest * @run build MBeanServerMXBeanUnsupportedTest * @run main/othervm MBeanServerMXBeanUnsupportedTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/MXBeanException.java --- a/jdk/test/java/lang/management/ManagementFactory/MXBeanException.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/MXBeanException.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,6 @@ * * @author Mandy Chung * - * @modules jdk.management * @build MXBeanException * @run main MXBeanException */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java --- a/jdk/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/MXBeanProxyTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,9 +25,9 @@ * @test * @bug 5024531 * @summary Basic Test for ManagementFactory.newPlatformMXBean(). - * @modules jdk.management + * @author Mandy Chung + * * @run main/othervm MXBeanProxyTest - * @author Mandy Chung */ import javax.management.*; import java.lang.management.ClassLoadingMXBean; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java --- a/jdk/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/PlatformMBeanServerTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,9 @@ * @bug 4947536 * @summary Basic unit test of ManagementFactory.getPlatformMBeanServer() * @author Mandy Chung - * @modules jdk.management + * + * @modules java.logging + * jdk.management */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/ProxyExceptions.java --- a/jdk/test/java/lang/management/ManagementFactory/ProxyExceptions.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/ProxyExceptions.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Test type mapping of the platform MXBean proxy * returned from Management.newPlatformMXBeanProxy(). * @author Mandy Chung - * @modules jdk.management */ import java.lang.management.*; import javax.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java --- a/jdk/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/ProxyTypeMapping.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * returned from Management.newPlatformMXBeanProxy(). * @author Mandy Chung * - * @modules jdk.management * @compile ProxyTypeMapping.java * @run main/othervm -verbose:gc ProxyTypeMapping */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = jdk.management + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/ThreadMXBeanProxy.java --- a/jdk/test/java/lang/management/ManagementFactory/ThreadMXBeanProxy.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/ThreadMXBeanProxy.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,10 +26,8 @@ * @bug 5086470 6358247 7193302 * @summary Test type conversion when invoking ThreadMXBean.dumpAllThreads * through proxy. - * * @author Mandy Chung * - * @modules jdk.management * @run main ThreadMXBeanProxy */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java --- a/jdk/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ManagementFactory/ValidateOpenTypes.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * MBeanServer. * @author Mandy Chung * - * @modules jdk.management * @compile ValidateOpenTypes.java * @run main/othervm -verbose:gc ValidateOpenTypes */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java --- a/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,16 +27,15 @@ * @summary Basic unit test of memory management testing: * 1) setUsageThreshold() and getUsageThreshold() * 2) test low memory detection on the old generation. - * * @author Mandy Chung * - * @library /lib/testlibrary/ - * @modules java.management - * @build jdk.testlibrary.* LowMemoryTest MemoryUtil RunUtil - * @run main/timeout=600 LowMemoryTest * @requires vm.gc == "null" * @requires vm.opt.ExplicitGCInvokesConcurrent != "true" * @requires vm.opt.DisableExplicitGC != "true" + * @library /lib/testlibrary/ + * + * @build jdk.testlibrary.* LowMemoryTest MemoryUtil RunUtil + * @run main/timeout=600 LowMemoryTest */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest2.sh --- a/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest2.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest2.sh Wed Jul 05 23:09:40 2017 +0200 @@ -25,8 +25,9 @@ # @test # @bug 4982128 # @summary Test low memory detection of non-heap memory pool +# # @requires vm.gc=="null" -# @modules java.management +# # @run build LowMemoryTest2 MemoryUtil # @run shell/timeout=600 LowMemoryTest2.sh # @@ -51,10 +52,10 @@ } # Run test with each GC configuration -# +# # Notes: To ensure that metaspace fills up we disable class unloading. # Also we set the max metaspace to 16MB - otherwise the test takes too -# long to run. +# long to run. go -noclassgc -XX:MaxMetaspaceSize=16m -XX:+UseSerialGC LowMemoryTest2 go -noclassgc -XX:MaxMetaspaceSize=16m -XX:+UseParallelGC LowMemoryTest2 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/MemoryMXBean/MemoryManagementConcMarkSweepGC.sh --- a/jdk/test/java/lang/management/MemoryMXBean/MemoryManagementConcMarkSweepGC.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/MemoryMXBean/MemoryManagementConcMarkSweepGC.sh Wed Jul 05 23:09:40 2017 +0200 @@ -26,8 +26,9 @@ # @bug 4530538 # @summary Run MemoryManagement test with concurrent mark sweep GC # @author Mandy Chung +# # @requires vm.gc=="ConcMarkSweep" | vm.gc=="null" -# @modules java.management +# # @run build MemoryManagement # @run shell/timeout=600 MemoryManagementConcMarkSweepGC.sh # @@ -42,7 +43,7 @@ fi runOne() -{ +{ echo "runOne $@" $TESTJAVA/bin/java ${TESTVMOPTS} -classpath $TESTCLASSES $@ || exit 2 } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/MemoryMXBean/MemoryManagementParallelGC.sh --- a/jdk/test/java/lang/management/MemoryMXBean/MemoryManagementParallelGC.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/MemoryMXBean/MemoryManagementParallelGC.sh Wed Jul 05 23:09:40 2017 +0200 @@ -26,8 +26,9 @@ # @bug 4530538 # @summary Run MemoryManagement test with parallel GC # @author Mandy Chung +# # @requires vm.gc=="Parallel" | vm.gc=="null" -# @modules java.management +# # @run build MemoryManagement # @run shell/timeout=600 MemoryManagementParallelGC.sh # @@ -42,7 +43,7 @@ fi runOne() -{ +{ echo "runOne $@" $TESTJAVA/bin/java ${TESTVMOPTS} -classpath $TESTCLASSES $@ || exit 2 } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/MemoryMXBean/MemoryManagementSerialGC.sh --- a/jdk/test/java/lang/management/MemoryMXBean/MemoryManagementSerialGC.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/MemoryMXBean/MemoryManagementSerialGC.sh Wed Jul 05 23:09:40 2017 +0200 @@ -26,8 +26,9 @@ # @bug 4530538 # @summary Run MemoryManagement test with serial GC # @author Mandy Chung +# # @requires vm.gc=="Serial" | vm.gc=="null" -# @modules java.management +# # @run build MemoryManagement # @run shell/timeout=600 MemoryManagementSerialGC.sh # @@ -42,7 +43,7 @@ fi runOne() -{ +{ echo "runOne $@" $TESTJAVA/bin/java ${TESTVMOPTS} -classpath $TESTCLASSES $@ || exit 2 } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/MemoryMXBean/MemoryTestAllGC.sh --- a/jdk/test/java/lang/management/MemoryMXBean/MemoryTestAllGC.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/MemoryMXBean/MemoryTestAllGC.sh Wed Jul 05 23:09:40 2017 +0200 @@ -24,10 +24,11 @@ # # @test # @bug 4530538 -# @summary +# @summary # @author Mandy Chung +# # @requires vm.gc=="Parallel" | vm.gc=="null" -# @modules java.management +# # @run compile MemoryTest.java # @run shell MemoryTestAllGC.sh # @@ -42,7 +43,7 @@ fi runOne() -{ +{ echo "runOne $@" $TESTJAVA/bin/java ${TESTVMOPTS} -classpath $TESTCLASSES $@ || exit 2 } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/MemoryMXBean/Pending.java --- a/jdk/test/java/lang/management/MemoryMXBean/Pending.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/MemoryMXBean/Pending.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,8 +24,6 @@ /* * @test * @bug 4530538 - * @modules java.base/jdk.internal.misc - * java.management * @summary Basic unit test of * RuntimeMXBean.getObjectPendingFinalizationCount() * 1. GC and runFinalization() to get the current pending number @@ -34,6 +32,9 @@ * 4. GC and runFinalization() and the finalizable objects should * be garbage collected. * @author Alexei Guibadoulline and Mandy Chung + * + * @modules java.base/jdk.internal.misc + * java.management */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java --- a/jdk/test/java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java Wed Jul 05 23:09:40 2017 +0200 @@ -32,12 +32,13 @@ * @summary Basic Test for MemoryPool.resetPeakUsage() * @author Mandy Chung * + * @requires vm.opt.ExplicitGCInvokesConcurrent != "true" + * @requires vm.opt.DisableExplicitGC != "true" * @library /lib/testlibrary/ * @modules jdk.management + * * @build jdk.testlibrary.* ResetPeakMemoryUsage MemoryUtil RunUtil * @run main ResetPeakMemoryUsage - * @requires vm.opt.ExplicitGCInvokesConcurrent != "true" - * @requires vm.opt.DisableExplicitGC != "true" */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/MemoryPoolMXBean/ThresholdTest.java --- a/jdk/test/java/lang/management/MemoryPoolMXBean/ThresholdTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/MemoryPoolMXBean/ThresholdTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * MemoryPoolMXBean.isCollectionThresholdExceeded(). * @author Mandy Chung * - * @modules java.management * @run main/othervm ThresholdTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh --- a/jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh Wed Jul 05 23:09:40 2017 +0200 @@ -23,11 +23,10 @@ # # @test +# @bug 6336608 6367473 6511738 # @summary Tests OperatingSystemMXBean.getSystemLoadAverage() api. # @author Mandy Chung -# @bug 6336608 6367473 6511738 # -# @modules java.management # @run build GetSystemLoadAverage # @run shell/timeout=300 TestSystemLoadAvg.sh # diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java --- a/jdk/test/java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/PlatformLoggingMXBean/LoggingMXBeanTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Test if proxy for PlatformLoggingMXBean is equivalent * to proxy for LoggingMXBean * - * @modules jdk.management * @build LoggingMXBeanTest * @run main LoggingMXBeanTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java --- a/jdk/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,12 +24,10 @@ /* * @test * @bug 6876135 7024172 7067691 - * * @summary Test PlatformLoggingMXBean * This test performs similar testing as * java/util/logging/LoggingMXBeanTest. * - * @modules jdk.management * @build PlatformLoggingMXBeanTest * @run main PlatformLoggingMXBeanTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/PlatformLoggingMXBean/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/management/PlatformLoggingMXBean/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = java.logging + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java --- a/jdk/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/RuntimeMXBean/GetSystemProperties.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 4990512 * @summary Basic Test for RuntimeMXBean.getSystemProperties(). * @author Mandy Chung - * @modules java.management */ import java.lang.management.ManagementFactory; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/RuntimeMXBean/PropertiesTest.java --- a/jdk/test/java/lang/management/RuntimeMXBean/PropertiesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/RuntimeMXBean/PropertiesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * properties contain another list of properties as the defaults. * @author Mandy Chung * - * @modules java.management * @run build PropertiesTest * @run main PropertiesTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh --- a/jdk/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/RuntimeMXBean/TestInputArgument.sh Wed Jul 05 23:09:40 2017 +0200 @@ -24,9 +24,9 @@ # # @test # @bug 4530538 -# @summary +# @summary # @author Mandy Chung -# @modules java.management +# # @run compile InputArgument.java # @run shell TestInputArgument.sh # @@ -41,12 +41,12 @@ fi runOne() -{ +{ echo "runOne $@" $TESTJAVA/bin/java $TESTVMOPTS -classpath $TESTCLASSES "$@" || exit 2 } -runOne InputArgument +runOne InputArgument runOne -XX:+UseFastJNIAccessors -Xlog:gc*=debug InputArgument runOne -XX:+UseFastJNIAccessors -Xlog:gc*=debug InputArgument -XX:+UseFastJNIAccessors diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/RuntimeMXBean/UpTime.java --- a/jdk/test/java/lang/management/RuntimeMXBean/UpTime.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/RuntimeMXBean/UpTime.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 4530538 * @summary Basic unit test of RuntimeMXBean.getUptime() * @author Alexei Guibadoulline - * @modules java.management */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/management/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = java.management + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/AllThreadIds.java --- a/jdk/test/java/lang/management/ThreadMXBean/AllThreadIds.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/AllThreadIds.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,11 +24,10 @@ /* * @test * @bug 4530538 + * @key intermittent * @summary Basic unit test of ThreadMXBean.getAllThreadIds() * @author Alexei Guibadoulline and Mandy Chung * - * @key intermittent - * @modules java.management * @run main/othervm AllThreadIds */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/DisableTest.java --- a/jdk/test/java/lang/management/ThreadMXBean/DisableTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/DisableTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary The capability is disabled regardless of number of times * it was enabled. * @author Mandy Chung - * @modules java.management */ import java.lang.management.ThreadMXBean; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/EnableTest.java --- a/jdk/test/java/lang/management/ThreadMXBean/EnableTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/EnableTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,6 @@ * and ThreadMXBean.setThreadCpuTimeEnabled(). * @author Mandy Chung * - * @modules java.management * @run main EnableTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/FindDeadlocks.java --- a/jdk/test/java/lang/management/ThreadMXBean/FindDeadlocks.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/FindDeadlocks.java Wed Jul 05 23:09:40 2017 +0200 @@ -31,7 +31,6 @@ * - ThreadMXBean.findMonitorDeadlockedThreads() * @author Mandy Chung * - * @modules java.management * @build MonitorDeadlock * @build SynchronizerDeadlock * @build ThreadDump diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/FindMonitorDeadlock.java --- a/jdk/test/java/lang/management/ThreadMXBean/FindMonitorDeadlock.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/FindMonitorDeadlock.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * - ThreadMXBean.findMonitorDeadlockedThreads() * @author Mandy Chung * - * @modules java.management * @build MonitorDeadlock * @build ThreadDump * @run main/othervm FindMonitorDeadlock diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/InvalidThreadID.java --- a/jdk/test/java/lang/management/ThreadMXBean/InvalidThreadID.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/InvalidThreadID.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * if id <= 0 and returns -1 if the thread doesn't exist. * @author Mandy Chung * - * @modules java.management * @run main InvalidThreadID */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/LockedMonitors.java --- a/jdk/test/java/lang/management/ThreadMXBean/LockedMonitors.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/LockedMonitors.java Wed Jul 05 23:09:40 2017 +0200 @@ -34,7 +34,6 @@ * * @author Mandy Chung * - * @modules java.management * @build Barrier * @build LockingThread * @build ThreadDump diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/LockedSynchronizers.java --- a/jdk/test/java/lang/management/ThreadMXBean/LockedSynchronizers.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/LockedSynchronizers.java Wed Jul 05 23:09:40 2017 +0200 @@ -30,7 +30,6 @@ * * @author Mandy Chung * - * @modules java.management * @build Barrier * @build SynchronizerLockingThread * @build ThreadDump diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/Locks.java --- a/jdk/test/java/lang/management/ThreadMXBean/Locks.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/Locks.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,11 +26,11 @@ * @bug 4530538 * @summary Basic unit test of ThreadInfo.getLockName() * and ThreadInfo.getLockOwnerName() - * @library /lib/testlibrary * @author Mandy Chung * @author Jaroslav Bachorik * - * @modules java.management + * @library /lib/testlibrary + * * @build jdk.testlibrary.* * @run main/othervm Locks */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/MyOwnSynchronizer.java --- a/jdk/test/java/lang/management/ThreadMXBean/MyOwnSynchronizer.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/MyOwnSynchronizer.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * and getThreadInfo of customized JSR-166 synchronizers. * @author Mandy Chung * - * @modules java.management * @build Barrier * @build ThreadDump * @run main/othervm MyOwnSynchronizer diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/ResetPeakThreadCount.java --- a/jdk/test/java/lang/management/ThreadMXBean/ResetPeakThreadCount.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/ResetPeakThreadCount.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,6 @@ * @author Mandy Chung * @author Jaroslav Bachorik * - * @modules java.management * @build ResetPeakThreadCount * @build ThreadDump * @run main/othervm ResetPeakThreadCount diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/SharedSynchronizer.java --- a/jdk/test/java/lang/management/ThreadMXBean/SharedSynchronizer.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/SharedSynchronizer.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * in shared mode which has no owner when a thread is parked. * @author Mandy Chung * - * @modules java.management * @run main/othervm SharedSynchronizer */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/SynchronizationStatistics.java --- a/jdk/test/java/lang/management/ThreadMXBean/SynchronizationStatistics.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/SynchronizationStatistics.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,11 +25,9 @@ * @test * @bug 4530538 * @summary Basic unit test of the synchronization statistics support: - * * @author Mandy Chung * @author Jaroslav Bachorik * - * @modules java.management * @run main/othervm SynchronizationStatistics */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/ThreadBlockedCount.java --- a/jdk/test/java/lang/management/ThreadMXBean/ThreadBlockedCount.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/ThreadBlockedCount.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Basic unit test of ThreadInfo.getBlockedCount() * @author Alexei Guibadoulline and Mandy Chung * @author Jaroslav Bachorik - * @modules java.management + * * @run main ThreadBlockedCount */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/ThreadCounts.java --- a/jdk/test/java/lang/management/ThreadMXBean/ThreadCounts.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/ThreadCounts.java Wed Jul 05 23:09:40 2017 +0200 @@ -30,7 +30,6 @@ * mbean.getDaemonThreadCount() * @author Alexei Guibadoulline * - * @modules java.management * @run main ThreadCounts */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/ThreadCpuTime.java --- a/jdk/test/java/lang/management/ThreadMXBean/ThreadCpuTime.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/ThreadCpuTime.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Basic test of ThreadMXBean.getThreadCpuTime and * getCurrentThreadCpuTime. * @author Mandy Chung - * @modules java.management */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/ThreadDaemonTest.java --- a/jdk/test/java/lang/management/ThreadMXBean/ThreadDaemonTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/ThreadDaemonTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -31,7 +31,6 @@ * @bug 6588467 * @summary Basic test of ThreadInfo.isDaemon * @author Jeremy Manson - * @modules java.management */ public class ThreadDaemonTest { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/ThreadLists.java --- a/jdk/test/java/lang/management/ThreadMXBean/ThreadLists.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/ThreadLists.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 5047639 * @summary Check that the "java-level" APIs provide a consistent view of * the thread list - * @modules java.management */ import java.lang.management.ManagementFactory; import java.lang.management.ThreadMXBean; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/ThreadMXBeanStateTest.java --- a/jdk/test/java/lang/management/ThreadMXBean/ThreadMXBeanStateTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/ThreadMXBeanStateTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,12 +27,11 @@ * @summary Basic unit test of thread states returned by * ThreadMXBean.getThreadInfo.getThreadState(). * It also tests lock information returned by ThreadInfo. - * * @author Mandy Chung * * @library ../../Thread * @library /lib/testlibrary - * @modules java.management + * * @build jdk.testlibrary.* * @build ThreadMXBeanStateTest ThreadStateController * @run main ThreadMXBeanStateTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/ThreadStackTrace.java --- a/jdk/test/java/lang/management/ThreadMXBean/ThreadStackTrace.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/ThreadStackTrace.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,6 @@ * ThreadInfo.getThreadState() * @author Mandy Chung * - * @modules java.management * @run build Utils * @run main ThreadStackTrace */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/management/ThreadMXBean/ThreadUserTime.java --- a/jdk/test/java/lang/management/ThreadMXBean/ThreadUserTime.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/management/ThreadMXBean/ThreadUserTime.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Basic test of ThreadMXBean.getThreadUserTime and * getCurrentThreadUserTime. * @author Mandy Chung - * @modules java.management */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/module/AutomaticModulesTest.java --- a/jdk/test/java/lang/module/AutomaticModulesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/module/AutomaticModulesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -773,9 +773,6 @@ // test miscellaneous methods assertTrue(m.isAutomatic()); assertFalse(m.modifiers().contains(ModuleDescriptor.Modifier.SYNTHETIC)); - assertFalse(m.osName().isPresent()); - assertFalse(m.osArch().isPresent()); - assertFalse(m.osVersion().isPresent()); } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/module/ConfigurationTest.java --- a/jdk/test/java/lang/module/ConfigurationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/module/ConfigurationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,25 +25,31 @@ * @test * @library /lib/testlibrary * @modules java.base/jdk.internal.misc + * java.base/jdk.internal.module * @build ConfigurationTest ModuleUtils * @run testng ConfigurationTest * @summary Basic tests for java.lang.module.Configuration */ +import java.io.IOException; +import java.io.OutputStream; import java.lang.module.Configuration; import java.lang.module.FindException; import java.lang.module.ModuleDescriptor; -import java.lang.module.ModuleDescriptor.Builder; import java.lang.module.ModuleDescriptor.Requires; import java.lang.module.ModuleFinder; import java.lang.module.ResolutionException; import java.lang.module.ResolvedModule; import java.lang.reflect.Layer; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.List; import java.util.Optional; import java.util.Set; import jdk.internal.misc.SharedSecrets; +import jdk.internal.module.ModuleInfoWriter; +import jdk.internal.module.ModuleTarget; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import static org.testng.Assert.*; @@ -438,70 +444,6 @@ /** - * Basic test of "requires transitive" with configurations. - * - * The test consists of three configurations: - * - Configuration cf1: m1, m2 requires transitive m1 - * - Configuration cf2: m1, m3 requires transitive m1 - * - Configuration cf3(cf1,cf2): m4 requires m2, m3 - */ - public void testRequiresTransitive6() { - ModuleDescriptor descriptor1 = newBuilder("m1") - .build(); - - ModuleDescriptor descriptor2 = newBuilder("m2") - .requires(Set.of(Requires.Modifier.TRANSITIVE), "m1") - .build(); - - ModuleDescriptor descriptor3 = newBuilder("m3") - .requires(Set.of(Requires.Modifier.TRANSITIVE), "m1") - .build(); - - ModuleDescriptor descriptor4 = newBuilder("m4") - .requires("m2") - .requires("m3") - .build(); - - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); - Configuration cf1 = resolve(finder1, "m2"); - assertTrue(cf1.modules().size() == 2); - assertTrue(cf1.findModule("m1").isPresent()); - assertTrue(cf1.findModule("m2").isPresent()); - assertTrue(cf1.parents().size() == 1); - assertTrue(cf1.parents().get(0) == Configuration.empty()); - - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, descriptor3); - Configuration cf2 = resolve(finder2, "m3"); - assertTrue(cf2.modules().size() == 2); - assertTrue(cf2.findModule("m3").isPresent()); - assertTrue(cf2.findModule("m1").isPresent()); - assertTrue(cf2.parents().size() == 1); - assertTrue(cf2.parents().get(0) == Configuration.empty()); - - ModuleFinder finder3 = ModuleUtils.finderOf(descriptor4); - Configuration cf3 = Configuration.resolve(finder3, - List.of(cf1, cf2), - ModuleFinder.of(), - Set.of("m4")); - assertTrue(cf3.modules().size() == 1); - assertTrue(cf3.findModule("m4").isPresent()); - - ResolvedModule m1_l = cf1.findModule("m1").get(); - ResolvedModule m1_r = cf2.findModule("m1").get(); - ResolvedModule m2 = cf1.findModule("m2").get(); - ResolvedModule m3 = cf2.findModule("m3").get(); - ResolvedModule m4 = cf3.findModule("m4").get(); - assertTrue(m4.configuration() == cf3); - - assertTrue(m4.reads().size() == 4); - assertTrue(m4.reads().contains(m1_l)); - assertTrue(m4.reads().contains(m1_r)); - assertTrue(m4.reads().contains(m2)); - assertTrue(m4.reads().contains(m3)); - } - - - /** * Basic test of "requires static": * m1 requires static m2 * m2 is not observable @@ -1603,6 +1545,76 @@ /** + * Basic test to detect reading a module with the same name as itself + * + * The test consists of three configurations: + * - Configuration cf1: m1, m2 requires transitive m1 + * - Configuration cf2: m1 requires m2 + */ + @Test(expectedExceptions = { ResolutionException.class }) + public void testReadModuleWithSameNameAsSelf() { + ModuleDescriptor descriptor1_v1 = newBuilder("m1") + .build(); + + ModuleDescriptor descriptor2 = newBuilder("m2") + .requires(Set.of(Requires.Modifier.TRANSITIVE), "m1") + .build(); + + ModuleDescriptor descriptor1_v2 = newBuilder("m1") + .requires("m2") + .build(); + + ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1_v1, descriptor2); + Configuration cf1 = resolve(finder1, "m2"); + assertTrue(cf1.modules().size() == 2); + + // resolve should throw ResolutionException + ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1_v2); + resolve(cf1, finder2, "m1"); + } + + + /** + * Basic test to detect reading two modules with the same name + * + * The test consists of three configurations: + * - Configuration cf1: m1, m2 requires transitive m1 + * - Configuration cf2: m1, m3 requires transitive m1 + * - Configuration cf3(cf1,cf2): m4 requires m2, m3 + */ + @Test(expectedExceptions = { ResolutionException.class }) + public void testReadTwoModuleWithSameName() { + ModuleDescriptor descriptor1 = newBuilder("m1") + .build(); + + ModuleDescriptor descriptor2 = newBuilder("m2") + .requires(Set.of(Requires.Modifier.TRANSITIVE), "m1") + .build(); + + ModuleDescriptor descriptor3 = newBuilder("m3") + .requires(Set.of(Requires.Modifier.TRANSITIVE), "m1") + .build(); + + ModuleDescriptor descriptor4 = newBuilder("m4") + .requires("m2") + .requires("m3") + .build(); + + ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); + Configuration cf1 = resolve(finder1, "m2"); + assertTrue(cf1.modules().size() == 2); + + ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, descriptor3); + Configuration cf2 = resolve(finder2, "m3"); + assertTrue(cf2.modules().size() == 2); + + // should throw ResolutionException as m4 will read modules named "m1". + ModuleFinder finder3 = ModuleUtils.finderOf(descriptor4); + Configuration.resolve(finder3, List.of(cf1, cf2), ModuleFinder.of(), Set.of("m4")); + } + + + /** * Test two modules exporting package p to a module that reads both. */ @Test(expectedExceptions = { ResolutionException.class }) @@ -1832,26 +1844,17 @@ public Object[][] createPlatformMatches() { return new Object[][]{ - { "linux-*-*", "*-*-*" }, - { "*-arm-*", "*-*-*" }, - { "*-*-2.6", "*-*-*" }, - - { "linux-arm-*", "*-*-*" }, - { "linux-*-2.6", "*-*-*" }, - { "*-arm-2.6", "*-*-*" }, - - { "linux-arm-2.6", "*-*-*" }, - - { "linux-*-*", "linux-*-*" }, - { "*-arm-*", "*-arm-*" }, - { "*-*-2.6", "*-*-2.6" }, - - { "linux-arm-*", "linux-arm-*" }, - { "linux-arm-*", "linux-*-*" }, - { "linux-*-2.6", "linux-*-2.6" }, - { "linux-*-2.6", "linux-arm-*" }, - - { "linux-arm-2.6", "linux-arm-2.6" }, + { "linux-arm", "*-*" }, + { "linux-*", "*-*" }, + { "*-arm", "*-*" }, + + { "linux-*", "linux-*" }, + { "linux-arm", "linux-*" }, + + { "*-arm", "*-arm" }, + { "linux-arm", "*-arm" }, + + { "linux-arm", "linux-arm" }, }; @@ -1861,9 +1864,10 @@ public Object[][] createBad() { return new Object[][] { - { "linux-*-*", "solaris-*-*" }, - { "linux-x86-*", "linux-arm-*" }, - { "linux-*-2.4", "linux-x86-2.6" }, + { "linux-*", "solaris-*" }, + { "*-arm", "*-sparc" }, + { "linux-x86", "solaris-sparc" }, + }; } @@ -1871,21 +1875,25 @@ * Test creating a configuration containing platform specific modules. */ @Test(dataProvider = "platformmatch") - public void testPlatformMatch(String s1, String s2) { - - Builder builder = newBuilder("m1").requires("m2"); - addPlatformConstraints(builder, s1); - ModuleDescriptor descriptor1 = builder.build(); - - builder = newBuilder("m2"); - addPlatformConstraints(builder, s2); - ModuleDescriptor descriptor2 = builder.build(); - - ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2); + public void testPlatformMatch(String s1, String s2) throws IOException { + + ModuleDescriptor base = ModuleDescriptor.newModule("java.base").build(); + Path system = writeModule(base, "*-*"); + + ModuleDescriptor descriptor1 = ModuleDescriptor.newModule("m1") + .requires("m2") + .build(); + Path dir1 = writeModule(descriptor1, s1); + + ModuleDescriptor descriptor2 = ModuleDescriptor.newModule("m2").build(); + Path dir2 = writeModule(descriptor2, s2); + + ModuleFinder finder = ModuleFinder.of(system, dir1, dir2); Configuration cf = resolve(finder, "m1"); - assertTrue(cf.modules().size() == 2); + assertTrue(cf.modules().size() == 3); + assertTrue(cf.findModule("java.base").isPresent()); assertTrue(cf.findModule("m1").isPresent()); assertTrue(cf.findModule("m2").isPresent()); } @@ -1896,11 +1904,10 @@ */ @Test(dataProvider = "platformmismatch", expectedExceptions = FindException.class ) - public void testPlatformMisMatch(String s1, String s2) { + public void testPlatformMisMatch(String s1, String s2) throws IOException { testPlatformMatch(s1, s2); } - // no parents @Test(expectedExceptions = { IllegalArgumentException.class }) @@ -1917,21 +1924,23 @@ // parents with modules for specific platforms - @Test(dataProvider = "platformmatch") - public void testResolveRequiresWithCompatibleParents(String s1, String s2) { - Builder builder = newBuilder("m1"); - addPlatformConstraints(builder, s1); - ModuleDescriptor descriptor1 = builder.build(); - - builder = newBuilder("m2"); - addPlatformConstraints(builder, s2); - ModuleDescriptor descriptor2 = builder.build(); - - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); + public void testResolveRequiresWithCompatibleParents(String s1, String s2) + throws IOException + { + ModuleDescriptor base = ModuleDescriptor.newModule("java.base").build(); + Path system = writeModule(base, "*-*"); + + ModuleDescriptor descriptor1 = ModuleDescriptor.newModule("m1").build(); + Path dir1 = writeModule(descriptor1, s1); + + ModuleDescriptor descriptor2 = ModuleDescriptor.newModule("m2").build(); + Path dir2 = writeModule(descriptor2, s2); + + ModuleFinder finder1 = ModuleFinder.of(system, dir1); Configuration cf1 = resolve(finder1, "m1"); - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2); + ModuleFinder finder2 = ModuleFinder.of(system, dir2); Configuration cf2 = resolve(finder2, "m2"); Configuration cf3 = Configuration.resolve(ModuleFinder.of(), @@ -1941,32 +1950,16 @@ assertTrue(cf3.parents().size() == 2); } + @Test(dataProvider = "platformmismatch", expectedExceptions = IllegalArgumentException.class ) - public void testResolveRequiresWithConflictingParents(String s1, String s2) { - Builder builder = newBuilder("m1"); - addPlatformConstraints(builder, s1); - ModuleDescriptor descriptor1 = builder.build(); - - builder = newBuilder("m2"); - addPlatformConstraints(builder, s2); - ModuleDescriptor descriptor2 = builder.build(); - - ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); - Configuration cf1 = resolve(finder1, "m1"); - - ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2); - Configuration cf2 = resolve(finder2, "m2"); - - // should throw IAE - Configuration.resolve(ModuleFinder.of(), - List.of(cf1, cf2), - ModuleFinder.of(), - Set.of()); + public void testResolveRequiresWithConflictingParents(String s1, String s2) + throws IOException + { + testResolveRequiresWithCompatibleParents(s1, s2); } - // null handling // finder1, finder2, roots @@ -2121,30 +2114,23 @@ /** - * Returns {@code true} if the configuration contains module mn1 - * that reads module mn2. - */ - static boolean reads(Configuration cf, String mn1, String mn2) { - Optional om1 = cf.findModule(mn1); - if (!om1.isPresent()) - return false; - - return om1.get().reads().stream() - .map(ResolvedModule::name) - .anyMatch(mn2::equals); - } - - /** * Decodes the platform string and calls the builder osName/osArch/osVersion * methods to set the platform constraints. */ - static void addPlatformConstraints(Builder builder, String platformString) { + static Path writeModule(ModuleDescriptor descriptor, String platformString) + throws IOException + { String[] s = platformString.split("-"); - if (!s[0].equals("*")) - builder.osName(s[0]); - if (!s[1].equals("*")) - builder.osArch(s[1]); - if (!s[2].equals("*")) - builder.osVersion(s[2]); + String osName = !s[0].equals("*") ? s[0] : null; + String osArch = !s[1].equals("*") ? s[1] : null; + ModuleTarget target = new ModuleTarget(osName, osArch); + + String name = descriptor.name(); + Path dir = Files.createTempDirectory(name); + Path mi = dir.resolve("module-info.class"); + try (OutputStream out = Files.newOutputStream(mi)) { + ModuleInfoWriter.write(descriptor, target, out); + } + return dir; } } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/module/ModuleDescriptorTest.java --- a/jdk/test/java/lang/module/ModuleDescriptorTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/module/ModuleDescriptorTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -50,11 +50,13 @@ import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import static java.lang.module.ModuleDescriptor.Requires.Modifier.*; +import jdk.internal.misc.JavaLangModuleAccess; import jdk.internal.misc.SharedSecrets; import jdk.internal.module.ModuleInfoWriter; import org.testng.annotations.DataProvider; @@ -988,6 +990,107 @@ } + @DataProvider(name = "unparseableVersions") + public Object[][] unparseableVersions() { + return new Object[][]{ + + { null, "A1" }, // no version < unparseable + { "A1", "A2" }, // unparseable < unparseable + { "A1", "1.0" }, // unparseable < parseable + + }; + } + + /** + * Basic test for unparseable module versions + */ + @Test(dataProvider = "unparseableVersions") + public void testUnparseableModuleVersion(String vs1, String vs2) { + ModuleDescriptor descriptor1 = newModule("m", vs1); + ModuleDescriptor descriptor2 = newModule("m", vs2); + + if (vs1 != null && !isParsableVersion(vs1)) { + assertFalse(descriptor1.version().isPresent()); + assertTrue(descriptor1.rawVersion().isPresent()); + assertEquals(descriptor1.rawVersion().get(), vs1); + } + + if (vs2 != null && !isParsableVersion(vs2)) { + assertFalse(descriptor2.version().isPresent()); + assertTrue(descriptor2.rawVersion().isPresent()); + assertEquals(descriptor2.rawVersion().get(), vs2); + } + + assertFalse(descriptor1.equals(descriptor2)); + assertFalse(descriptor2.equals(descriptor1)); + assertTrue(descriptor1.compareTo(descriptor2) == -1); + assertTrue(descriptor2.compareTo(descriptor1) == 1); + } + + /** + * Basic test for requiring a module with an unparseable version recorded + * at compile version. + */ + @Test(dataProvider = "unparseableVersions") + public void testUnparseableCompiledVersion(String vs1, String vs2) { + Requires r1 = newRequires("m", vs1); + Requires r2 = newRequires("m", vs2); + + if (vs1 != null && !isParsableVersion(vs1)) { + assertFalse(r1.compiledVersion().isPresent()); + assertTrue(r1.rawCompiledVersion().isPresent()); + assertEquals(r1.rawCompiledVersion().get(), vs1); + } + + if (vs2 != null && !isParsableVersion(vs2)) { + assertFalse(r2.compiledVersion().isPresent()); + assertTrue(r2.rawCompiledVersion().isPresent()); + assertEquals(r2.rawCompiledVersion().get(), vs2); + } + + assertFalse(r1.equals(r2)); + assertFalse(r2.equals(r1)); + assertTrue(r1.compareTo(r2) == -1); + assertTrue(r2.compareTo(r1) == 1); + } + + private ModuleDescriptor newModule(String name, String vs) { + JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess(); + Builder builder = JLMA.newModuleBuilder(name, false, Set.of()); + if (vs != null) + builder.version(vs); + builder.requires("java.base"); + ByteBuffer bb = ModuleInfoWriter.toByteBuffer(builder.build()); + return ModuleDescriptor.read(bb); + } + + private Requires newRequires(String name, String vs) { + JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess(); + Builder builder = JLMA.newModuleBuilder("foo", false, Set.of()); + if (vs == null) { + builder.requires(name); + } else { + JLMA.requires(builder, Set.of(), name, vs); + } + Set requires = builder.build().requires(); + Iterator iterator = requires.iterator(); + ModuleDescriptor.Requires r = iterator.next(); + if (r.name().equals("java.base")) { + r = iterator.next(); + } + return r; + } + + private boolean isParsableVersion(String vs) { + try { + Version.parse(vs); + return true; + } catch (IllegalArgumentException e) { + return false; + } + } + + // toNameAndVersion public void testToNameAndVersion() { @@ -1170,59 +1273,6 @@ } - // osName - - public void testOsName() { - String osName = ModuleDescriptor.newModule("foo").osName("Linux").build().osName().get(); - assertEquals(osName, "Linux"); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testNullOsName() { - ModuleDescriptor.newModule("foo").osName(null); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testEmptyOsName() { - ModuleDescriptor.newModule("foo").osName(""); - } - - - // osArch - - public void testOsArch() { - String osArch = ModuleDescriptor.newModule("foo").osName("arm").build().osName().get(); - assertEquals(osArch, "arm"); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testNullOsArch() { - ModuleDescriptor.newModule("foo").osArch(null); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testEmptyOsArch() { - ModuleDescriptor.newModule("foo").osArch(""); - } - - - // osVersion - - public void testOsVersion() { - String osVersion = ModuleDescriptor.newModule("foo").osName("11.2").build().osName().get(); - assertEquals(osVersion, "11.2"); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testNullOsVersion() { - ModuleDescriptor.newModule("foo").osVersion(null); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testEmptyOsVersion() { - ModuleDescriptor.newModule("foo").osVersion(""); - } - // reads private static InputStream EMPTY_INPUT_STREAM = new InputStream() { @@ -1239,7 +1289,9 @@ } }; - // basic test reading module-info.class + /** + * Basic test reading module-info.class + */ public void testRead() throws Exception { Module base = Object.class.getModule(); @@ -1256,6 +1308,7 @@ assertEquals(descriptor.name(), "java.base"); } } + /** * Test ModuleDescriptor with a packager finder */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/module/ModuleFinderTest.java --- a/jdk/test/java/lang/module/ModuleFinderTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/module/ModuleFinderTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -373,7 +373,7 @@ /** - * Test ModuleModule with a JAR file containing a .class file in the top + * Test ModuleFinder with a JAR file containing a .class file in the top * level directory. */ public void testOfOneJarFileWithTopLevelClass() throws Exception { @@ -386,6 +386,7 @@ assertTrue(false); } catch (FindException e) { assertTrue(e.getCause() instanceof InvalidModuleDescriptorException); + assertTrue(e.getCause().getMessage().contains("Mojo.class")); } finder = ModuleFinder.of(jar); @@ -394,11 +395,12 @@ assertTrue(false); } catch (FindException e) { assertTrue(e.getCause() instanceof InvalidModuleDescriptorException); + assertTrue(e.getCause().getMessage().contains("Mojo.class")); } } /** - * Test ModuleModule with a JAR file containing a .class file in the top + * Test ModuleFinder with a JAR file containing a .class file in the top * level directory. */ public void testOfOneExplodedModuleWithTopLevelClass() throws Exception { @@ -411,6 +413,7 @@ assertTrue(false); } catch (FindException e) { assertTrue(e.getCause() instanceof InvalidModuleDescriptorException); + assertTrue(e.getCause().getMessage().contains("Mojo.class")); } finder = ModuleFinder.of(m_dir); @@ -419,6 +422,7 @@ assertTrue(false); } catch (FindException e) { assertTrue(e.getCause() instanceof InvalidModuleDescriptorException); + assertTrue(e.getCause().getMessage().contains("Mojo.class")); } } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/module/ModuleFinderWithSecurityManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/module/ModuleFinderWithSecurityManager.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @run main/othervm ModuleFinderWithSecurityManager allow + * @run main/othervm ModuleFinderWithSecurityManager deny + * @summary Basic test for ModuleFinder.ofSystem() with security manager + */ + +import java.lang.module.ModuleFinder; +import java.lang.module.ModuleReference; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Set; + +public class ModuleFinderWithSecurityManager { + public static void main(String[] args) throws Exception { + boolean allow = args[0].equals("allow"); + + // set security policy to allow access + if (allow) { + String testSrc = System.getProperty("test.src"); + if (testSrc == null) + testSrc = "."; + Path policyFile = Paths.get(testSrc, "java.policy"); + System.setProperty("java.security.policy", policyFile.toString()); + } + + System.setSecurityManager(new SecurityManager()); + + ModuleFinder finder = null; + try { + finder = ModuleFinder.ofSystem(); + if (!allow) throw new RuntimeException("SecurityException expected"); + } catch (SecurityException e) { + if (allow) throw new RuntimeException("SecurityException not expected"); + } + + // no additional permissions should be required to locate modules + if (finder != null) { + ModuleReference base = finder.find("java.base").orElse(null); + if (base == null) + throw new RuntimeException("java.base not found"); + Set allModules = finder.findAll(); + if (!allModules.contains(base)) + throw new RuntimeException("java.base not in all modules"); + } + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/module/ModuleReader/ModuleReaderTest.java --- a/jdk/test/java/lang/module/ModuleReader/ModuleReaderTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/module/ModuleReader/ModuleReaderTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -79,17 +79,21 @@ "java/lang/Object.class" }; + // (directory) resources that may be in the base module + private static final String[] MAYBE_BASE_RESOURCES = { + "java", + "java/", + "java/lang", + "java/lang/", + }; + // resource names that should not be found in the base module - private static final String[] BAD_BASE_RESOURCES = { + private static final String[] NOT_BASE_RESOURCES = { "NotFound", - "java", "/java", "//java", - "java/", - "java/lang", "/java/lang", "//java/lang", - "java/lang/", "java//lang", "/java/lang/Object.class", "//java/lang/Object.class", @@ -109,13 +113,17 @@ "p/Main.class" }; + // (directory) resources that may be in the test module + private static final String[] MAYBE_TEST_RESOURCES = { + "p", + "p/" + }; + // resource names that should not be found in the test module - private static final String[] BAD_TEST_RESOURCES = { + private static final String[] NOT_TEST_RESOURCES = { "NotFound", - "p", "/p", "//p", - "p/", "/p/Main.class", "//p/Main.class", "p/Main.class/", @@ -160,11 +168,19 @@ testOpen(reader, name, expectedBytes); testRead(reader, name, expectedBytes); testList(reader, name); - } - // test "not found" - for (String name : BAD_BASE_RESOURCES) { + // test resources that may be in the base module + for (String name : MAYBE_BASE_RESOURCES) { + Optional ouri = reader.find(name); + ouri.ifPresent(uri -> { + if (name.endsWith("/")) + assertTrue(uri.toString().endsWith("/")); + }); + } + + // test "not found" in java.base module + for (String name : NOT_BASE_RESOURCES) { assertFalse(reader.find(name).isPresent()); assertFalse(reader.open(name).isPresent()); assertFalse(reader.read(name).isPresent()); @@ -261,7 +277,7 @@ try (reader) { - // test each of the known resources in the module + // test resources in test module for (String name : TEST_RESOURCES) { byte[] expectedBytes = Files.readAllBytes(MODS_DIR @@ -274,8 +290,18 @@ testList(reader, name); } - // test "not found" - for (String name : BAD_TEST_RESOURCES) { + // test resources that may be in the test module + for (String name : MAYBE_TEST_RESOURCES) { + System.out.println(name); + Optional ouri = reader.find(name); + ouri.ifPresent(uri -> { + if (name.endsWith("/")) + assertTrue(uri.toString().endsWith("/")); + }); + } + + // test "not found" in test module + for (String name : NOT_TEST_RESOURCES) { assertFalse(reader.find(name).isPresent()); assertFalse(reader.open(name).isPresent()); assertFalse(reader.read(name).isPresent()); @@ -394,9 +420,6 @@ for (String e : names) { assertTrue(reader.find(e).isPresent()); } - - // should not contain directories - names.forEach(e -> assertFalse(e.endsWith("/"))); } } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/module/java.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/module/java.policy Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,4 @@ +grant { + // ModuleFinder.ofSystem() needs this + permission java.lang.RuntimePermission "accessSystemModules"; +}; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/reflect/Layer/BasicLayerTest.java --- a/jdk/test/java/lang/reflect/Layer/BasicLayerTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/reflect/Layer/BasicLayerTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -45,6 +45,8 @@ import java.util.stream.Collectors; import jdk.internal.misc.SharedSecrets; + +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import static org.testng.Assert.*; @@ -670,6 +672,258 @@ /** + * Test layers with a qualified export. The module exporting the package + * does not read the target module. + * + * m1 { exports p to m2 } + * m2 { } + */ + public void testQualifiedExports1() { + ModuleDescriptor descriptor1 = newBuilder("m1"). + exports("p", Set.of("m2")) + .build(); + + ModuleDescriptor descriptor2 = newBuilder("m2") + .build(); + + ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); + + Configuration cf = resolve(finder1, "m1", "m2"); + + ClassLoader cl = new ClassLoader() { }; + Layer layer = Layer.empty().defineModules(cf, mn -> cl); + assertTrue(layer.modules().size() == 2); + + Module m1 = layer.findModule("m1").get(); + Module m2 = layer.findModule("m2").get(); + + // check m1 exports p to m2 + assertFalse(m1.isExported("p")); + assertTrue(m1.isExported("p", m2)); + assertFalse(m1.isOpen("p", m2)); + } + + + /** + * Test layers with a qualified export. The module exporting the package + * reads the target module. + * + * m1 { exports p to m2; } + * m2 { requires m1; } + */ + public void testQualifiedExports2() { + ModuleDescriptor descriptor1 = newBuilder("m1") + .exports("p", Set.of("m2")) + .build(); + + ModuleDescriptor descriptor2 = newBuilder("m2") + .requires("m1") + .build(); + + ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); + + Configuration cf = resolve(finder1, "m2"); + ClassLoader cl = new ClassLoader() { }; + Layer layer = Layer.empty().defineModules(cf, mn -> cl); + assertTrue(layer.modules().size() == 2); + + Module m1 = layer.findModule("m1").get(); + Module m2 = layer.findModule("m2").get(); + + // check m1 exports p to m2 + assertFalse(m1.isExported("p")); + assertTrue(m1.isExported("p", m2)); + assertFalse(m1.isOpen("p", m2)); + } + + + /** + * Test layers with a qualified export. The module exporting the package + * does not read the target module in the parent layer. + * + * - Configuration/layer1: m1 { } + * - Configuration/layer2: m2 { exports p to m1; } + */ + public void testQualifiedExports3() { + // create layer1 with m1 + ModuleDescriptor descriptor1 = newBuilder("m1").build(); + ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); + Configuration cf1 = resolve(finder1, "m1"); + ClassLoader cl1 = new ClassLoader() { }; + Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); + assertTrue(layer1.modules().size() == 1); + + // create layer2 with m2 + ModuleDescriptor descriptor2 = newBuilder("m2") + .exports("p", Set.of("m1")) + .build(); + ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2); + Configuration cf2 = resolve(cf1, finder2, "m2"); + ClassLoader cl2 = new ClassLoader() { }; + Layer layer2 = layer1.defineModules(cf2, mn -> cl2); + assertTrue(layer2.modules().size() == 1); + + Module m1 = layer1.findModule("m1").get(); + Module m2 = layer2.findModule("m2").get(); + + // check m2 exports p to layer1/m1 + assertFalse(m2.isExported("p")); + assertTrue(m2.isExported("p", m1)); + assertFalse(m2.isOpen("p", m1)); + } + + + /** + * Test layers with a qualified export. The module exporting the package + * reads the target module in the parent layer. + * + * - Configuration/layer1: m1 { } + * - Configuration/layer2: m2 { requires m1; exports p to m1; } + */ + public void testQualifiedExports4() { + // create layer1 with m1 + ModuleDescriptor descriptor1 = newBuilder("m1").build(); + ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); + Configuration cf1 = resolve(finder1, "m1"); + ClassLoader cl1 = new ClassLoader() { }; + Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); + assertTrue(layer1.modules().size() == 1); + + // create layer2 with m2 + ModuleDescriptor descriptor2 = newBuilder("m2") + .requires("m1") + .exports("p", Set.of("m1")) + .build(); + ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2); + Configuration cf2 = resolve(cf1, finder2, "m2"); + ClassLoader cl2 = new ClassLoader() { }; + Layer layer2 = layer1.defineModules(cf2, mn -> cl2); + assertTrue(layer2.modules().size() == 1); + + Module m1 = layer1.findModule("m1").get(); + Module m2 = layer2.findModule("m2").get(); + + // check m2 exports p to layer1/m1 + assertFalse(m2.isExported("p")); + assertTrue(m2.isExported("p", m1)); + assertFalse(m2.isOpen("p", m1)); + } + + /** + * Test layers with a qualified export. The module exporting the package + * does not read the target module. + * + * - Configuration/layer1: m1 + * - Configuration/layer2: m1, m2 { exports p to m1; } + */ + public void testQualifiedExports5() { + // create layer1 with m1 + ModuleDescriptor descriptor1 = newBuilder("m1").build(); + ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); + Configuration cf1 = resolve(finder1, "m1"); + ClassLoader cl1 = new ClassLoader() { }; + Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); + assertTrue(layer1.modules().size() == 1); + + // create layer2 with m1 and m2 + ModuleDescriptor descriptor2 = newBuilder("m2").exports("p", Set.of("m1")).build(); + ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, descriptor2); + Configuration cf2 = resolve(cf1, finder2, "m1", "m2"); + ClassLoader cl2 = new ClassLoader() { }; + Layer layer2 = layer1.defineModules(cf2, mn -> cl2); + assertTrue(layer2.modules().size() == 2); + + Module m1_v1 = layer1.findModule("m1").get(); + Module m1_v2 = layer2.findModule("m1").get(); + Module m2 = layer2.findModule("m2").get(); + + // check m2 exports p to layer2/m2 + assertFalse(m2.isExported("p")); + assertTrue(m2.isExported("p", m1_v2)); + assertFalse(m2.isExported("p", m1_v1)); + } + + + /** + * Test layers with a qualified export. The module exporting the package + * reads the target module in the parent layer (due to requires transitive). + * + * - Configuration/layer1: m1, m2 { requires transitive m1; } + * - Configuration/layer2: m1, m3 { requires m2; exports p to m1; } + */ + public void testQualifiedExports6() { + // create layer1 with m1 and m2 + ModuleDescriptor descriptor1 = newBuilder("m1").build(); + ModuleDescriptor descriptor2 = newBuilder("m2") + .requires(Set.of(Requires.Modifier.TRANSITIVE), "m1") + .build(); + ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2); + Configuration cf1 = resolve(finder1, "m2"); + ClassLoader loader1 = new ClassLoader() { }; + Layer layer1 = Layer.empty().defineModules(cf1, mn -> loader1); + assertTrue(layer1.modules().size() == 2); + + // create layer2 with m1 and m3 + ModuleDescriptor descriptor3 = newBuilder("m3") + .requires("m2") + .exports("p", Set.of("m1")) + .build(); + ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, descriptor3); + Configuration cf2 = resolve(cf1, finder2, "m1", "m3"); + ClassLoader loader2 = new ClassLoader() { }; + Layer layer2 = layer1.defineModules(cf2, mn -> loader2); + assertTrue(layer2.modules().size() == 2); + + Module m1_v1 = layer1.findModule("m1").get(); + Module m2 = layer1.findModule("m2").get(); + + Module m1_v2 = layer2.findModule("m1").get(); + Module m3 = layer2.findModule("m3").get(); + + assertTrue(m3.canRead(m1_v1)); + assertFalse(m3.canRead(m1_v2)); + + assertFalse(m3.isExported("p")); + assertTrue(m3.isExported("p", m1_v1)); + assertFalse(m3.isExported("p", m1_v2)); + assertFalse(m3.isExported("p", m2)); + } + + + /** + * Test layers with a qualified export. The target module is not in any layer. + * + * - Configuration/layer1: m1 { } + * - Configuration/layer2: m2 { exports p to m3; } + */ + public void testQualifiedExports7() { + // create layer1 with m1 + ModuleDescriptor descriptor1 = newBuilder("m1").build(); + ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1); + Configuration cf1 = resolve(finder1, "m1"); + ClassLoader cl1 = new ClassLoader() { }; + Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1); + assertTrue(layer1.modules().size() == 1); + + // create layer2 with m2 + ModuleDescriptor descriptor2 = newBuilder("m2") + .exports("p", Set.of("m3")) + .build(); + ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2); + Configuration cf2 = resolve(cf1, finder2, "m2"); + ClassLoader cl2 = new ClassLoader() { }; + Layer layer2 = layer1.defineModules(cf2, mn -> cl2); + assertTrue(layer2.modules().size() == 1); + + Module m1 = layer1.findModule("m1").get(); + Module m2 = layer2.findModule("m2").get(); + + // check m2 does not export p to anyone + assertFalse(m2.isExported("p")); + assertFalse(m2.isExported("p", m1)); + } + + /** * Attempt to use Layer defineModules to create a layer with a module * defined to a class loader that already has a module of the same name * defined to the class loader. @@ -796,29 +1050,31 @@ } + @DataProvider(name = "javaPackages") + public Object[][] javaPackages() { + return new Object[][] { { "m1", "java" }, { "m2", "java.x" } }; + } + /** - * Attempt to create a Layer with a module containing a "java." package. + * Attempt to create a Layer with a module containing a "java" package. * This should only be allowed when the module is defined to the platform * class loader. */ - @Test(enabled = false) - public void testLayerWithJavaPackage() { - ModuleDescriptor descriptor = newBuilder("foo") - .packages(Set.of("java.foo")) - .build(); - + @Test(dataProvider = "javaPackages") + public void testLayerWithJavaPackage(String mn, String pn) { + ModuleDescriptor descriptor = newBuilder(mn).packages(Set.of(pn)).build(); ModuleFinder finder = ModuleUtils.finderOf(descriptor); Configuration cf = Layer.boot() .configuration() - .resolve(finder, ModuleFinder.of(), Set.of("foo")); + .resolve(finder, ModuleFinder.of(), Set.of(mn)); assertTrue(cf.modules().size() == 1); ClassLoader pcl = ClassLoader.getPlatformClassLoader(); ClassLoader scl = ClassLoader.getSystemClassLoader(); try { - Layer.boot().defineModules(cf, mn -> new ClassLoader() { }); + Layer.boot().defineModules(cf, _mn -> new ClassLoader() { }); assertTrue(false); } catch (LayerInstantiationException e) { } @@ -833,13 +1089,13 @@ } catch (LayerInstantiationException e) { } // create layer with module defined to platform class loader - Layer layer = Layer.boot().defineModules(cf, mn -> pcl); - Optional om = layer.findModule("foo"); + Layer layer = Layer.boot().defineModules(cf, _mn -> pcl); + Optional om = layer.findModule(mn); assertTrue(om.isPresent()); Module foo = om.get(); assertTrue(foo.getClassLoader() == pcl); assertTrue(foo.getPackages().length == 1); - assertTrue(foo.getPackages()[0].equals("java.foo")); + assertTrue(foo.getPackages()[0].equals(pn)); } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/reflect/Module/allow.policy --- a/jdk/test/java/lang/reflect/Module/allow.policy Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/reflect/Module/allow.policy Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,5 +23,6 @@ grant { permission java.lang.RuntimePermission "getClassLoader"; - permission java.io.FilePermission "${java.home}/-", "read"; + permission java.lang.RuntimePermission "accessSystemModules"; + permission java.io.FilePermission "${java.home}/modules/-", "read"; // exploded build }; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java --- a/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -57,8 +57,7 @@ /* * @test * @bug 8062389 - * @modules java.compiler - * jdk.compiler + * @modules jdk.compiler * jdk.zipfs * @summary Nearly exhaustive test of Class.getMethod() and Class.getMethods() * @run main PublicMethodsTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/net/spi/URLStreamHandlerProvider/Basic.java --- a/jdk/test/java/net/spi/URLStreamHandlerProvider/Basic.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/net/spi/URLStreamHandlerProvider/Basic.java Wed Jul 05 23:09:40 2017 +0200 @@ -53,8 +53,7 @@ /* * @test * @bug 8064924 - * @modules java.compiler - * jdk.compiler + * @modules jdk.compiler * @summary Basic test for URLStreamHandlerProvider * @library /lib/testlibrary * @build jdk.testlibrary.FileUtils jdk.testlibrary.JDKToolFinder diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/nio/channels/DatagramChannel/NetworkConfiguration.java --- a/jdk/test/java/nio/channels/DatagramChannel/NetworkConfiguration.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/nio/channels/DatagramChannel/NetworkConfiguration.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,22 +57,11 @@ return ip6Interfaces.get(nif); } - // IPv6 not supported for Windows XP/Server 2003 - static boolean isIPv6Supported() { - if (System.getProperty("os.name").startsWith("Windows")) { - String ver = System.getProperty("os.version"); - int major = Integer.parseInt(ver.split("\\.")[0]); - return (major >= 6); - } - return true; - } - static NetworkConfiguration probe() throws IOException { Map> ip4Interfaces = new HashMap>(); Map> ip6Interfaces = new HashMap>(); - boolean isIPv6Supported = isIPv6Supported(); // find the interfaces that support IPv4 and IPv6 List nifs = Collections @@ -92,7 +81,7 @@ } list.add(addr); ip4Interfaces.put(nif, list); - } else if (isIPv6Supported && (addr instanceof Inet6Address)) { + } else if (addr instanceof Inet6Address) { List list = ip6Interfaces.get(nif); if (list == null) { list = new LinkedList(); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/nio/channels/FileChannel/LoopingTruncate.java --- a/jdk/test/java/nio/channels/FileChannel/LoopingTruncate.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/nio/channels/FileChannel/LoopingTruncate.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,7 +28,7 @@ * @summary (fc) Infinite loop FileChannel.truncate * @library /lib/testlibrary * @build jdk.testlibrary.Utils - * @run main/othervm LoopingTruncate + * @run main/othervm/timeout=300 LoopingTruncate */ import java.nio.ByteBuffer; @@ -37,6 +37,7 @@ import java.nio.file.Files; import java.nio.file.Path; import static java.nio.file.StandardOpenOption.*; +import java.util.concurrent.TimeUnit; import static jdk.testlibrary.Utils.adjustTimeout; public class LoopingTruncate { @@ -51,11 +52,21 @@ Path path = Files.createTempFile("LoopingTruncate.tmp", null); try (FileChannel fc = FileChannel.open(path, CREATE, WRITE)) { fc.position(FATEFUL_SIZE + 1L); + System.out.println(" Writing large file..."); + long t0 = System.nanoTime(); fc.write(ByteBuffer.wrap(new byte[] {0})); + long t1 = System.nanoTime(); + System.out.printf(" Wrote large file in %d ns (%d ms) %n", + t1 - t0, TimeUnit.NANOSECONDS.toMillis(t1 - t0)); Thread th = new Thread(() -> { try { + System.out.println(" Truncating large file..."); + long t2 = System.nanoTime(); fc.truncate(FATEFUL_SIZE); + long t3 = System.nanoTime(); + System.out.printf(" Truncated large file in %d ns (%d ms) %n", + t3 - t2, TimeUnit.NANOSECONDS.toMillis(t3 - t2)); } catch (ClosedByInterruptException ignore) { } catch (Exception e) { throw new RuntimeException(e); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/nio/channels/FileChannel/Transfer.java --- a/jdk/test/java/nio/channels/FileChannel/Transfer.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/nio/channels/FileChannel/Transfer.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,30 +22,24 @@ */ /* @test - * @bug 4434723 4482726 4559072 4638365 4795550 5081340 5103988 6253145 - * 6984545 + * @bug 4434723 4482726 4559072 4795550 5081340 5103988 6984545 * @key intermittent * @summary Test FileChannel.transferFrom and transferTo (use -Dseed=X to set PRNG seed) * @library .. * @library /lib/testlibrary/ * @build jdk.testlibrary.* - * @run testng Transfer + * @run testng/timeout=300 Transfer * @key randomness */ import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.PrintStream; import java.io.RandomAccessFile; import java.io.Reader; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.ByteBuffer; @@ -55,8 +49,6 @@ import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.channels.spi.SelectorProvider; -import java.nio.file.StandardOpenOption; -import java.nio.file.FileAlreadyExistsException; import java.util.Random; import java.util.concurrent.TimeUnit; @@ -67,8 +59,6 @@ public class Transfer { private static Random generator = RandomFactory.getRandom(); - private static PrintStream err = System.err; - private static PrintStream out = System.out; @Test public void testFileChannel() throws Exception { @@ -242,105 +232,7 @@ dest.delete(); } - // Test transferTo with large file - @Test - public void xferTest04() throws Exception { // for bug 4638365 - // Windows and Linux can't handle the really large file sizes for a - // truncate or a positional write required by the test for 4563125 - String osName = System.getProperty("os.name"); - if (!(osName.startsWith("SunOS") || osName.contains("OS X"))) - return; - File source = File.createTempFile("blah", null); - source.deleteOnExit(); - long testSize = ((long)Integer.MAX_VALUE) * 2; - initTestFile(source, 10); - RandomAccessFile raf = new RandomAccessFile(source, "rw"); - FileChannel fc = raf.getChannel(); - fc.write(ByteBuffer.wrap("Use the source!".getBytes()), testSize - 40); - fc.close(); - raf.close(); - - File sink = File.createTempFile("sink", null); - sink.deleteOnExit(); - - FileInputStream fis = new FileInputStream(source); - FileChannel sourceChannel = fis.getChannel(); - - raf = new RandomAccessFile(sink, "rw"); - FileChannel sinkChannel = raf.getChannel(); - - long bytesWritten = sourceChannel.transferTo(testSize -40, 10, - sinkChannel); - if (bytesWritten != 10) { - throw new RuntimeException("Transfer test 4 failed " + - bytesWritten); - } - sourceChannel.close(); - sinkChannel.close(); - - source.delete(); - sink.delete(); - } - - // Test transferFrom with large file - @Test - public void xferTest05() throws Exception { // for bug 4638365 - // Create a source file & large sink file for the test - File source = File.createTempFile("blech", null); - source.deleteOnExit(); - initTestFile(source, 100); - - // Create the sink file as a sparse file if possible - File sink = null; - FileChannel fc = null; - while (fc == null) { - sink = File.createTempFile("sink", null); - // re-create as a sparse file - sink.delete(); - try { - fc = FileChannel.open(sink.toPath(), - StandardOpenOption.CREATE_NEW, - StandardOpenOption.WRITE, - StandardOpenOption.SPARSE); - } catch (FileAlreadyExistsException ignore) { - // someone else got it - } - } - sink.deleteOnExit(); - - long testSize = ((long)Integer.MAX_VALUE) * 2; - try { - fc.write(ByteBuffer.wrap("Use the source!".getBytes()), - testSize - 40); - } catch (IOException e) { - // Can't set up the test, abort it - err.println("xferTest05 was aborted."); - return; - } finally { - fc.close(); - } - - // Get new channels for the source and sink and attempt transfer - FileChannel sourceChannel = new FileInputStream(source).getChannel(); - try { - FileChannel sinkChannel = new RandomAccessFile(sink, "rw").getChannel(); - try { - long bytesWritten = sinkChannel.transferFrom(sourceChannel, - testSize - 40, 10); - if (bytesWritten != 10) { - throw new RuntimeException("Transfer test 5 failed " + - bytesWritten); - } - } finally { - sinkChannel.close(); - } - } finally { - sourceChannel.close(); - } - - source.delete(); - sink.delete(); - } + // xferTest04() and xferTest05() moved to Transfer4GBFile.java static void checkFileData(File file, String expected) throws Exception { FileInputStream fis = new FileInputStream(file); @@ -425,118 +317,7 @@ source.delete(); } - - // Test transferTo with file positions larger than 2 and 4GB - @Test - public void xferTest08() throws Exception { // for bug 6253145 - // Creating a sparse 6GB file on Windows takes too long - String osName = System.getProperty("os.name"); - if (osName.startsWith("Windows")) - return; - - final long G = 1024L * 1024L * 1024L; - - // Create 6GB file - - File file = File.createTempFile("source", null); - file.deleteOnExit(); - - RandomAccessFile raf = new RandomAccessFile(file, "rw"); - FileChannel fc = raf.getChannel(); - - out.println(" Creating large file..."); - long t0 = System.nanoTime(); - try { - fc.write(ByteBuffer.wrap("0123456789012345".getBytes("UTF-8")), 6*G); - long t1 = System.nanoTime(); - out.printf(" Created large file in %d ns (%d ms) %n", - t1 - t0, TimeUnit.NANOSECONDS.toMillis(t1 - t0)); - } catch (IOException x) { - err.println(" Unable to create test file:" + x); - fc.close(); - return; - } - - // Setup looback connection and echo server - - ServerSocketChannel ssc = ServerSocketChannel.open(); - ssc.socket().bind(new InetSocketAddress(0)); - - InetAddress lh = InetAddress.getLocalHost(); - InetSocketAddress isa = new InetSocketAddress(lh, ssc.socket().getLocalPort()); - SocketChannel source = SocketChannel.open(isa); - SocketChannel sink = ssc.accept(); - - Thread thr = new Thread(new EchoServer(sink)); - thr.start(); - - // Test data is array of positions and counts - - long testdata[][] = { - { 2*G-1, 1 }, - { 2*G-1, 10 }, // across 2GB boundary - { 2*G, 1 }, - { 2*G, 10 }, - { 2*G+1, 1 }, - { 4*G-1, 1 }, - { 4*G-1, 10 }, // across 4GB boundary - { 4*G, 1 }, - { 4*G, 10 }, - { 4*G+1, 1 }, - { 5*G-1, 1 }, - { 5*G-1, 10 }, - { 5*G, 1 }, - { 5*G, 10 }, - { 5*G+1, 1 }, - { 6*G, 1 }, - }; - - ByteBuffer sendbuf = ByteBuffer.allocateDirect(100); - ByteBuffer readbuf = ByteBuffer.allocateDirect(100); - - try { - byte value = 0; - for (int i=0; i 0) { - sc.write(bb); - } - bb.clear(); - } - } catch (IOException x) { - x.printStackTrace(); - } finally { - try { - sc.close(); - } catch (IOException ignore) { } - } - } - } - } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/nio/channels/FileChannel/Transfer4GBFile.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/nio/channels/FileChannel/Transfer4GBFile.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 4638365 + * @key intermittent + * @summary Test FileChannel.transferFrom and transferTo for 4GB files + * @run testng/timeout=300 Transfer4GBFile + */ + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintStream; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.StandardOpenOption; +import java.nio.file.FileAlreadyExistsException; +import java.util.concurrent.TimeUnit; + +import org.testng.annotations.Test; + +public class Transfer4GBFile { + + private static PrintStream err = System.err; + private static PrintStream out = System.out; + + // Test transferTo with large file + @Test + public void xferTest04() throws Exception { // for bug 4638365 + File source = File.createTempFile("blah", null); + source.deleteOnExit(); + long testSize = ((long)Integer.MAX_VALUE) * 2; + initTestFile(source, 10); + RandomAccessFile raf = new RandomAccessFile(source, "rw"); + FileChannel fc = raf.getChannel(); + out.println(" Writing large file..."); + long t0 = System.nanoTime(); + fc.write(ByteBuffer.wrap("Use the source!".getBytes()), testSize - 40); + long t1 = System.nanoTime(); + out.printf(" Wrote large file in %d ns (%d ms) %n", + t1 - t0, TimeUnit.NANOSECONDS.toMillis(t1 - t0)); + + fc.close(); + raf.close(); + + File sink = File.createTempFile("sink", null); + sink.deleteOnExit(); + + FileInputStream fis = new FileInputStream(source); + FileChannel sourceChannel = fis.getChannel(); + + raf = new RandomAccessFile(sink, "rw"); + FileChannel sinkChannel = raf.getChannel(); + + long bytesWritten = sourceChannel.transferTo(testSize -40, 10, + sinkChannel); + if (bytesWritten != 10) { + throw new RuntimeException("Transfer test 4 failed " + + bytesWritten); + } + sourceChannel.close(); + sinkChannel.close(); + + source.delete(); + sink.delete(); + } + + // Test transferFrom with large file + @Test + public void xferTest05() throws Exception { // for bug 4638365 + // Create a source file & large sink file for the test + File source = File.createTempFile("blech", null); + source.deleteOnExit(); + initTestFile(source, 100); + + // Create the sink file as a sparse file if possible + File sink = null; + FileChannel fc = null; + while (fc == null) { + sink = File.createTempFile("sink", null); + // re-create as a sparse file + sink.delete(); + try { + fc = FileChannel.open(sink.toPath(), + StandardOpenOption.CREATE_NEW, + StandardOpenOption.WRITE, + StandardOpenOption.SPARSE); + } catch (FileAlreadyExistsException ignore) { + // someone else got it + } + } + sink.deleteOnExit(); + + long testSize = ((long)Integer.MAX_VALUE) * 2; + try { + out.println(" Writing large file..."); + long t0 = System.nanoTime(); + fc.write(ByteBuffer.wrap("Use the source!".getBytes()), + testSize - 40); + long t1 = System.nanoTime(); + out.printf(" Wrote large file in %d ns (%d ms) %n", + t1 - t0, TimeUnit.NANOSECONDS.toMillis(t1 - t0)); + } catch (IOException e) { + // Can't set up the test, abort it + err.println("xferTest05 was aborted."); + return; + } finally { + fc.close(); + } + + // Get new channels for the source and sink and attempt transfer + FileChannel sourceChannel = new FileInputStream(source).getChannel(); + try { + FileChannel sinkChannel = new RandomAccessFile(sink, "rw").getChannel(); + try { + long bytesWritten = sinkChannel.transferFrom(sourceChannel, + testSize - 40, 10); + if (bytesWritten != 10) { + throw new RuntimeException("Transfer test 5 failed " + + bytesWritten); + } + } finally { + sinkChannel.close(); + } + } finally { + sourceChannel.close(); + } + + source.delete(); + sink.delete(); + } + + /** + * Creates file blah of specified size in bytes. + */ + private static void initTestFile(File blah, long size) throws Exception { + if (blah.exists()) + blah.delete(); + FileOutputStream fos = new FileOutputStream(blah); + BufferedWriter awriter + = new BufferedWriter(new OutputStreamWriter(fos, "8859_1")); + + for(int i=0; i 0) { + sc.write(bb); + } + bb.clear(); + } + } catch (IOException x) { + x.printStackTrace(); + } finally { + try { + sc.close(); + } catch (IOException ignore) { } + } + } + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/nio/channels/FileChannel/Transfers.java --- a/jdk/test/java/nio/channels/FileChannel/Transfers.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/nio/channels/FileChannel/Transfers.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ * @summary Comprehensive test for FileChannel.transfer{From,To} * @bug 4708120 * @author Mark Reinhold + * @run main/timeout=300 Transfers */ import java.io.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/nio/channels/Selector/OutOfBand.java --- a/jdk/test/java/nio/channels/Selector/OutOfBand.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/nio/channels/Selector/OutOfBand.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,9 @@ /* @test * @bug 6213702 + * @requires (os.family != "mac") | (os.version == "10.10.5") + * | (os.simpleVersion != "10.8" & os.simpleVersion != "10.9" + * & os.simpleVersion != "10.10") * @summary OOB data causes a SocketChannel, with OOBINLINE disabled, to be * selected */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/nio/channels/Selector/SelectAndClose.java --- a/jdk/test/java/nio/channels/Selector/SelectAndClose.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/nio/channels/Selector/SelectAndClose.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,19 +29,22 @@ import java.nio.channels.*; import java.io.IOException; +import java.util.concurrent.CountDownLatch; public class SelectAndClose { static Selector selector; - static boolean awakened = false; - static boolean closed = false; + static volatile boolean awakened = false; + static volatile boolean closed = false; public static void main(String[] args) throws Exception { selector = Selector.open(); // Create and start a selector in a separate thread. + final CountDownLatch selectLatch = new CountDownLatch(1); new Thread(new Runnable() { public void run() { try { + selectLatch.countDown(); selector.select(); awakened = true; } catch (IOException e) { @@ -51,10 +54,11 @@ }).start(); // Wait for above thread to get to select() before we call close. - Thread.sleep(3000); + selectLatch.await(); + Thread.sleep(2000); // Try to close. This should wakeup select. - new Thread(new Runnable() { + Thread closeThread = new Thread(new Runnable() { public void run() { try { selector.close(); @@ -63,10 +67,11 @@ System.err.println(e); } } - }).start(); + }); + closeThread.start(); // Wait for select() to be awakened, which should be done by close. - Thread.sleep(3000); + closeThread.join(); if (!awakened) selector.wakeup(); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/nio/channels/Selector/SelectorLimit.java --- a/jdk/test/java/nio/channels/Selector/SelectorLimit.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/nio/channels/Selector/SelectorLimit.java Wed Jul 05 23:09:40 2017 +0200 @@ -66,15 +66,6 @@ static final int MIN_KEYS = 100; public static void main(String[] args) throws Exception { - // win9X can't handle many connections at once - String osName = System.getProperty("os.name"); - if (osName.toLowerCase().startsWith("win")) { - if (!(osName.equals("Windows NT") - || osName.equals("Windows 2000") - || osName.equals("Windows XP"))) - return; - } - ServerSocketChannel ssc = ServerSocketChannel.open(); TestUtil.bind(ssc); Listener lth = new Listener(ssc); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/security/cert/PKIXRevocationChecker/OcspUnauthorized.java --- a/jdk/test/java/security/cert/PKIXRevocationChecker/OcspUnauthorized.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/security/cert/PKIXRevocationChecker/OcspUnauthorized.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,11 +24,14 @@ /** * @test * @bug 8023362 + * @run main/othervm OcspUnauthorized * @summary Make sure Ocsp UNAUTHORIZED response is treated as failure when * SOFT_FAIL option is set */ import java.io.ByteArrayInputStream; +import java.security.Security; +import java.security.cert.CertPathValidatorException.BasicReason; import java.security.cert.*; import java.security.cert.PKIXRevocationChecker.Option; import java.util.Base64; @@ -69,6 +72,8 @@ private static Base64.Decoder base64Decoder = Base64.getDecoder(); public static void main(String[] args) throws Exception { + // EE_CERT is signed with MD5withRSA + Security.setProperty("jdk.certpath.disabledAlgorithms", ""); cf = CertificateFactory.getInstance("X.509"); X509Certificate taCert = getX509Cert(TRUST_ANCHOR); X509Certificate eeCert = getX509Cert(EE_CERT); @@ -92,6 +97,11 @@ throw new Exception("FAILED: expected CertPathValidatorException"); } catch (CertPathValidatorException cpve) { cpve.printStackTrace(); + if (cpve.getReason() != BasicReason.UNSPECIFIED && + !cpve.getMessage().contains("OCSP response error: UNAUTHORIZED")) { + throw new Exception("FAILED: unexpected " + + "CertPathValidatorException reason"); + } } } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/security/cert/X509CRL/VerifyDefault.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/security/cert/X509CRL/VerifyDefault.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8175029 + * @library ../../testlibrary + * @summary check that default implementation of + * X509CRL.verify(PublicKey, Provider) works on custom X509CRL impl. + */ + +import java.math.BigInteger; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.Principal; +import java.security.Provider; +import java.security.PublicKey; +import java.security.SignatureException; +import java.security.cert.Certificate; +import java.security.cert.CRLException; +import java.security.cert.X509Certificate; +import java.security.cert.X509CRL; +import java.security.cert.X509CRLEntry; +import java.util.Date; +import java.util.Set; + +public class VerifyDefault { + private static final String TEST_CRL = + "-----BEGIN X509 CRL-----\n" + + "MIIBGzCBhQIBATANBgkqhkiG9w0BAQQFADAfMQswCQYDVQQGEwJVUzEQMA4GA1UE\n" + + "ChMHRXhhbXBsZRcNMDkwNDI3MDIzODA0WhcNMjgwNjI2MDIzODA0WjAiMCACAQUX\n" + + "DTA5MDQyNzAyMzgwMFowDDAKBgNVHRUEAwoBBKAOMAwwCgYDVR0UBAMCAQIwDQYJ\n" + + "KoZIhvcNAQEEBQADgYEAoarfzXEtw3ZDi4f9U8eSvRIipHSyxOrJC7HR/hM5VhmY\n" + + "CErChny6x9lBVg9s57tfD/P9PSzBLusCcHwHMAbMOEcTltVVKUWZnnbumpywlYyg\n" + + "oKLrE9+yCOkYUOpiRlz43/3vkEL5hjIKMcDSZnPKBZi1h16Yj2hPe9GMibNip54=\n" + + "-----END X509 CRL-----"; + + private static final String TEST_CERT = + "-----BEGIN CERTIFICATE-----\n" + + "MIICKzCCAZSgAwIBAgIBAjANBgkqhkiG9w0BAQQFADAfMQswCQYDVQQGEwJVUzEQ\n" + + "MA4GA1UEChMHRXhhbXBsZTAeFw0wOTA0MjcwMjI0MzNaFw0yOTAxMTIwMjI0MzNa\n" + + "MB8xCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFeGFtcGxlMIGfMA0GCSqGSIb3DQEB\n" + + "AQUAA4GNADCBiQKBgQDMJeBMBybHykI/YpwUJ4O9euqDSLb1kpWpceBS8TVqvgBC\n" + + "SgUJWtFZL0i6bdvF6mMdlbuBkGzhXqHiVAi96/zRLbUC9F8SMEJ6MuD+YhQ0ZFTQ\n" + + "atKy8zf8O9XzztelLJ26Gqb7QPV133WY3haAqHtCXOhEKkCN16NOYNC37DTaJwID\n" + + "AQABo3cwdTAdBgNVHQ4EFgQULXSWzXzUOIpOJpzbSCpW42IJUugwRwYDVR0jBEAw\n" + + "PoAUgiXdIaZeT3QA/SGUvh854OJVyxuhI6QhMB8xCzAJBgNVBAYTAlVTMRAwDgYD\n" + + "VQQKEwdFeGFtcGxlggEAMAsGA1UdDwQEAwIBAjANBgkqhkiG9w0BAQQFAAOBgQAY\n" + + "eMnf5AHSNlyUlzXk8o2S0h4gCuvKX6C3kFfKuZcWvFAbx4yQOWLS2s15/nzR4+AP\n" + + "FGX3lgJjROyAh7fGedTQK+NFWwkM2ag1g3hXktnlnT1qHohi0w31nVBJxXEDO/Ck\n" + + "uJTpJGt8XxxbFaw5v7cHy7XuTAeU/sekvjEiNHW00Q==\n" + + "-----END CERTIFICATE-----"; + + private static class TestX509CRL extends X509CRL { + private final X509CRL crl; + TestX509CRL(X509CRL crl) { + this.crl = crl; + } + public Set getCriticalExtensionOIDs() { + return crl.getCriticalExtensionOIDs(); + } + public byte[] getExtensionValue(String oid) { + return crl.getExtensionValue(oid); + } + public Set getNonCriticalExtensionOIDs() { + return crl.getNonCriticalExtensionOIDs(); + } + public boolean hasUnsupportedCriticalExtension() { + return crl.hasUnsupportedCriticalExtension(); + } + public Set getRevokedCertificates() { + return crl.getRevokedCertificates(); + } + public X509CRLEntry getRevokedCertificate(BigInteger serialNumber) { + return crl.getRevokedCertificate(serialNumber); + } + public boolean isRevoked(Certificate cert) { + return crl.isRevoked(cert); + } + public Date getNextUpdate() { return crl.getNextUpdate(); } + public Date getThisUpdate() { return crl.getThisUpdate(); } + public int getVersion() { return crl.getVersion(); } + public Principal getIssuerDN() { return crl.getIssuerDN(); } + public byte[] getTBSCertList() throws CRLException { + return crl.getTBSCertList(); + } + public byte[] getSignature() { return crl.getSignature(); } + public String getSigAlgName() { return crl.getSigAlgName(); } + public String getSigAlgOID() { return crl.getSigAlgOID(); } + public byte[] getSigAlgParams() { return crl.getSigAlgParams(); } + public byte[] getEncoded() throws CRLException { + return crl.getEncoded(); + } + public void verify(PublicKey key) throws CRLException, + InvalidKeyException, NoSuchAlgorithmException, + NoSuchProviderException, SignatureException { + crl.verify(key); + } + public void verify(PublicKey key, String sigProvider) throws + CRLException, InvalidKeyException, NoSuchAlgorithmException, + NoSuchProviderException, SignatureException { + crl.verify(key, sigProvider); + } + public String toString() { return crl.toString(); } + } + + public static void main(String[] args) throws Exception { + X509Certificate cert = CertUtils.getCertFromString(TEST_CERT); + X509CRL crl = CertUtils.getCRLFromString(TEST_CRL); + new TestX509CRL(crl).verify(cert.getPublicKey(), (Provider)null); + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/security/cert/X509Certificate/VerifyDefault.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/security/cert/X509Certificate/VerifyDefault.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8175029 + * @library ../../testlibrary + * @summary check that default implementation of + * X509Certificate.verify(PublicKey, Provider) works on custom + * X509Certificate impl. + */ + +import java.math.BigInteger; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.Principal; +import java.security.Provider; +import java.security.PublicKey; +import java.security.SignatureException; +import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateExpiredException; +import java.security.cert.CertificateNotYetValidException; +import java.security.cert.X509Certificate; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Set; + +public class VerifyDefault { + private static final String TEST_CERT = + "-----BEGIN CERTIFICATE-----\n" + + "MIICvTCCAaWgAwIBAgIEGYqL9TANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRT\n" + + "ZWxmMB4XDTE3MDMyODE2NDcyNloXDTE3MDYyNjE2NDcyNlowDzENMAsGA1UEAxME\n" + + "U2VsZjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL1pfSJljFVSABOL\n" + + "tJbIVPEkz1+2AFgzY1hqwE0EH80lvhOEkiPPYCKwBE5VTZdyFfwFjpyx7eEeJMNT\n" + + "o7cixfmkQaiXHr/S1AS4BRTqLG/zgLzoJpVbzi45rnVEZc0oTm11KG3uUxkZTRr3\n" + + "5ORbYyZpkscKwHL2M0J/1GmnA1hmhQdwUQyIKxg4eKQwyE+/TdbFlCWVNnOlb+91\n" + + "eXvS11nIJ1oaBgn7u4qihuVmFmngLMxExnLYKV6AwdkwFD6pERObclRD9vAl5eUk\n" + + "+sM6zQYwfLdyC2i8e+ETBeOg1ijptM4KT5Uaq89zxjLR0DPH4S+aILp3gYHGrW5r\n" + + "eMxZAEMCAwEAAaMhMB8wHQYDVR0OBBYEFOME39JtbjzQaK3ufpKo/Pl4sZ8XMA0G\n" + + "CSqGSIb3DQEBCwUAA4IBAQCDcw0+Sf0yeVROVlb2/VV3oIblHkGQheXeIurW64k7\n" + + "tEzHtx9i8dnj5lzTZNH6hU4GRlyULbSDzjcM3P2XFRsM+0a/kEJZVqnLz5ji//7/\n" + + "ZXaRX0TiE2IfFOTGbO6LusO3yR4tOER/WHllz2H21C2SbW3+92Ou28glTZa42AAZ\n" + + "mUj9j+p6mZqD4/tUBqAEqqQoMIhw9CNjc46STNayBjt/0/+I2pfy6LagrMbjBzZ0\n" + + "A5kXg9WjnywGk8XFr/3RZz8DrUmCYs2qCYLCHQHsuCE6gCuf9wKhKyD51MFXXRr0\n" + + "cyG6LYQjrreMHYk4ZfN2NPC6lGjWxB5mIbV/DuikCnYu\n" + + "-----END CERTIFICATE-----"; + + private static class TestX509Certificate extends X509Certificate { + private final X509Certificate cert; + TestX509Certificate(X509Certificate cert) { + this.cert = cert; + } + public Set getCriticalExtensionOIDs() { + return cert.getCriticalExtensionOIDs(); + } + public byte[] getExtensionValue(String oid) { + return cert.getExtensionValue(oid); + } + public Set getNonCriticalExtensionOIDs() { + return cert.getNonCriticalExtensionOIDs(); + } + public boolean hasUnsupportedCriticalExtension() { + return cert.hasUnsupportedCriticalExtension(); + } + public void checkValidity() throws CertificateExpiredException, + CertificateNotYetValidException { + cert.checkValidity(); + } + public void checkValidity(Date date) throws CertificateExpiredException, + CertificateNotYetValidException { + cert.checkValidity(date); + } + public int getVersion() { return cert.getVersion(); } + public BigInteger getSerialNumber() { return cert.getSerialNumber(); } + public Principal getIssuerDN() { return cert.getIssuerDN(); } + public Principal getSubjectDN() { return cert.getSubjectDN(); } + public Date getNotBefore() { return cert.getNotBefore(); } + public Date getNotAfter() { return cert.getNotAfter(); } + public byte[] getTBSCertificate() throws CertificateEncodingException { + return cert.getTBSCertificate(); + } + public byte[] getSignature() { return cert.getSignature(); } + public String getSigAlgName() { return cert.getSigAlgName(); } + public String getSigAlgOID() { return cert.getSigAlgOID(); } + public byte[] getSigAlgParams() { return cert.getSigAlgParams(); } + public boolean[] getIssuerUniqueID() { + return cert.getIssuerUniqueID(); + } + public boolean[] getSubjectUniqueID() { + return cert.getSubjectUniqueID(); + } + public boolean[] getKeyUsage() { return cert.getKeyUsage(); } + public int getBasicConstraints() { return cert.getBasicConstraints(); } + public byte[] getEncoded() throws CertificateEncodingException { + return cert.getEncoded(); + } + public void verify(PublicKey key) throws CertificateException, + InvalidKeyException, NoSuchAlgorithmException, + NoSuchProviderException, SignatureException { + cert.verify(key); + } + public void verify(PublicKey key, String sigProvider) throws + CertificateException, InvalidKeyException, NoSuchAlgorithmException, + NoSuchProviderException, SignatureException { + cert.verify(key, sigProvider); + } + public PublicKey getPublicKey() { return cert.getPublicKey(); } + public String toString() { return cert.toString(); } + } + + public static void main(String[] args) throws Exception { + X509Certificate cert = CertUtils.getCertFromString(TEST_CERT); + new TestX509Certificate(cert).verify(cert.getPublicKey(), + (Provider)null); + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/security/testlibrary/CertUtils.java --- a/jdk/test/java/security/testlibrary/CertUtils.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/security/testlibrary/CertUtils.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,17 +27,20 @@ * @author Steve Hanna * */ +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.IOException; +import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.CertPath; import java.security.cert.CertPathBuilder; import java.security.cert.CertPathValidator; import java.security.cert.CertStore; import java.security.cert.CollectionCertStoreParameters; +import java.security.cert.CRLException; import java.security.cert.PKIXBuilderParameters; import java.security.cert.PKIXCertPathBuilderResult; import java.security.cert.PKIXCertPathValidatorResult; @@ -60,59 +63,71 @@ * Get a DER-encoded X.509 certificate from a file. * * @param certFilePath path to file containing DER-encoded certificate - * @return X509Certificate - * @throws IOException on error + * @return the X509Certificate + * @throws CertificateException if the certificate type is not supported + * or cannot be parsed + * @throws IOException if the file cannot be opened */ public static X509Certificate getCertFromFile(String certFilePath) - throws IOException { - X509Certificate cert = null; - try { - File certFile = new File(System.getProperty("test.src", "."), - certFilePath); - if (!certFile.canRead()) - throw new IOException("File " + - certFile.toString() + - " is not a readable file."); - FileInputStream certFileInputStream = - new FileInputStream(certFile); - CertificateFactory cf = CertificateFactory.getInstance("X509"); - cert = (X509Certificate) - cf.generateCertificate(certFileInputStream); - } catch (Exception e) { - e.printStackTrace(); - throw new IOException("Can't construct X509Certificate: " + - e.getMessage()); - } - return cert; + throws CertificateException, IOException { + File certFile = new File(System.getProperty("test.src", "."), + certFilePath); + try (FileInputStream fis = new FileInputStream(certFile)) { + return (X509Certificate) + CertificateFactory.getInstance("X.509") + .generateCertificate(fis); + } + } + + /** + * Get a PEM-encoded X.509 certificate from a string. + * + * @param cert string containing the PEM-encoded certificate + * @return the X509Certificate + * @throws CertificateException if the certificate type is not supported + * or cannot be parsed + */ + public static X509Certificate getCertFromString(String cert) + throws CertificateException { + byte[] certBytes = cert.getBytes(); + ByteArrayInputStream bais = new ByteArrayInputStream(certBytes); + return (X509Certificate) + CertificateFactory.getInstance("X.509").generateCertificate(bais); } /** * Get a DER-encoded X.509 CRL from a file. * * @param crlFilePath path to file containing DER-encoded CRL - * @return X509CRL - * @throws IOException on error + * @return the X509CRL + * @throws CertificateException if the crl type is not supported + * @throws CRLException if the crl cannot be parsed + * @throws IOException if the file cannot be opened */ public static X509CRL getCRLFromFile(String crlFilePath) - throws IOException { - X509CRL crl = null; - try { - File crlFile = new File(System.getProperty("test.src", "."), - crlFilePath); - if (!crlFile.canRead()) - throw new IOException("File " + - crlFile.toString() + - " is not a readable file."); - FileInputStream crlFileInputStream = - new FileInputStream(crlFile); - CertificateFactory cf = CertificateFactory.getInstance("X509"); - crl = (X509CRL) cf.generateCRL(crlFileInputStream); - } catch (Exception e) { - e.printStackTrace(); - throw new IOException("Can't construct X509CRL: " + - e.getMessage()); - } - return crl; + throws CertificateException, CRLException, IOException { + File crlFile = new File(System.getProperty("test.src", "."), + crlFilePath); + try (FileInputStream fis = new FileInputStream(crlFile)) { + return (X509CRL) + CertificateFactory.getInstance("X.509").generateCRL(fis); + } + } + + /** + * Get a PEM-encoded X.509 crl from a string. + * + * @param crl string containing the PEM-encoded crl + * @return the X509CRL + * @throws CertificateException if the crl type is not supported + * @throws CRLException if the crl cannot be parsed + */ + public static X509CRL getCRLFromString(String crl) + throws CertificateException, CRLException { + byte[] crlBytes = crl.getBytes(); + ByteArrayInputStream bais = new ByteArrayInputStream(crlBytes); + return (X509CRL) + CertificateFactory.getInstance("X.509").generateCRL(bais); } /** diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/util/ServiceLoader/basic/basic.sh --- a/jdk/test/java/util/ServiceLoader/basic/basic.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/util/ServiceLoader/basic/basic.sh Wed Jul 05 23:09:40 2017 +0200 @@ -76,6 +76,7 @@ (cd $JARD; "$JAR" ${TESTTOOLVMOPTS} -cf ../p$n.jar *) done + cp p2.jar p2dup.jar mv p3.jar $EXTD cp $TESTCLASSES/Load.class $TESTD @@ -117,6 +118,8 @@ go ".${SEP}p2.jar" "" FooProvider2 +go ".${SEP}p2.jar${SEP}p2dup.jar" "" FooProvider2 + go "${P3JAR}${SEP}p2.jar" "" FooProvider3 FooProvider2 go "$TESTD${SEP}p2.jar" "" FooProvider1 FooProvider2 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/java/util/concurrent/tck/ForkJoinPool9Test.java --- a/jdk/test/java/util/concurrent/tck/ForkJoinPool9Test.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/java/util/concurrent/tck/ForkJoinPool9Test.java Wed Jul 05 23:09:40 2017 +0200 @@ -32,9 +32,14 @@ * http://creativecommons.org/publicdomain/zero/1.0/ */ +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; -import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.Future; import junit.framework.Test; import junit.framework.TestSuite; @@ -53,29 +58,43 @@ */ public void testCommonPoolThreadContextClassLoader() throws Throwable { if (!testImplementationDetails) return; + + // Ensure common pool has at least one real thread + String prop = System.getProperty( + "java.util.concurrent.ForkJoinPool.common.parallelism"); + if ("0".equals(prop)) return; + VarHandle CCL = MethodHandles.privateLookupIn(Thread.class, MethodHandles.lookup()) .findVarHandle(Thread.class, "contextClassLoader", ClassLoader.class); ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); boolean haveSecurityManager = (System.getSecurityManager() != null); - CompletableFuture.runAsync( - () -> { - assertSame(systemClassLoader, - Thread.currentThread().getContextClassLoader()); - assertSame(systemClassLoader, - CCL.get(Thread.currentThread())); - if (haveSecurityManager) - assertThrows( - SecurityException.class, - () -> System.getProperty("foo"), - () -> Thread.currentThread().setContextClassLoader(null)); - - // TODO ? -// if (haveSecurityManager -// && Thread.currentThread().getClass().getSimpleName() -// .equals("InnocuousForkJoinWorkerThread")) -// assertThrows(SecurityException.class, /* ?? */); - }).join(); + CountDownLatch taskStarted = new CountDownLatch(1); + Runnable runInCommonPool = () -> { + taskStarted.countDown(); + assertTrue(ForkJoinTask.inForkJoinPool()); + assertSame(ForkJoinPool.commonPool(), + ForkJoinTask.getPool()); + assertSame(systemClassLoader, + Thread.currentThread().getContextClassLoader()); + assertSame(systemClassLoader, + CCL.get(Thread.currentThread())); + if (haveSecurityManager) + assertThrows( + SecurityException.class, + () -> System.getProperty("foo"), + () -> Thread.currentThread().setContextClassLoader(null)); + // TODO ? +// if (haveSecurityManager +// && Thread.currentThread().getClass().getSimpleName() +// .equals("InnocuousForkJoinWorkerThread")) +// assertThrows(SecurityException.class, /* ?? */); + }; + Future f = ForkJoinPool.commonPool().submit(runInCommonPool); + // Ensure runInCommonPool is truly running in the common pool, + // by giving this thread no opportunity to "help" on get(). + assertTrue(taskStarted.await(LONG_DELAY_MS, MILLISECONDS)); + assertNull(f.get()); } } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ImplementationVersion/ImplVersionTest.java --- a/jdk/test/javax/management/ImplementationVersion/ImplVersionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ImplementationVersion/ImplVersionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,7 @@ * test codebase has the java permission to read the "java.runtime.version" * system property. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean ImplVersionTest ImplVersionCommand * @run build ImplVersionTest ImplVersionCommand ImplVersionReader * @run main ImplVersionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/AnnotationSecurityTest.java --- a/jdk/test/javax/management/Introspector/AnnotationSecurityTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/AnnotationSecurityTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,10 @@ * @summary Test that having a security manager doesn't trigger a * NotCompliantMBeanException * @author Daniel Fuchs, Yves Joan - * @modules java.management + * + * @modules java.desktop + * java.management + * * @run clean AnnotationSecurityTest Described UnDescribed DescribedMBean * UnDescribedMBean SqeDescriptorKey DescribedMX DescribedMXBean * @run build AnnotationSecurityTest Described UnDescribed DescribedMBean diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/AnnotationTest.java --- a/jdk/test/javax/management/Introspector/AnnotationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/AnnotationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that annotations in Standard MBean interfaces * correctly produce Descriptor entries * @author Eamonn McManus - * @modules java.management + * * @run clean AnnotationTest * @run build AnnotationTest * @run main AnnotationTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/ChangingNotifsTest.java --- a/jdk/test/javax/management/Introspector/ChangingNotifsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/ChangingNotifsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Check that Standard MBeans can change their MBeanNotificationInfo[] * and MXBeans cannot * @author Eamonn McManus - * @modules java.management + * * @run clean ChangingNotifsTest * @run build ChangingNotifsTest * @run main ChangingNotifsTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/ClassLeakTest.java --- a/jdk/test/javax/management/Introspector/ClassLeakTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/ClassLeakTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4909536 * @summary Ensure that the Introspector does not retain refs to classes * @author Eamonn McManus - * @modules java.management + * * @run clean ClassLeakTest * @run build ClassLeakTest * @run main ClassLeakTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/DuplicateGetterTest.java --- a/jdk/test/javax/management/Introspector/DuplicateGetterTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/DuplicateGetterTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Test that an MBean interface can inherit two methods with * the same signature from two unrelated parent interfaces * @author Eamonn McManus - * @modules java.management */ import java.util.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/FeatureOrderTest.java --- a/jdk/test/javax/management/Introspector/FeatureOrderTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/FeatureOrderTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,6 @@ * @summary Test that attributes and operations appear in the same order * in MBeanInfo as they did in the Standard MBean or MXBean Interface. * @author Eamonn McManus - * @modules java.management */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/GetMBeanInfoExceptionTest.java --- a/jdk/test/javax/management/Introspector/GetMBeanInfoExceptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/GetMBeanInfoExceptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that the exception thrown by DynamicMBean.getMBeanInfo() * keeps the init cause. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean GetMBeanInfoExceptionTest * @run build GetMBeanInfoExceptionTest * @run main GetMBeanInfoExceptionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/IdenticalMBeanInfoTest.java --- a/jdk/test/javax/management/Introspector/IdenticalMBeanInfoTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/IdenticalMBeanInfoTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Check that MBeans with the same class have identical MBeanInfo * unless they are NotificationBroadcasters * @author Eamonn McManus - * @modules java.management + * * @run clean IdenticalMBeanInfoTest * @run build IdenticalMBeanInfoTest * @run main IdenticalMBeanInfoTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/ImmutableNotificationInfoTest.java --- a/jdk/test/javax/management/Introspector/ImmutableNotificationInfoTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/ImmutableNotificationInfoTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Check that a StandardMBean has immutableInfo=true if it is * a NotificationBroadcasterSupport that doesn't override getNotificationInfo() * @author Eamonn McManus - * @modules java.management + * * @run clean ImmutableNotificationInfoTest * @run build ImmutableNotificationInfoTest * @run main ImmutableNotificationInfoTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/InvokeGettersTest.java --- a/jdk/test/javax/management/Introspector/InvokeGettersTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/InvokeGettersTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6317101 * @summary Test that the jmx.invoke.getters system property works * @author Eamonn McManus - * @modules java.management + * * @run clean InvokeGettersTest * @run build InvokeGettersTest * @run main InvokeGettersTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/IsMethodTest.java --- a/jdk/test/javax/management/Introspector/IsMethodTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/IsMethodTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4947001 4954369 4954409 4954410 * @summary Test that "Boolean isX()" and "int isX()" define operations * @author Eamonn McManus - * @modules java.management + * * @run clean IsMethodTest * @run build IsMethodTest * @run main IsMethodTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/LegacyConstructorPropertiesTest.java --- a/jdk/test/javax/management/Introspector/LegacyConstructorPropertiesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/LegacyConstructorPropertiesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -37,8 +37,10 @@ * j.b.ConstructorProperties and j.m.ConstructorProperties annotations * only j.m.ConstructorProperties annotation is considered. * @author Jaroslav Bachorik - * @modules java.management - * java.desktop + * + * @modules java.desktop + * java.management + * * @run main LegacyConstructorPropertiesTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/NotAnMBeanTest.java --- a/jdk/test/javax/management/Introspector/NotAnMBeanTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/NotAnMBeanTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4914805 * @summary Ensure that the right exception is thrown for illegal MBeans * @author Eamonn McManus - * @modules java.management + * * @run clean NotAnMBeanTest * @run build NotAnMBeanTest * @run main NotAnMBeanTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/NotCompliantCauseTest.java --- a/jdk/test/javax/management/Introspector/NotCompliantCauseTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/NotCompliantCauseTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that NotCompliantMBeanException has a cause in case of * type mapping problems. * @author Daniel Fuchs, Alexander Shusherov - * @modules java.management + * * @run clean NotCompliantCauseTest * @run build NotCompliantCauseTest * @run main NotCompliantCauseTest @@ -40,7 +40,6 @@ */ import java.util.Random; -import java.util.logging.Logger; import javax.management.MBeanServer; import javax.management.MBeanServerFactory; @@ -55,12 +54,6 @@ public class NotCompliantCauseTest { /** - * A logger for this class. - **/ - private static final Logger LOG = - Logger.getLogger(NotCompliantCauseTest.class.getName()); - - /** * Creates a new instance of NotCompliantCauseTest */ public NotCompliantCauseTest() { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/SetWrongTypeAttributeTest.java --- a/jdk/test/javax/management/Introspector/SetWrongTypeAttributeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/SetWrongTypeAttributeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Check that setting the wrong type of an attribute in a Standard * MBean or MXBean causes InvalidAttributeValueException * @author Eamonn McManus - * @modules java.management + * * @run clean SetWrongTypeAttributeTest * @run build SetWrongTypeAttributeTest * @run main SetWrongTypeAttributeTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/Introspector/UnregisterMBeanExceptionTest.java --- a/jdk/test/javax/management/Introspector/UnregisterMBeanExceptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/Introspector/UnregisterMBeanExceptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * the supplied MBean although DynamicMBean.getMBeanInfo() throws * a runtime exception. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean UnregisterMBeanExceptionTest * @run build UnregisterMBeanExceptionTest * @run main UnregisterMBeanExceptionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanInfo/EqualExceptionTest.java --- a/jdk/test/javax/management/MBeanInfo/EqualExceptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanInfo/EqualExceptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5071110 * @summary Test whether an null descriptor will cause an NullPointerException. * @author Shanliang JIANG - * @modules java.management + * * @run clean EqualExceptionTest * @run build EqualExceptionTest * @run main EqualExceptionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanInfo/MBeanInfoEqualsNPETest.java --- a/jdk/test/javax/management/MBeanInfo/MBeanInfoEqualsNPETest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanInfo/MBeanInfoEqualsNPETest.java Wed Jul 05 23:09:40 2017 +0200 @@ -36,7 +36,7 @@ * @bug 8023954 * @summary Test that MBean*Info.equals do not throw NPE * @author Shanliang JIANG - * @modules java.management + * * @run clean MBeanInfoEqualsNPETest * @run build MBeanInfoEqualsNPETest * @run main MBeanInfoEqualsNPETest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanInfo/MBeanInfoEqualsTest.java --- a/jdk/test/javax/management/MBeanInfo/MBeanInfoEqualsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanInfo/MBeanInfoEqualsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4719923 * @summary Test that MBeanInfo.equals works even for mutable subclasses * @author Eamonn McManus - * @modules java.management + * * @run clean MBeanInfoEqualsTest * @run build MBeanInfoEqualsTest * @run main MBeanInfoEqualsTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanInfo/MBeanInfoHashCodeNPETest.java --- a/jdk/test/javax/management/MBeanInfo/MBeanInfoHashCodeNPETest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanInfo/MBeanInfoHashCodeNPETest.java Wed Jul 05 23:09:40 2017 +0200 @@ -35,7 +35,7 @@ * @bug 8023669 * @summary Test that hashCode()throws NullPointerException * @author Shanliang JIANG - * @modules java.management + * * @run clean MBeanInfoHashCodeNPETest * @run build MBeanInfoHashCodeNPETest * @run main MBeanInfoHashCodeNPETest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanInfo/NullInfoArraysTest.java --- a/jdk/test/javax/management/MBeanInfo/NullInfoArraysTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanInfo/NullInfoArraysTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that an MBeanInfo works even if it is deserialized from * an implementation where its array fields can be null. * @author Eamonn McManus - * @modules java.management + * * @run clean NullInfoArraysTest * @run build NullInfoArraysTest * @run main NullInfoArraysTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanInfo/SerializationTest.java --- a/jdk/test/javax/management/MBeanInfo/SerializationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanInfo/SerializationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6288100 * @summary Test the new serialization/deserialization methods. * @author Shanliang JIANG - * @modules java.management + * * @run clean SerializationTest * @run build SerializationTest * @run main SerializationTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanInfo/SerializationTest1.java --- a/jdk/test/javax/management/MBeanInfo/SerializationTest1.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanInfo/SerializationTest1.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6783290 * @summary Test correct reading of an empty Descriptor. * @author Jaroslav Bachorik - * @modules java.management + * * @run clean SerializationTest1 * @run build SerializationTest1 * @run main SerializationTest1 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanInfo/TooManyFooTest.java --- a/jdk/test/javax/management/MBeanInfo/TooManyFooTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanInfo/TooManyFooTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that a method inherited from two different interfaces * appears only once in MBeanInfo. * @author dfuchs - * @modules java.management + * * @run clean TooManyFooTest * @run build TooManyFooTest * @run main TooManyFooTest @@ -55,12 +55,6 @@ */ public class TooManyFooTest { - /** - * A logger for this class. - **/ - private static final Logger LOG = - Logger.getLogger(TooManyFooTest.class.getName()); - public static class NumberHolder { public Integer getNumber() { return 0;} public void setNumber(Integer n) {}; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/AttributeListTypeSafeTest.java --- a/jdk/test/javax/management/MBeanServer/AttributeListTypeSafeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/AttributeListTypeSafeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6336968 * @summary Test adding non-Attribute values to an AttributeList. * @author Eamonn McManus - * @modules java.management */ import java.util.Collections; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/MBeanExceptionTest.java --- a/jdk/test/javax/management/MBeanServer/MBeanExceptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/MBeanExceptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,8 +28,7 @@ * RuntimeMBeanException and (for Standard MBeans) that checked exceptions * are wrapped in MBeanException * @author Eamonn McManus - * @modules java.management - * @compile MBeanExceptionTest.java + * * @run main MBeanExceptionTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/MBeanFallbackTest.java --- a/jdk/test/javax/management/MBeanServer/MBeanFallbackTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/MBeanFallbackTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -33,7 +33,7 @@ * It needs to be a separate class because the "jdk.jmx.mbeans.allowNonPublic" * system property must be set before c.s.j.m.MBeanAnalyzer has been loaded. * @author Jaroslav Bachorik - * @modules java.management + * * @run clean MBeanFallbackTest * @run build MBeanFallbackTest * @run main/othervm -Djdk.jmx.mbeans.allowNonPublic=true MBeanFallbackTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/MBeanServerInvocationHandlerExceptionTest.java --- a/jdk/test/javax/management/MBeanServer/MBeanServerInvocationHandlerExceptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/MBeanServerInvocationHandlerExceptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5092515 * @summary Test how to unwrap a user specific exception * @author Shanliang JIANG - * @modules java.management + * * @run clean MBeanServerInvocationHandlerExceptionTest * @run build MBeanServerInvocationHandlerExceptionTest * @run main MBeanServerInvocationHandlerExceptionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/MBeanTest.java --- a/jdk/test/javax/management/MBeanServer/MBeanTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/MBeanTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -31,7 +31,7 @@ * @bug 8010285 * @summary General MBean test. * @author Jaroslav Bachorik - * @modules java.management + * * @run clean MBeanTest * @run build MBeanTest * @run main MBeanTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/NewMBeanListenerTest.java --- a/jdk/test/javax/management/MBeanServer/NewMBeanListenerTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/NewMBeanListenerTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4757273 * @summary Test that registered notification is sent early enough * @author Eamonn McManus - * @modules java.management + * * @run clean NewMBeanListenerTest * @run build NewMBeanListenerTest * @run main NewMBeanListenerTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/NotifDeadlockTest.java --- a/jdk/test/javax/management/MBeanServer/NotifDeadlockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/NotifDeadlockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4757273 * @summary Test deadlock in MBeanServerDelegate listeners * @author Eamonn McManus - * @modules java.management + * * @run clean NotifDeadlockTest * @run build NotifDeadlockTest * @run main NotifDeadlockTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/PostExceptionTest.java --- a/jdk/test/javax/management/MBeanServer/PostExceptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/PostExceptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,8 +27,7 @@ * @summary Check behaviour of MBeanServer when postRegister and postDeregister * throw exceptions. * @author Daniel Fuchs - * @modules java.management - * @compile PostExceptionTest.java + * * @run main PostExceptionTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/PostRegisterDeadlockTest.java --- a/jdk/test/javax/management/MBeanServer/PostRegisterDeadlockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/PostRegisterDeadlockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6417044 * @summary Test deadlock in MBeanRegistration.postRegister method * @author Eamonn McManus, Daniel Fuchs - * @modules java.management + * * @run clean PostRegisterDeadlockTest * @run build PostRegisterDeadlockTest * @run main PostRegisterDeadlockTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/PostRegisterDeadlockTest2.java --- a/jdk/test/javax/management/MBeanServer/PostRegisterDeadlockTest2.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/PostRegisterDeadlockTest2.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6417044 * @summary Test that a failing MBean registration does not lead to a deadlock * @author Eamonn McManus - * @modules java.management + * * @run main PostRegisterDeadlockTest2 */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/PreDeregisterDeadlockTest.java --- a/jdk/test/javax/management/MBeanServer/PreDeregisterDeadlockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/PreDeregisterDeadlockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6318664 * @summary Test deadlock in MBeanRegistration.preDeregister method * @author Eamonn McManus - * @modules java.management + * * @run clean PreDeregisterDeadlockTest * @run build PreDeregisterDeadlockTest * @run main PreDeregisterDeadlockTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServer/PreRegisterTest.java --- a/jdk/test/javax/management/MBeanServer/PreRegisterTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServer/PreRegisterTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4911846 * @summary Test that MBeanRegistration can change caller ObjectName * @author Eamonn McManus - * @modules java.management + * * @run clean PreRegisterTest * @run build PreRegisterTest * @run main PreRegisterTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MBeanServerFactory/ReleaseMBeanServerTest.java --- a/jdk/test/javax/management/MBeanServerFactory/ReleaseMBeanServerTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MBeanServerFactory/ReleaseMBeanServerTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that the releaseMBeanServer(MBeanServer mbeanServer) method * throws IllegalArgumentException as expected * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean ReleaseMBeanServerTest * @run build ReleaseMBeanServerTest * @run main ReleaseMBeanServerTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/MustBeValidMBeanInfo/MustBeValidCommand.java --- a/jdk/test/javax/management/MustBeValidMBeanInfo/MustBeValidCommand.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/MustBeValidMBeanInfo/MustBeValidCommand.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * IllegalArgumentException when attribute names, operation names, and * Java type names do not strictly follow the expected Java syntax. * @author Daniel Fuchs - * @modules java.management + * * @run clean MustBeValidCommand * @run build MustBeValidCommand * @run main MustBeValidCommand diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ObjectInstance/MBeanInfoFailTest.java --- a/jdk/test/javax/management/ObjectInstance/MBeanInfoFailTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ObjectInstance/MBeanInfoFailTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5001857 * @summary Test queryNames() and queryMBeans() with a buggy DynamicMBean * @author Daniel Fuchs - * @modules java.management + * * @run clean MBeanInfoFailTest * @run build MBeanInfoFailTest * @run main MBeanInfoFailTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ObjectInstance/ObjectInstanceNullTest.java --- a/jdk/test/javax/management/ObjectInstance/ObjectInstanceNullTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ObjectInstance/ObjectInstanceNullTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5015663 * @summary Test ObjectInstance(name,null).hashCode() and .equals() * @author Daniel Fuchs - * @modules java.management + * * @run clean ObjectInstanceNullTest * @run build ObjectInstanceNullTest * @run main ObjectInstanceNullTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ObjectInstance/ToStringMethodTest.java --- a/jdk/test/javax/management/ObjectInstance/ToStringMethodTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ObjectInstance/ToStringMethodTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5080083 * @summary Test new added method "toString" * @author Shanliang JIANG - * @modules java.management + * * @run clean ToStringMethodTest * @run build ToStringMethodTest * @run main ToStringMethodTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ObjectName/ApplyWildcardTest.java --- a/jdk/test/javax/management/ObjectName/ApplyWildcardTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ObjectName/ApplyWildcardTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test the ObjectName.apply(ObjectName) method * with wildcards in the key properties value part. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean ApplyWildcardTest * @run build ApplyWildcardTest * @run main ApplyWildcardTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ObjectName/ComparatorTest.java --- a/jdk/test/javax/management/ObjectName/ComparatorTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ObjectName/ComparatorTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5036680 * @summary Test the ObjectName.compareTo() method. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean ComparatorTest * @run build ComparatorTest * @run main ComparatorTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ObjectName/DelegateNameWildcardNameTest.java --- a/jdk/test/javax/management/ObjectName/DelegateNameWildcardNameTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ObjectName/DelegateNameWildcardNameTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that MBeanServerDelegate.DELEGATE_NAME and ObjectName.WILDCARD * public constants have been initialized properly. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean DelegateNameWildcardNameTest * @run build DelegateNameWildcardNameTest * @run main DelegateNameWildcardNameTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ObjectName/NullEmptyKeyValueTest.java --- a/jdk/test/javax/management/ObjectName/NullEmptyKeyValueTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ObjectName/NullEmptyKeyValueTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6229396 * @summary Test null/empty key/values in ObjectName constructors. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean NullEmptyKeyValueTest * @run build NullEmptyKeyValueTest * @run main NullEmptyKeyValueTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ObjectName/ObjectNameGetInstanceTest.java --- a/jdk/test/javax/management/ObjectName/ObjectNameGetInstanceTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ObjectName/ObjectNameGetInstanceTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4894801 * @summary Test that ObjectName.getInstance(ObjectName) preserves key order * @author Eamonn McManus - * @modules java.management + * * @run clean ObjectNameGetInstanceTest * @run build ObjectNameGetInstanceTest * @run main ObjectNameGetInstanceTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ObjectName/RepositoryWildcardTest.java --- a/jdk/test/javax/management/ObjectName/RepositoryWildcardTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ObjectName/RepositoryWildcardTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test if the repository supports correctly the use of * wildcards in the ObjectName key properties value part. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean RepositoryWildcardTest * @run build RepositoryWildcardTest * @run main RepositoryWildcardTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ObjectName/SerialCompatTest.java --- a/jdk/test/javax/management/ObjectName/SerialCompatTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ObjectName/SerialCompatTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6211220 6616825 * @summary Test that jmx.serial.form=1.0 works for ObjectName * @author Eamonn McManus, Daniel Fuchs - * @modules java.management + * * @run clean SerialCompatTest * @run build SerialCompatTest * @run main/othervm -Djdk.jmx.mbeans.allowNonPublic=true -Djmx.serial.form=1.0 SerialCompatTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/ObjectName/ValueWildcardTest.java --- a/jdk/test/javax/management/ObjectName/ValueWildcardTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/ObjectName/ValueWildcardTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4716807 * @summary Test wildcards in ObjectName key properties value part. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean ValueWildcardTest * @run build ValueWildcardTest * @run main ValueWildcardTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/management/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = java.management + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/descriptor/DefaultDescriptorTest.java --- a/jdk/test/javax/management/descriptor/DefaultDescriptorTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/descriptor/DefaultDescriptorTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6204469 * @summary Test that MBean*Info can be constructed with default descriptor * @author Eamonn McManus - * @modules java.management + * * @run clean DefaultDescriptorTest * @run build DefaultDescriptorTest * @run main DefaultDescriptorTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/descriptor/DescriptorTest.java --- a/jdk/test/javax/management/descriptor/DescriptorTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/descriptor/DescriptorTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6204469 6273765 * @summary Test various aspects of the Descriptor interface * @author Eamonn McManus - * @modules java.management + * * @run clean DescriptorTest * @run build DescriptorTest * @run main DescriptorTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/descriptor/EqualsHashCodeTest.java --- a/jdk/test/javax/management/descriptor/EqualsHashCodeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/descriptor/EqualsHashCodeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6255956 * @summary Test equals and hashCode for descriptors * @author Eamonn McManus - * @modules java.management + * * @run clean EqualsHashCodeTest * @run build EqualsHashCodeTest * @run main EqualsHashCodeTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/descriptor/ImmutableArrayFieldTest.java --- a/jdk/test/javax/management/descriptor/ImmutableArrayFieldTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/descriptor/ImmutableArrayFieldTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that immutability of ImmutableDescriptor cannot be * compromised by modifying field values that are arrays. * @author Eamonn McManus - * @modules java.management + * * @run clean ImmutableArrayFieldTest * @run build ImmutableArrayFieldTest * @run main ImmutableArrayFieldTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/descriptor/ImmutableDescriptorSerialTest.java --- a/jdk/test/javax/management/descriptor/ImmutableDescriptorSerialTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/descriptor/ImmutableDescriptorSerialTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6204469 * @summary Test ImmutableDescriptor serialization. * @author Eamonn McManus - * @modules java.management + * * @run clean ImmutableDescriptorSerialTest * @run build ImmutableDescriptorSerialTest * @run main ImmutableDescriptorSerialTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/descriptor/ImmutableDescriptorSetFieldsTest.java --- a/jdk/test/javax/management/descriptor/ImmutableDescriptorSetFieldsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/descriptor/ImmutableDescriptorSetFieldsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * null name in it and calling setFields with a field names array with an * empty name in it throw the expected exceptions. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean ImmutableDescriptorSetFieldsTest * @run build ImmutableDescriptorSetFieldsTest * @run main ImmutableDescriptorSetFieldsTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/descriptor/MBeanInfoInteropTest.java --- a/jdk/test/javax/management/descriptor/MBeanInfoInteropTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/descriptor/MBeanInfoInteropTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6204469 * @summary Check that descriptors have not broken serial interop. * @author Eamonn McManus - * @modules java.management + * * @run clean MBeanInfoInteropTest SerializedInfo * @run build MBeanInfoInteropTest SerializedInfo * @run main MBeanInfoInteropTest SerializedInfo diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/descriptor/UnionTest.java --- a/jdk/test/javax/management/descriptor/UnionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/descriptor/UnionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6273752 * @summary Test ImmutableDescriptor.union * @author Eamonn McManus - * @modules java.management + * * @run clean UnionTest * @run build UnionTest * @run main UnionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/generified/GenericTest.java --- a/jdk/test/javax/management/generified/GenericTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/generified/GenericTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4847959 6191402 * @summary Test newly-generified APIs * @author Eamonn McManus - * @modules java.management + * * @run clean GenericTest * @run build GenericTest * @run main GenericTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/generified/ListTypeCheckTest.java --- a/jdk/test/javax/management/generified/ListTypeCheckTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/generified/ListTypeCheckTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6250772 * @summary Test that *List objects are checked after asList is called. * @author Eamonn McManus - * @modules java.management + * * @run clean ListTypeCheckTest * @run build ListTypeCheckTest * @run main ListTypeCheckTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/loading/ArrayClassTest.java --- a/jdk/test/javax/management/loading/ArrayClassTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/loading/ArrayClassTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that array classes can be found in signatures always * and can be deserialized by the deprecated MBeanServer.deserialize method * @author Eamonn McManus - * @modules java.management + * * @run clean ArrayClassTest * @run build ArrayClassTest * @run main ArrayClassTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/loading/DocumentRootTest.java --- a/jdk/test/javax/management/loading/DocumentRootTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/loading/DocumentRootTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test parsing error when the mlet file is * located in the web server's document root. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean DocumentRootTest * @run build DocumentRootTest * @run main DocumentRootTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/loading/GetMBeansFromURLTest.java --- a/jdk/test/javax/management/loading/GetMBeansFromURLTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/loading/GetMBeansFromURLTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * given MLet instance throws a ServiceNotFoundException exception * with a non null cause. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean GetMBeansFromURLTest * @run build GetMBeansFromURLTest * @run main GetMBeansFromURLTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/loading/LibraryLoader/LibraryLoaderTest.java --- a/jdk/test/javax/management/loading/LibraryLoader/LibraryLoaderTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/loading/LibraryLoader/LibraryLoaderTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that the same native library coming from the same jar file can * be loaded twice by two different MLets on the same JVM without conflict. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean LibraryLoaderTest * @run build LibraryLoaderTest * @run main/othervm LibraryLoaderTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/loading/MLetCLR/MLetCommand.java --- a/jdk/test/javax/management/loading/MLetCLR/MLetCommand.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/loading/MLetCLR/MLetCommand.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * for the test codebase as it is executed by the MLet code using * doPrivileged. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean MLetCommand * @run build MLetCommand * @run main/othervm/java.security.policy=policy MLetCommand diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/loading/MLetContentTest.java --- a/jdk/test/javax/management/loading/MLetContentTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/loading/MLetContentTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4796780 * @summary The class MLetContentTest becomes public * @author Shanliang JIANG - * @modules java.management + * * @run clean MLetContentTest * @run build MLetContentTest * @run main MLetContentTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/loading/MletParserLocaleTest.java --- a/jdk/test/javax/management/loading/MletParserLocaleTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/loading/MletParserLocaleTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 7065236 * @summary Checking MletParser for Locale insensitive strings * @author Harsha Wardhana B - * @modules java.management + * * @run clean MletParserLocaleTest * @run build MletParserLocaleTest * @run main/othervm/timeout=5 MletParserLocaleTest mlet4.html diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/loading/ParserInfiniteLoopTest.java --- a/jdk/test/javax/management/loading/ParserInfiniteLoopTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/loading/ParserInfiniteLoopTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,7 @@ * terminated with the corresponding '>' and an opening '<' for * the subsequent tag is encountered. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean ParserInfiniteLoopTest * @run build ParserInfiniteLoopTest * @run main/othervm/timeout=5 ParserInfiniteLoopTest mlet1.html diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/loading/SystemClassLoaderTest.java --- a/jdk/test/javax/management/loading/SystemClassLoaderTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/loading/SystemClassLoaderTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that a class can load MBeans from its class loader * (at least if it is the system class loader) * @author Eamonn McManus - * @modules java.management + * * @run clean SystemClassLoaderTest * @run build SystemClassLoaderTest * @run main SystemClassLoaderTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/AddAttributeChangeNotificationListenerTest.java --- a/jdk/test/javax/management/modelmbean/AddAttributeChangeNotificationListenerTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/AddAttributeChangeNotificationListenerTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -30,7 +30,7 @@ * no other attributes. * @author Yves Joan * @author Eamonn McManus - * @modules java.management + * * @run clean AddAttributeChangeNotificationListenerTest * @run build AddAttributeChangeNotificationListenerTest * @run main AddAttributeChangeNotificationListenerTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/DescriptorSupportSerialTest.java --- a/jdk/test/javax/management/modelmbean/DescriptorSupportSerialTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/DescriptorSupportSerialTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6332962 * @summary Test that DescriptorSupport does not serialize targetObject * @author Eamonn McManus - * @modules java.management + * * @run clean DescriptorSupportSerialTest * @run build DescriptorSupportSerialTest * @run main DescriptorSupportSerialTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/DescriptorSupportTest.java --- a/jdk/test/javax/management/modelmbean/DescriptorSupportTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/DescriptorSupportTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4883712 4869006 4894856 5016685 * @summary Test that DescriptorSupport correctly validates fields * @author Eamonn McManus - * @modules java.management + * * @run clean DescriptorSupportTest * @run build DescriptorSupportTest * @run main DescriptorSupportTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/DescriptorSupportXMLLocaleTest.java --- a/jdk/test/javax/management/modelmbean/DescriptorSupportXMLLocaleTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/DescriptorSupportXMLLocaleTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 7065236 * @summary Test for locale insensitive strings in DescriptorSupport class * @author Harsha Wardhana B - * @modules java.management + * * @run clean DescriptorSupportXMLLocaleTest * @run build DescriptorSupportXMLLocaleTest * @run main DescriptorSupportXMLLocaleTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/DescriptorSupportXMLTest.java --- a/jdk/test/javax/management/modelmbean/DescriptorSupportXMLTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/DescriptorSupportXMLTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that DescriptorSupport.toXMLString() can be used to * reconstruct an equivalent DescriptorSupport * @author Eamonn McManus - * @modules java.management + * * @run clean DescriptorSupportXMLTest * @run build DescriptorSupportXMLTest * @run main DescriptorSupportXMLTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/ExoticTargetTypeTest.java --- a/jdk/test/javax/management/modelmbean/ExoticTargetTypeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/ExoticTargetTypeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that a custom ModelMBean implementation can have custom * targetType values in its ModelMBeanOperationInfo descriptors. * @author Eamonn McManus - * @modules java.management + * * @run clean ExoticTargetTypeTest * @run build ExoticTargetTypeTest * @run main ExoticTargetTypeTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/InfoSupportTest.java --- a/jdk/test/javax/management/modelmbean/InfoSupportTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/InfoSupportTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,7 @@ * that getDescriptors("mbean") works, and that default values for * MBean descriptors are correctly assigned. * @author Eamonn McManus - * @modules java.management + * * @run clean InfoSupportTest * @run build InfoSupportTest * @run main InfoSupportTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/LoggingExceptionTest.java --- a/jdk/test/javax/management/modelmbean/LoggingExceptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/LoggingExceptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,9 @@ * when traces enabled and no attributes. * @author Luis-Miguel Alventosa * @author Paul Cheeseman - * @modules java.management + * + * @modules java.logging + * java.management */ import java.util.logging.ConsoleHandler; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/ModelMBeanInfoSupport/GetAllDescriptorsTest.java --- a/jdk/test/javax/management/modelmbean/ModelMBeanInfoSupport/GetAllDescriptorsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/ModelMBeanInfoSupport/GetAllDescriptorsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that ModelMBeanInfoSupport.getDescriptors(null) also * returns the MBean's descriptor. * @author Eamonn McManus, Daniel Fuchs - * @modules java.management + * * @run clean GetAllDescriptorsTest * @run build GetAllDescriptorsTest * @run main/othervm/java.security.policy=policy GetAllDescriptorsTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/OnUnregisterTest.java --- a/jdk/test/javax/management/modelmbean/OnUnregisterTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/OnUnregisterTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Check that OnUnregister is an allowed value for persistPolicy * in ModelMBeanAttributeInfo * @author Eamonn McManus - * @modules java.management + * * @run clean OnUnregisterTest * @run build OnUnregisterTest * @run main OnUnregisterTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/RequiredModelMBeanGetAttributeTest.java --- a/jdk/test/javax/management/modelmbean/RequiredModelMBeanGetAttributeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/RequiredModelMBeanGetAttributeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -36,7 +36,7 @@ * - the declared name can be loaded by the value's class loader and * produces a class to which the value can be assigned. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean RequiredModelMBeanGetAttributeTest * @run build RequiredModelMBeanGetAttributeTest * @run main RequiredModelMBeanGetAttributeTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/RequiredModelMBeanMethodTest.java --- a/jdk/test/javax/management/modelmbean/RequiredModelMBeanMethodTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/RequiredModelMBeanMethodTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * from the RequiredModelMBean class itself if they are not in the * ModelMBeanInfo * @author Eamonn McManus - * @modules java.management + * * @run clean RequiredModelMBeanMethodTest * @run build RequiredModelMBeanMethodTest * @run main RequiredModelMBeanMethodTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/RequiredModelMBeanSetAttributeTest.java --- a/jdk/test/javax/management/modelmbean/RequiredModelMBeanSetAttributeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/RequiredModelMBeanSetAttributeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * MBeanException wrapping a ServiceNotFoundException is thrown is setAttribute * called but no setMethod field has been provided. * @author Jean-Francois Denise - * @modules java.management + * * @run clean RequiredModelMBeanSetAttributeTest * @run build RequiredModelMBeanSetAttributeTest * @run main RequiredModelMBeanSetAttributeTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/modelmbean/SimpleModelMBean/SimpleModelMBeanCommand.java --- a/jdk/test/javax/management/modelmbean/SimpleModelMBean/SimpleModelMBeanCommand.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/modelmbean/SimpleModelMBean/SimpleModelMBeanCommand.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * IllegalArgumentException when attribute names, operation names, and * Java type names do not strictly follow the expected Java syntax. * @author Eamonn McManus, Daniel Fuchs - * @modules java.management + * * @run clean SimpleModelMBeanCommand * @run build SimpleModelMBeanCommand * @run main/othervm/java.security.policy=policy SimpleModelMBeanCommand diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/CounterMonitorDeadlockTest.java --- a/jdk/test/javax/management/monitor/CounterMonitorDeadlockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/CounterMonitorDeadlockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that no locks are held when a monitor attribute is sampled * or notif delivered. * @author Eamonn McManus - * @modules java.management + * * @run clean CounterMonitorDeadlockTest * @run build CounterMonitorDeadlockTest * @run main CounterMonitorDeadlockTest 1 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/CounterMonitorInitThresholdTest.java --- a/jdk/test/javax/management/monitor/CounterMonitorInitThresholdTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/CounterMonitorInitThresholdTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * objects added before the counter monitor is started as well as by * the observed objects which are added once the monitor is started. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean CounterMonitorInitThresholdTest * @run build CounterMonitorInitThresholdTest * @run main CounterMonitorInitThresholdTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/CounterMonitorTest.java --- a/jdk/test/javax/management/monitor/CounterMonitorTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/CounterMonitorTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that the counter monitor, when running in difference mode, * emits a notification every time the threshold is exceeded. * @author Luis-Miguel Alventosa, Shanliang JIANG - * @modules java.management + * * @run clean CounterMonitorTest * @run build CounterMonitorTest * @run main CounterMonitorTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/CounterMonitorThresholdTest.java --- a/jdk/test/javax/management/monitor/CounterMonitorThresholdTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/CounterMonitorThresholdTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6229368 8025207 * @summary Wrong threshold value in CounterMonitor with offset and modulus. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean CounterMonitorThresholdTest * @run build CounterMonitorThresholdTest * @run main CounterMonitorThresholdTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/DerivedGaugeMonitorTest.java --- a/jdk/test/javax/management/monitor/DerivedGaugeMonitorTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/DerivedGaugeMonitorTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6683213 * @summary Test that the initial derived gauge is (Integer)0 * @author Daniel Fuchs - * @modules java.management + * * @run clean DerivedGaugeMonitorTest * @run build DerivedGaugeMonitorTest * @run main DerivedGaugeMonitorTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/GaugeMonitorDeadlockTest.java --- a/jdk/test/javax/management/monitor/GaugeMonitorDeadlockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/GaugeMonitorDeadlockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,8 +27,9 @@ * @summary Test that no locks are held when a monitor attribute is sampled * or notif delivered. * @author Eamonn McManus + * * @library /lib/testlibrary - * @modules java.management + * * @run clean GaugeMonitorDeadlockTest * @run build GaugeMonitorDeadlockTest * @run main GaugeMonitorDeadlockTest 1 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/MultiMonitorTest.java --- a/jdk/test/javax/management/monitor/MultiMonitorTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/MultiMonitorTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,13 +24,13 @@ /* * @test * @bug 4984057 + * @key randomness * @summary Test that monitors can sample a large number of attributes * @author Eamonn McManus - * @modules java.management + * * @run clean MultiMonitorTest * @run build MultiMonitorTest * @run main MultiMonitorTest - * @key randomness */ import java.util.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/NonComparableAttributeValueTest.java --- a/jdk/test/javax/management/monitor/NonComparableAttributeValueTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/NonComparableAttributeValueTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * jmx.monitor.error.type notification when the attribute * being monitored returns a non comparable value. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean NonComparableAttributeValueTest * @run build NonComparableAttributeValueTest * @run main NonComparableAttributeValueTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/NullAttributeValueTest.java --- a/jdk/test/javax/management/monitor/NullAttributeValueTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/NullAttributeValueTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,7 @@ * being monitored returns a null value. * @author Luis-Miguel Alventosa * @author Shanliang JIANG - * @modules java.management + * * @run clean NullAttributeValueTest * @run build NullAttributeValueTest * @run main NullAttributeValueTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/ReflectionExceptionTest.java --- a/jdk/test/javax/management/monitor/ReflectionExceptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/ReflectionExceptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,11 +24,11 @@ /* * @test * @bug 6205072 + * @key intermittent * @summary Test that the jmx.monitor.error.runtime monitor notification * is emitted when getAttribute throws ReflectionException. * @author Luis-Miguel Alventosa - * @key intermittent - * @modules java.management + * * @run clean ReflectionExceptionTest MBeanServerBuilderImpl * MBeanServerForwarderInvocationHandler * @run build ReflectionExceptionTest MBeanServerBuilderImpl diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/RuntimeExceptionTest.java --- a/jdk/test/javax/management/monitor/RuntimeExceptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/RuntimeExceptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that the jmx.monitor.error.runtime monitor notification * is emitted when getAttribute throws RuntimeException. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean RuntimeExceptionTest MBeanServerBuilderImpl * MBeanServerForwarderInvocationHandler * @run build RuntimeExceptionTest MBeanServerBuilderImpl diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/StartStopTest.java --- a/jdk/test/javax/management/monitor/StartStopTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/StartStopTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,8 +27,9 @@ * @summary Test that tasks are cancelled properly when * monitors are started and stopped in a loop. * @author Luis-Miguel Alventosa + * * @library /lib/testlibrary - * @modules java.management + * * @build jdk.testlibrary.* * @run clean StartStopTest * @run build StartStopTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/StringMonitorDeadlockTest.java --- a/jdk/test/javax/management/monitor/StringMonitorDeadlockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/StringMonitorDeadlockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,11 +24,11 @@ /* * @test * @bug 6303187 + * @key intermittent * @summary Test that no locks are held when a monitor attribute is sampled * or notif delivered. * @author Eamonn McManus - * @key intermittent - * @modules java.management + * * @run clean StringMonitorDeadlockTest * @run build StringMonitorDeadlockTest * @run main StringMonitorDeadlockTest 1 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/ThreadPoolAccTest.java --- a/jdk/test/javax/management/monitor/ThreadPoolAccTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/ThreadPoolAccTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that each thread in the thread pool runs * in the context of the monitor.start() caller. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean ThreadPoolAccTest * @run build ThreadPoolAccTest * @run main ThreadPoolAccTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/monitor/ThreadPoolTest.java --- a/jdk/test/javax/management/monitor/ThreadPoolTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/monitor/ThreadPoolTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that all monitors will be well started when sharing * a single thread pool. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean ThreadPoolTest * @run build ThreadPoolTest * @run main/othervm/timeout=300 ThreadPoolTest 1 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/AmbiguousConstructorTest.java --- a/jdk/test/javax/management/mxbean/AmbiguousConstructorTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/AmbiguousConstructorTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6175517 6278707 * @summary Test that ambiguous ConstructorProperties annotations are detected. * @author Eamonn McManus - * @modules java.management + * * @run clean AmbiguousConstructorTest * @run build AmbiguousConstructorTest * @run main AmbiguousConstructorTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/ComparatorExceptionTest.java --- a/jdk/test/javax/management/mxbean/ComparatorExceptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/ComparatorExceptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6601652 * @summary Test exception when SortedMap or SortedSet has non-null Comparator * @author Eamonn McManus - * @modules java.management */ import java.util.SortedMap; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/ExceptionDiagnosisTest.java --- a/jdk/test/javax/management/mxbean/ExceptionDiagnosisTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/ExceptionDiagnosisTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6713777 * @summary Test that exception messages include all relevant information * @author Eamonn McManus - * @modules java.management */ import javax.management.ConstructorParameters; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/GenericTypeTest.java --- a/jdk/test/javax/management/mxbean/GenericTypeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/GenericTypeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6376416 6406447 * @summary Test use of generic types in MXBeans (mostly illegal). * @author Eamonn McManus - * @modules java.management + * * @run main GenericTypeTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/InvalidMXBeanRegistrationTest.java --- a/jdk/test/javax/management/mxbean/InvalidMXBeanRegistrationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/InvalidMXBeanRegistrationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Ensure the registration of an invalid MXBean * throws NotCompliantMBeanException. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean InvalidMXBeanRegistrationTest * @run build InvalidMXBeanRegistrationTest * @run main InvalidMXBeanRegistrationTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/LeakTest.java --- a/jdk/test/javax/management/mxbean/LeakTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/LeakTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,7 +25,7 @@ * @bug 6482247 * @summary Test that creating MXBeans does not introduce memory leaks. * @author Eamonn McManus - * @modules java.management + * * @run build LeakTest RandomMXBeanTest MerlinMXBean TigerMXBean * @run main LeakTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/MBeanOperationInfoTest.java --- a/jdk/test/javax/management/mxbean/MBeanOperationInfoTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/MBeanOperationInfoTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6359948 * @summary Check that MXBean operations have the expected ReturnType in MBeanOperationInfo * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean MBeanOperationInfoTest * @run build MBeanOperationInfoTest * @run main MBeanOperationInfoTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/MXBeanAnnotationTest.java --- a/jdk/test/javax/management/mxbean/MXBeanAnnotationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/MXBeanAnnotationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6316491 * @summary Check that the MXBean annotation works as advertised * @author Eamonn McManus - * @modules java.management + * * @run clean MXBeanAnnotationTest * @run build MXBeanAnnotationTest * @run main MXBeanAnnotationTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/MXBeanFallbackTest.java --- a/jdk/test/javax/management/mxbean/MXBeanFallbackTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/MXBeanFallbackTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * It needs to be a separate class because the "jdk.jmx.mbeans.allowNonPublic" * system property must be set before c.s.j.m.MBeanAnalyzer has been loaded. * @author Jaroslav Bachorik - * @modules java.management + * * @run clean MXBeanFallbackTest * @run build MXBeanFallbackTest * @run main/othervm -Djdk.jmx.mbeans.allowNonPublic=true MXBeanFallbackTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/MXBeanFlagTest.java --- a/jdk/test/javax/management/mxbean/MXBeanFlagTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/MXBeanFlagTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6335337 * @summary Test correctness of mxbean flag in descriptor. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean MXBeanFlagTest * @run build MXBeanFlagTest * @run main MXBeanFlagTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/MXBeanLoadingTest1.java --- a/jdk/test/javax/management/mxbean/MXBeanLoadingTest1.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/MXBeanLoadingTest1.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,8 +26,9 @@ * @bug 8058865 * @summary Checks correct collection of MXBean's class after unregistration * @author Olivier Lagneau - * @modules java.management + * * @library /lib/testlibrary + * * @run main/othervm/timeout=300 MXBeanLoadingTest1 */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/MXBeanPreRegisterTest.java --- a/jdk/test/javax/management/mxbean/MXBeanPreRegisterTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/MXBeanPreRegisterTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Ensure that preRegister etc are called, but not when wrapped * by the class StandardMBean * @author Eamonn McManus - * @modules java.management + * * @run clean MXBeanPreRegisterTest * @run build MXBeanPreRegisterTest * @run main MXBeanPreRegisterTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/MXBeanRefTest.java --- a/jdk/test/javax/management/mxbean/MXBeanRefTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/MXBeanRefTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6296433 6283873 * @summary Test that inter-MXBean references work as expected. * @author Eamonn McManus - * @modules java.management + * * @run clean MXBeanRefTest * @run build MXBeanRefTest * @run main MXBeanRefTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/MiscTest.java --- a/jdk/test/javax/management/mxbean/MiscTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/MiscTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * interfaceClassName, openType, originalType, StandardMBean, * StandardEmitterMBean. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean MiscTest * @run build MiscTest * @run main MiscTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/OperationImpactTest.java --- a/jdk/test/javax/management/mxbean/OperationImpactTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/OperationImpactTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6320104 * @summary Check that MXBean operations have impact UNKNOWN. * @author Eamonn McManus - * @modules java.management + * * @run clean OperationImpactTest * @run build OperationImpactTest * @run main OperationImpactTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/OverloadTest.java --- a/jdk/test/javax/management/mxbean/OverloadTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/OverloadTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6175517 * @summary Test that MXBean interfaces can contain overloaded methods * @author Eamonn McManus - * @modules java.management + * * @run clean OverloadTest * @run build OverloadTest * @run main OverloadTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/PreRegisterNameTest.java --- a/jdk/test/javax/management/mxbean/PreRegisterNameTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/PreRegisterNameTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6448042 * @summary Test that MXBeans can define their own names in preRegister * @author Eamonn McManus - * @modules java.management */ import java.lang.management.ManagementFactory; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/PropertyNamesTest.java --- a/jdk/test/javax/management/mxbean/PropertyNamesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/PropertyNamesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6175517 * @summary Test the PropertyNames annotation with MXBeans * @author Eamonn McManus - * @modules java.management + * * @run clean PropertyNamesTest * @run build PropertyNamesTest * @run main PropertyNamesTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/SameObjectTwoNamesTest.java --- a/jdk/test/javax/management/mxbean/SameObjectTwoNamesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/SameObjectTwoNamesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * names produces an exception * @author Alexander Shusherov * @author Eamonn McManus - * @modules java.management + * * @run main SameObjectTwoNamesTest * @run main/othervm -Djmx.mxbean.multiname=true SameObjectTwoNamesTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/StandardMBeanOverrideTest.java --- a/jdk/test/javax/management/mxbean/StandardMBeanOverrideTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/StandardMBeanOverrideTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,7 @@ * getMBeanInfo and getNotificationInfo in StandardMBean and * StandardEmitterMBean. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean StandardMBeanOverrideTest * @run build StandardMBeanOverrideTest * @run main StandardMBeanOverrideTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/ThreadMXBeanTest.java --- a/jdk/test/javax/management/mxbean/ThreadMXBeanTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/ThreadMXBeanTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,13 +24,13 @@ /* * @test * @bug 6305746 + * @key randomness * @summary Test that the null values returned by the ThreadMXBean work. * @author Eamonn McManus - * @modules java.management + * * @run clean ThreadMXBeanTest * @run build ThreadMXBeanTest * @run main ThreadMXBeanTest - * @key randomness */ import java.lang.management.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/mxbean/TypeNameTest.java --- a/jdk/test/javax/management/mxbean/TypeNameTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/mxbean/TypeNameTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6757225 6763051 * @summary Test that type names in MXBeans match their spec. * @author Eamonn McManus - * @modules java.management */ import java.lang.reflect.Field; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/notification/BroadcasterSupportDeadlockTest.java --- a/jdk/test/javax/management/notification/BroadcasterSupportDeadlockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/notification/BroadcasterSupportDeadlockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that NotificationBroadcasterSupport can be subclassed * and used with synchronized(this) without causing deadlock * @author Eamonn McManus - * @modules java.management + * * @run clean BroadcasterSupportDeadlockTest * @run build BroadcasterSupportDeadlockTest * @run main BroadcasterSupportDeadlockTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/notification/FilterExceptionTest.java --- a/jdk/test/javax/management/notification/FilterExceptionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/notification/FilterExceptionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6244855 6244863 * @summary Exception thrown by NotificationFilter should be ignored * @author Shanliang JIANG - * @modules java.management + * * @run clean FilterExceptionTest * @run build FilterExceptionTest * @run main FilterExceptionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/notification/NotifExecutorTest.java --- a/jdk/test/javax/management/notification/NotifExecutorTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/notification/NotifExecutorTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4661545 * @summary Tests to use an executor to send notifications. * @author Shanliang JIANG - * @modules java.management + * * @run clean NotifExecutorTest * @run build NotifExecutorTest * @run main NotifExecutorTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/notification/NotifInfoTest.java --- a/jdk/test/javax/management/notification/NotifInfoTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/notification/NotifInfoTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4506105 6303698 * @summary NotificationBroadcasterSupport should have a ctor with MBeanNotificationInfo[] * @author Shanliang JIANG - * @modules java.management + * * @run clean NotifInfoTest * @run build NotifInfoTest * @run main NotifInfoTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/openmbean/ArrayTypeTest.java --- a/jdk/test/javax/management/openmbean/ArrayTypeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/openmbean/ArrayTypeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5045358 * @summary Test that Open MBeans support arrays of primitive types. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean ArrayTypeTest * @run build ArrayTypeTest * @run main ArrayTypeTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/openmbean/BadConstraintTest.java --- a/jdk/test/javax/management/openmbean/BadConstraintTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/openmbean/BadConstraintTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that Open MBean attributes and parameters cannot have * illegal constraints like min greater than max * @author Eamonn McManus - * @modules java.management + * * @run clean BadConstraintTest * @run build BadConstraintTest * @run main BadConstraintTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/openmbean/CompositeDataStringTest.java --- a/jdk/test/javax/management/openmbean/CompositeDataStringTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/openmbean/CompositeDataStringTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6610174 * @summary Test that CompositeDataSupport.toString() represents arrays correctly * @author Eamonn McManus - * @modules java.management */ import javax.management.openmbean.ArrayType; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/openmbean/ConstraintTest.java --- a/jdk/test/javax/management/openmbean/ConstraintTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/openmbean/ConstraintTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6204469 * @summary Test that Open MBean attributes and parameters check constraints * @author Eamonn McManus - * @modules java.management + * * @run clean ConstraintTest * @run build ConstraintTest * @run main ConstraintTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/openmbean/EqualsTest.java --- a/jdk/test/javax/management/openmbean/EqualsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/openmbean/EqualsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5072174 * @summary Test CompositeDataSupport.equals with ArrayType * @author Shanliang JIANG - * @modules java.management + * * @run clean EqualsTest * @run build EqualsTest * @run main EqualsTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/openmbean/IsValueTest.java --- a/jdk/test/javax/management/openmbean/IsValueTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/openmbean/IsValueTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 5072004 * @summary Test new rules for isValue * @author Eamonn McManus - * @modules java.management */ import javax.management.openmbean.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/openmbean/NullConstructorParamsTest.java --- a/jdk/test/javax/management/openmbean/NullConstructorParamsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/openmbean/NullConstructorParamsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6434298 * @summary Test IAE is thrown when typeName or description parameter is null for TabularType and CompositeType constructors * @author Joel FERAUD - * @modules java.management */ import javax.management.openmbean.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/openmbean/OpenMBeanInfoEqualsNPETest.java --- a/jdk/test/javax/management/openmbean/OpenMBeanInfoEqualsNPETest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/openmbean/OpenMBeanInfoEqualsNPETest.java Wed Jul 05 23:09:40 2017 +0200 @@ -41,7 +41,7 @@ * @bug 8023529 * @summary Test that OpenMBean*Info.equals do not throw NPE * @author Shanliang JIANG - * @modules java.management + * * @run clean OpenMBeanInfoEqualsNPETest * @run build OpenMBeanInfoEqualsNPETest * @run main OpenMBeanInfoEqualsNPETest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/openmbean/OpenMBeanInfoHashCodeNPETest.java --- a/jdk/test/javax/management/openmbean/OpenMBeanInfoHashCodeNPETest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/openmbean/OpenMBeanInfoHashCodeNPETest.java Wed Jul 05 23:09:40 2017 +0200 @@ -40,7 +40,7 @@ * @bug 8023529 * @summary Test that OpenMBean*Info.hashCode do not throw NPE * @author Shanliang JIANG - * @modules java.management + * * @run clean OpenMBeanInfoHashCodeNPETest * @run build OpenMBeanInfoHashCodeNPETest * @run main OpenMBeanInfoHashCodeNPETest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/openmbean/OpenTypeDescriptorTest.java --- a/jdk/test/javax/management/openmbean/OpenTypeDescriptorTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/openmbean/OpenTypeDescriptorTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * @summary Test that Open*MBeanInfo classes include "openType" in descriptor * and also test serial compatibility with Java 5. * @author Eamonn McManus - * @modules java.management + * * @run clean OpenTypeDescriptorTest * @run build OpenTypeDescriptorTest * @run main OpenTypeDescriptorTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/proxy/JMXProxyFallbackTest.java --- a/jdk/test/javax/management/proxy/JMXProxyFallbackTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/proxy/JMXProxyFallbackTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -34,7 +34,7 @@ * It needs to be a separate class because the "jdk.jmx.mbeans.allowNonPublic" * system property must be set before c.s.j.m.MBeanAnalyzer has been loaded. * @author Jaroslav Bachorik - * @modules java.management + * * @run clean JMXProxyFallbackTest * @run build JMXProxyFallbackTest * @run main/othervm -Djdk.jmx.mbeans.allowNonPublic=true JMXProxyFallbackTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/proxy/JMXProxyTest.java --- a/jdk/test/javax/management/proxy/JMXProxyTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/proxy/JMXProxyTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -33,7 +33,7 @@ * @summary Tests that javax.management.JMX creates proxies only for the * compliant MBeans/MXBeans * @author Jaroslav Bachorik - * @modules java.management + * * @run clean JMXProxyTest * @run build JMXProxyTest * @run main JMXProxyTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/proxy/NotificationEmitterProxy.java --- a/jdk/test/javax/management/proxy/NotificationEmitterProxy.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/proxy/NotificationEmitterProxy.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @summary Test that we can create proxies which are NotificationEmitters. * @bug 6411747 * @author Daniel Fuchs - * @modules java.management + * * @run clean NotificationEmitterProxy * @run build NotificationEmitterProxy * @run main NotificationEmitterProxy diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/proxy/ProxyObjectMethodsTest.java --- a/jdk/test/javax/management/proxy/ProxyObjectMethodsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/proxy/ProxyObjectMethodsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6177524 * @summary Test how to execute the 3 Object methods by a Proxy. * @author Shanliang JIANG - * @modules java.management + * * @run clean ProxyObjectMethodsTest * @run build ProxyObjectMethodsTest * @run main ProxyObjectMethodsTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/query/CustomQueryTest.java --- a/jdk/test/javax/management/query/CustomQueryTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/query/CustomQueryTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6692027 * @summary Check that custom subclasses of QueryEval can be serialized. * @author Eamonn McManus - * @modules java.management */ import java.io.ByteArrayInputStream; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/query/InstanceOfExpTest.java --- a/jdk/test/javax/management/query/InstanceOfExpTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/query/InstanceOfExpTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5072174 6335848 * @summary test the new method javax.management.Query.isInstanceOf("className") * @author Shanliang JIANG - * @modules java.management + * * @run clean InstanceOfExpTest * @run build InstanceOfExpTest * @run main InstanceOfExpTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/query/QueryExpStringTest.java --- a/jdk/test/javax/management/query/QueryExpStringTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/query/QueryExpStringTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4886011 * @summary Test that QueryExp.toString() is reversible * @author Eamonn McManus - * @modules java.management + * * @run clean QueryExpStringTest * @run build QueryExpStringTest * @run main QueryExpStringTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/query/QueryMatchTest.java --- a/jdk/test/javax/management/query/QueryMatchTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/query/QueryMatchTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6266438 * @summary Query.match code for character sequences like [a-z] is wrong. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean QueryMatchTest * @run build QueryMatchTest * @run main QueryMatchTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/query/QuerySubstringTest.java --- a/jdk/test/javax/management/query/QuerySubstringTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/query/QuerySubstringTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Query.{initial,any,final}SubString fail if the * matching constraint string contains wildcards. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean QuerySubstringTest * @run build QuerySubstringTest * @run main QuerySubstringTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/relation/NonArrayListTest.java --- a/jdk/test/javax/management/relation/NonArrayListTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/relation/NonArrayListTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4848474 * @summary Test that relation service doesn't require List params to be ArrayList * @author Eamonn McManus - * @modules java.management + * * @run clean NonArrayListTest * @run build NonArrayListTest * @run main NonArrayListTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/relation/RelationNotificationSeqNoTest.java --- a/jdk/test/javax/management/relation/RelationNotificationSeqNoTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/relation/RelationNotificationSeqNoTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6701459 * @summary Test sequence numbers in RelationService notifications. * @author Eamonn McManus - * @modules java.management */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/relation/RelationNotificationSourceTest.java --- a/jdk/test/javax/management/relation/RelationNotificationSourceTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/relation/RelationNotificationSourceTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4892674 * @summary Test that RelationNotification can be constructed with ObjectName. * @author Eamonn McManus - * @modules java.management + * * @run clean RelationNotificationSourceTest * @run build RelationNotificationSourceTest * @run main RelationNotificationSourceTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/relation/RelationTypeTest.java --- a/jdk/test/javax/management/relation/RelationTypeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/relation/RelationTypeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4716675 * @summary Test that relation type checking uses isInstanceOf * @author Eamonn McManus - * @modules java.management + * * @run clean RelationTypeTest * @run build RelationTypeTest * @run main RelationTypeTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/management/remote/mandatory/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = java.management.rmi + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/URLTest.java --- a/jdk/test/javax/management/remote/mandatory/URLTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/URLTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5057532 * @summary Tests that host names are parsed correctly in URLs * @author Eamonn McManus - * @modules java.management + * * @run clean URLTest * @run build URLTest * @run main URLTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/AddressableTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/AddressableTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/AddressableTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6238815 * @summary test the new interface Addressable * @author Shanliang JIANG - * @modules java.management.rmi + * * @run clean AddressableTest * @run build AddressableTest * @run main AddressableTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/BrokenConnectionTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/BrokenConnectionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/BrokenConnectionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,10 +24,10 @@ /* * @test * @bug 4940957 8025205 + * @key intermittent * @summary Tests behaviour when connections break * @author Eamonn McManus - * @key intermittent - * @modules java.management.rmi + * * @run clean BrokenConnectionTest * @run build BrokenConnectionTest * @run main BrokenConnectionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/CloseFailedClientTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/CloseFailedClientTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/CloseFailedClientTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4921888 * @summary Tests that we do not get a NullPointException. * @author Shanliang JIANG - * @modules java.management + * * @run clean CloseFailedClientTest * @run build CloseFailedClientTest * @run main CloseFailedClientTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/CloseServerTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/CloseServerTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/CloseServerTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4838640 * @summary test server close in different conditions. * @author Shanliang JIANG - * @modules java.management + * * @run clean CloseServerTest * @run build CloseServerTest * @run main CloseServerTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/CloseUnconnectedTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/CloseUnconnectedTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/CloseUnconnectedTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4897052 * @summary Tests that opening and immediately closing a connector works * @author Eamonn McManus - * @modules java.management + * * @run clean CloseUnconnectedTest * @run build CloseUnconnectedTest * @run main CloseUnconnectedTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/CloseableTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/CloseableTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/CloseableTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * the method "void close() throws IOException;" extend * or implement the java.io.Closeable interface. * @author Luis-Miguel Alventosa - * @modules java.management.rmi + * * @run clean CloseableTest * @run build CloseableTest * @run main CloseableTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/ConnectionListenerNullTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/ConnectionListenerNullTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/ConnectionListenerNullTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4943248 * @summary Tests that NullPointerException is thrown when listener is null. * @author Daniel Fuchs - * @modules java.management.rmi + * * @run clean ConnectionListenerNullTest * @run build ConnectionListenerNullTest * @run main ConnectionListenerNullTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/ConnectionTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/ConnectionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/ConnectionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4865397 * @summary Tests remote JMX connections * @author Eamonn McManus - * @modules java.management.rmi + * * @run clean ConnectionTest * @run build ConnectionTest * @run main ConnectionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/DaemonRMIExporterTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/DaemonRMIExporterTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/DaemonRMIExporterTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,7 +28,7 @@ * @summary test the connector server option that causes it not to prevent the * VM from exiting * @author Shanliang JIANG, Eamonn McManus - * @modules java.management.rmi + * * @run main/othervm DaemonRMIExporterTest */ import java.util.Arrays; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/DeadLockTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/DeadLockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/DeadLockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5039210 * @summary test on a client notification deadlock. * @author Shanliang JIANG - * @modules java.management + * * @run clean DeadLockTest * @run build DeadLockTest * @run main DeadLockTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/FailedConnectionTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/FailedConnectionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/FailedConnectionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @bug 4939578 * @summary test to get an IOException. * @author Shanliang JIANG - * @modules java.management + * * @run clean FailedConnectionTest * @run build FailedConnectionTest * @run main FailedConnectionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/GetConnectionTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/GetConnectionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/GetConnectionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4951414 * @summary Try to get an IOException. * @author Shanliang JIANG - * @modules java.management.rmi + * * @run clean GetConnectionTest * @run build GetConnectionTest * @run main GetConnectionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/IIOPURLTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/IIOPURLTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/IIOPURLTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4886799 * @summary Check that IIOP URLs have /ior/ in the path * @author Eamonn McManus - * @modules java.management.rmi + * * @run clean IIOPURLTest * @run build IIOPURLTest * @run main IIOPURLTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/JMXServiceURLLocaleTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/JMXServiceURLLocaleTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/JMXServiceURLLocaleTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 7065236 * @summary Test for locale insensitive strings in JMXServiceURL class * @author Harsha Wardhana B - * @modules java.management + * * @run clean JMXServiceURLLocaleTest * @run build JMXServiceURLLocaleTest * @run main JMXServiceURLLocaleTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/MultiOpenCloseTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/MultiOpenCloseTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/MultiOpenCloseTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 1234567 * @summary Open, connect then close multi-connectors. * @author Shanliang JIANG - * @modules java.management + * * @run clean MultiOpenCloseTest * @run build MultiOpenCloseTest * @run main MultiOpenCloseTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/MultiThreadDeadLockTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/MultiThreadDeadLockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/MultiThreadDeadLockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -45,7 +45,7 @@ * @bug 6697180 * @summary test on a client notification deadlock. * @author Shanliang JIANG - * @modules java.management.rmi + * * @run clean MultiThreadDeadLockTest * @run build MultiThreadDeadLockTest * @run main MultiThreadDeadLockTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/RMIConnectionIdTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/RMIConnectionIdTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/RMIConnectionIdTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4901808 7183800 * @summary Check that RMI connection ids include IP address of a client network interface * @author Eamonn McManus - * @modules java.management + * * @run clean RMIConnectionIdTest * @run build RMIConnectionIdTest * @run main RMIConnectionIdTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/RMIConnectorLogAttributesTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/RMIConnectorLogAttributesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/RMIConnectorLogAttributesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -55,6 +55,9 @@ * @bug 8147857 * @summary Tests whether RMIConnector logs attribute names correctly. * @author Severin Gehwolf + * + * @modules java.logging + * java.management.rmi */ public class RMIConnectorLogAttributesTest { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/RMIExitTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/RMIExitTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/RMIExitTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @bug 4917237 * @summary test that process exit immediately after stop() / close() called * @author Jean Francois Denise - * @modules java.management.rmi + * * @run clean RMIExitTest * @run build RMIExitTest * @run main RMIExitTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/RMISerializeTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/RMISerializeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/RMISerializeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @summary Tests to serialize RMIConnector * @bug 5032052 * @author Shanliang JIANG - * @modules java.management.rmi + * * @run clean RMISerializeTest * @run build RMISerializeTest * @run main RMISerializeTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connection/ReconnectTest.java --- a/jdk/test/javax/management/remote/mandatory/connection/ReconnectTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connection/ReconnectTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4927217 * @summary test to reconnect * @author Shanliang JIANG - * @modules java.management + * * @run clean ReconnectTest * @run build ReconnectTest * @run main ReconnectTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connectorServer/ConnectorStopDeadlockTest.java --- a/jdk/test/javax/management/remote/mandatory/connectorServer/ConnectorStopDeadlockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connectorServer/ConnectorStopDeadlockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,6 @@ * @bug 6475157 * @summary Tests deadlock in simultaneous connection and connector-server close * @author Eamonn McManus - * @modules java.management.rmi */ /* This test is somewhat dependent on implementation details. If it suddenly diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connectorServer/JNDIFailureTest.java --- a/jdk/test/javax/management/remote/mandatory/connectorServer/JNDIFailureTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connectorServer/JNDIFailureTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Tests that JNDI bind failure doesn't leave an orphan RMI * Connector Server object * @author Eamonn McManus - * @modules java.management.rmi + * * @run clean JNDIFailureTest * @run build JNDIFailureTest * @run main JNDIFailureTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/connectorServer/MBSFPreStartPostStartTest.java --- a/jdk/test/javax/management/remote/mandatory/connectorServer/MBSFPreStartPostStartTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/connectorServer/MBSFPreStartPostStartTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that setting an MBeanServerForwarder on an already * started RMI connector server has the expected behavior. * @author Luis-Miguel Alventosa - * @modules java.management.rmi + * * @run clean MBSFPreStartPostStartTest * @run build MBSFPreStartPostStartTest * @run main MBSFPreStartPostStartTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/loading/DefaultProviderTest.java --- a/jdk/test/javax/management/remote/mandatory/loading/DefaultProviderTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/loading/DefaultProviderTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4884913 * @summary Tests that default protocols are loaded correctly * @author Eamonn McManus - * @modules java.management + * * @run clean DefaultProviderTest * @run build DefaultProviderTest * @run main DefaultProviderTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/loading/DeserializeEncodedURLTest.java --- a/jdk/test/javax/management/remote/mandatory/loading/DeserializeEncodedURLTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/loading/DeserializeEncodedURLTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4924683 * @summary Check RMI/JRMP stubs can be deserialized using user's loader * @author Eamonn McManus - * @modules java.management.rmi + * * @run clean DeserializeEncodedURLTest SingleClassLoader * @run build DeserializeEncodedURLTest SingleClassLoader * @run main DeserializeEncodedURLTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/loading/MethodResultTest.java --- a/jdk/test/javax/management/remote/mandatory/loading/MethodResultTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/loading/MethodResultTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,8 +26,9 @@ * @bug 4898478 * @summary Tests client default class loader used before JSR 160 loader * @author Eamonn McManus - * @modules java.management + * * @library /lib/testlibrary + * * @run clean MethodResultTest * @run build MethodResultTest * @run main MethodResultTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/loading/MissingClassTest.java --- a/jdk/test/javax/management/remote/mandatory/loading/MissingClassTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/loading/MissingClassTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,13 +24,13 @@ /* * @test * @bug 4915825 4921009 4934965 4977469 8019584 + * @key randomness * @summary Tests behavior when client or server gets object of unknown class * @author Eamonn McManus - * @modules java.management.rmi + * * @run clean MissingClassTest SingleClassLoader * @run build MissingClassTest SingleClassLoader * @run main MissingClassTest - * @key randomness */ /* diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/loading/RMIDownloadTest.java --- a/jdk/test/javax/management/remote/mandatory/loading/RMIDownloadTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/loading/RMIDownloadTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 5021246 * @summary Check that class downloading is supported by RMI connector * @author Eamonn McManus - * @modules java.management.rmi + * * @run main RMIDownloadTest receive without * @run main RMIDownloadTest send without * @run main RMIDownloadTest receive with diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/loading/TargetMBeanTest.java --- a/jdk/test/javax/management/remote/mandatory/loading/TargetMBeanTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/loading/TargetMBeanTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4910428 * @summary Tests target MBean class loader used before JSR 160 loader * @author Eamonn McManus - * @modules java.management.rmi + * * @run clean TargetMBeanTest * @run build TargetMBeanTest * @run main TargetMBeanTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/loading/UserClassLoaderTest.java --- a/jdk/test/javax/management/remote/mandatory/loading/UserClassLoaderTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/loading/UserClassLoaderTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6356458 * @summary test to not lose a user classloader * @author Shanliang JIANG - * @modules java.management + * * @run clean UserClassLoaderTest * @run build UserClassLoaderTest * @run main UserClassLoaderTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/AddRemoveTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/AddRemoveTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/AddRemoveTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @bug 4838640 4917194 * @summary test on add/remove NotificationListener * @author Shanliang JIANG - * @modules java.management + * * @run clean AddRemoveTest * @run build AddRemoveTest * @run main AddRemoveTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/ConcurrentModificationTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/ConcurrentModificationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/ConcurrentModificationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 7120365 * @summary test on Concurrent Modification * @author Shanliang JIANG - * @modules java.management.rmi + * * @run main ConcurrentModificationTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/DiffHBTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/DiffHBTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/DiffHBTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4911721 * @summary test on add/remove NotificationListener * @author Shanliang JIANG - * @modules java.management + * * @run clean DiffHBTest * @run build DiffHBTest * @run main DiffHBTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/EmptyDomainNotificationTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/EmptyDomainNotificationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/EmptyDomainNotificationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Check that the expected notification is received by the JMX * client even when the domain in the ObjectName is not specified * @author Shanliang JIANG - * @modules java.management.rmi + * * @run clean EmptyDomainNotificationTest * @run build EmptyDomainNotificationTest * @run main EmptyDomainNotificationTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/ListenerScaleTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/ListenerScaleTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/ListenerScaleTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,9 +26,9 @@ * @bug 6338874 * @summary Check that notification dispatch is not linear in number of MBeans. * @author Eamonn McManus - * @modules java.management.rmi * * @library /lib/testlibrary + * * @run build jdk.testlibrary.* ListenerScaleTest * @run main ListenerScaleTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/NotSerializableNotifTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/NotSerializableNotifTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/NotSerializableNotifTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,10 +23,10 @@ /* * @test + * @bug 5022196 8132003 * @summary Tests to send a not serializable notification. - * @bug 5022196 8132003 * @author Shanliang JIANG - * @modules java.management.rmi + * * @run clean NotSerializableNotifTest * @run build NotSerializableNotifTest * @run main NotSerializableNotifTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/NotifBufferSizePropertyNameTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/NotifBufferSizePropertyNameTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/NotifBufferSizePropertyNameTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6174229 * @summary Verify the property name specifying server notification buffer size. * @author Shanliang JIANG - * @modules java.management + * * @run clean NotifBufferSizePropertyNameTest * @run build NotifBufferSizePropertyNameTest * @run main NotifBufferSizePropertyNameTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/NotifReconnectDeadlockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6199899 * @summary Tests reconnection done by a fetching notif thread. * @author Shanliang JIANG - * @modules java.management.rmi + * * @run clean NotifReconnectDeadlockTest * @run build NotifReconnectDeadlockTest * @run main NotifReconnectDeadlockTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/NotificationBufferCreationTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/NotificationBufferCreationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/NotificationBufferCreationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4934236 * @summary Tests that NotificationBuffer is created when used. * @author jfd@... - * @modules java.management.rmi + * * @run clean NotificationBufferCreationTest NotificationSender * @run build NotificationBufferCreationTest * @run main NotificationBufferCreationTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/NotificationBufferDeadlockTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/NotificationBufferDeadlockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/NotificationBufferDeadlockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Tests NotificationBuffer doesn't hold locks when adding listeners, * if test times out then deadlock is suspected. * @author Eamonn McManus - * @modules java.management + * * @run clean NotificationBufferDeadlockTest * @run build NotificationBufferDeadlockTest * @run main NotificationBufferDeadlockTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/NotificationEmissionTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/NotificationEmissionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/NotificationEmissionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,11 +24,11 @@ /* * @test * @bug 5106721 + * @key intermittent * @summary Check the emission of notifications when a Security Manager is * installed. Test the property "jmx.remote.x.check.notification.emission". * @author Luis-Miguel Alventosa - * @key intermittent - * @modules java.management.rmi + * * @run clean NotificationEmissionTest * @run build NotificationEmissionTest * @run main NotificationEmissionTest 1 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/RMINotifTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/RMINotifTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/RMINotifTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,9 +25,8 @@ * @test * @bug 7654321 * @summary Tests to receive notifications for opened and closed connections -ions * @author sjiang - * @modules java.management.rmi + * * @run clean RMINotifTest * @run build RMINotifTest * @run main RMINotifTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/ServerNotifs.java --- a/jdk/test/javax/management/remote/mandatory/notif/ServerNotifs.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/ServerNotifs.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Tests the reception of the notifications for opened and closed * connections * @author sjiang - * @modules java.management.rmi + * * @run clean ServerNotifs * @run build ServerNotifs * @run main ServerNotifs diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/notif/UnexpectedNotifTest.java --- a/jdk/test/javax/management/remote/mandatory/notif/UnexpectedNotifTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/notif/UnexpectedNotifTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Tests whether a listener receives notifs emitted before the * listener is registered. * @author Shanliang JIANG - * @modules java.management.rmi + * * @run clean UnexpectedNotifTest * @run build UnexpectedNotifTest * @run main UnexpectedNotifTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/passwordAccessFile/NonJMXPrincipalsTest.java --- a/jdk/test/javax/management/remote/mandatory/passwordAccessFile/NonJMXPrincipalsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/passwordAccessFile/NonJMXPrincipalsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Tests that MBeanServerFileAccessController supports * principals other than JMXPrincipal. * @author Luis-Miguel Alventosa - * @modules java.management.rmi + * * @run clean NonJMXPrincipalsTest SimpleStandard SimpleStandardMBean * @run build NonJMXPrincipalsTest SimpleStandard SimpleStandardMBean * @run main NonJMXPrincipalsTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/passwordAccessFile/PasswordAccessFileTest.java --- a/jdk/test/javax/management/remote/mandatory/passwordAccessFile/PasswordAccessFileTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/passwordAccessFile/PasswordAccessFileTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Tests the use of the "jmx.remote.x.password.file" and * "jmx.remote.x.access.file" environment map properties. * @author Luis-Miguel Alventosa - * @modules java.management.rmi + * * @run clean PasswordAccessFileTest SimpleStandard SimpleStandardMBean * @run build PasswordAccessFileTest SimpleStandard SimpleStandardMBean * @run main PasswordAccessFileTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/provider/ProviderTest.java --- a/jdk/test/javax/management/remote/mandatory/provider/ProviderTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/provider/ProviderTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,7 +24,7 @@ /* * @test ProviderTest.java * @summary Tests jar services provider are called - * @modules java.management.rmi + * * @run clean ProviderTest provider.JMXConnectorProviderImpl provider.JMXConnectorServerProviderImpl * @run build ProviderTest provider.JMXConnectorProviderImpl provider.JMXConnectorServerProviderImpl * @run main ProviderTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/socketFactories/RMISocketFactoriesTest.java --- a/jdk/test/javax/management/remote/mandatory/socketFactories/RMISocketFactoriesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/socketFactories/RMISocketFactoriesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 7654321 * @summary Tests the use of the custom RMI socket factories. * @author Luis-Miguel Alventosa - * @modules java.management.rmi + * * @run clean RMISocketFactoriesTest * @run build RMISocketFactoriesTest RMIClientFactory RMIServerFactory * @run main RMISocketFactoriesTest test_server_factory diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/threads/ExecutorShutdownTest.java --- a/jdk/test/javax/management/remote/mandatory/threads/ExecutorShutdownTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/threads/ExecutorShutdownTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8141591 * @summary Tests if notifications are received after executor is shutdown * @author Harsha Wardhana B - * @modules java.management + * * @run clean ExecutorShutdownTest * @run build ExecutorShutdownTest * @run main ExecutorShutdownTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/threads/ExecutorTest.java --- a/jdk/test/javax/management/remote/mandatory/threads/ExecutorTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/threads/ExecutorTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6190873 * @summary Tests that thread creation can use a user-supplied Executor * @author Eamonn McManus - * @modules java.management + * * @run clean ExecutorTest * @run build ExecutorTest * @run main ExecutorTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/threads/NoServerTimeoutTest.java --- a/jdk/test/javax/management/remote/mandatory/threads/NoServerTimeoutTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/threads/NoServerTimeoutTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6192124 * @summary Tests that you can turn off the server connection timeout thread * @author Eamonn McManus - * @modules java.management + * * @run clean NoServerTimeoutTest * @run build NoServerTimeoutTest * @run main NoServerTimeoutTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/remote/mandatory/version/ImplVersionTest.java --- a/jdk/test/javax/management/remote/mandatory/version/ImplVersionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/remote/mandatory/version/ImplVersionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -29,7 +29,7 @@ * test codebase has the java permission to read the "java.runtime.version" * system property. * @author Luis-Miguel Alventosa, Joel Feraud - * @modules java.management + * * @run clean ImplVersionTest ImplVersionCommand * @run build ImplVersionTest ImplVersionCommand ImplVersionReader * @run main ImplVersionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/security/AvoidGetMBeanInfoCallsTest.java --- a/jdk/test/javax/management/security/AvoidGetMBeanInfoCallsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/security/AvoidGetMBeanInfoCallsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Test that MBeanServer.queryNames doesn't call getMBeanInfo on every * resultant MBean when there is no security manager installed. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean AvoidGetMBeanInfoCallsTest * @run build AvoidGetMBeanInfoCallsTest * @run main AvoidGetMBeanInfoCallsTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/security/MBeanPermissionTest.java --- a/jdk/test/javax/management/security/MBeanPermissionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/security/MBeanPermissionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6228749 * @summary MBeanPermission(null,"") should throw IllegalArgumentException. * @author Luis-Miguel Alventosa - * @modules java.management + * * @run clean MBeanPermissionTest * @run build MBeanPermissionTest * @run main MBeanPermissionTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/standardmbean/DeadlockTest.java --- a/jdk/test/javax/management/standardmbean/DeadlockTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/standardmbean/DeadlockTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6331746 * @summary Test a deadlock and will be blocked forever if the deadlock is present. * @author Shanliang JIANG - * @modules java.management + * * @run main DeadlockTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/timer/MissingNotificationTest.java --- a/jdk/test/javax/management/timer/MissingNotificationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/timer/MissingNotificationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,13 +24,13 @@ /* * @test * @bug 6809322 + * @key randomness * @summary Test for missing notifications in a high concurrency environment * @author Jaroslav Bachorik - * @modules java.management + * * @run clean MissingNotificationTest * @run build MissingNotificationTest * @run main MissingNotificationTest - * @key randomness */ import java.util.Date; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/management/timer/StartTest.java --- a/jdk/test/javax/management/timer/StartTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/management/timer/StartTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 6659215 * @summary Test on timer start method with past notifications * @author Shanliang JIANG - * @modules java.management + * * @run clean StartTest * @run build StartTest * @run main StartTest diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/net/ssl/Stapling/SSLSocketWithStapling.java --- a/jdk/test/javax/net/ssl/Stapling/SSLSocketWithStapling.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/net/ssl/Stapling/SSLSocketWithStapling.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -367,9 +367,15 @@ throw tr.serverExc; } + // make sure getSoftFailExceptions is not empty + if (cliParams.revChecker.getSoftFailExceptions().isEmpty()) { + throw new Exception("No soft fail exceptions"); + } + System.out.println(" PASS"); System.out.println("=======================================\n"); + // Make OCSP responders accept connections intOcsp.acceptConnections(); rootOcsp.acceptConnections(); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/security/auth/PrivateCredentialPermission/MoreThenOnePrincipals.java --- a/jdk/test/javax/security/auth/PrivateCredentialPermission/MoreThenOnePrincipals.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/security/auth/PrivateCredentialPermission/MoreThenOnePrincipals.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,7 @@ /* * @test * @bug 8050409 + * @modules jdk.security.auth * @summary Tests with Subject.getPrivateCredentials to check permission checks with one or more principals. * @run testng/othervm/policy=MoreThenOnePrincipals.policy MoreThenOnePrincipals */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/security/auth/PrivateCredentialPermission/Subset.java --- a/jdk/test/javax/security/auth/PrivateCredentialPermission/Subset.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/security/auth/PrivateCredentialPermission/Subset.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,15 @@ * @test * @author Ram Marti * @bug 4326852 + * @modules jdk.security.auth * @summary Retrive a subset of private credentials can be accessed * @run main/othervm/policy=Subset.policy Subset */ -import java.util.*; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; import com.sun.security.auth.SolarisPrincipal; import javax.security.auth.Subject; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/security/auth/Subject/Serial.java --- a/jdk/test/javax/security/auth/Subject/Serial.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/security/auth/Subject/Serial.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,14 +24,19 @@ /* * @test * @bug 4364826 + * @modules jdk.security.auth * @summary Subject serialized principal set is * implementation-dependent class * @run main/othervm/policy=Serial.policy Serial */ +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.HashSet; +import java.util.Set; import javax.security.auth.Subject; -import java.io.*; -import java.util.*; public class Serial implements java.io.Serializable { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/security/auth/SubjectDomainCombiner/Regression.java --- a/jdk/test/javax/security/auth/SubjectDomainCombiner/Regression.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/security/auth/SubjectDomainCombiner/Regression.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,18 +24,20 @@ /* * @test * @bug 4390546 + * @modules jdk.security.auth * @summary performance regression and other bugs in * SubjectDomainCombiner.combine * * @run main/othervm/policy=Regression.policy -Djava.security.auth.debug=combiner Regression */ -import javax.security.auth.*; import java.security.ProtectionDomain; import java.security.CodeSource; import java.net.URL; import java.util.Set; import java.util.HashSet; +import javax.security.auth.Subject; +import javax.security.auth.SubjectDomainCombiner; public class Regression { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/security/auth/kerberos/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/security/auth/kerberos/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,1 @@ +modules = java.security.jgss diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/security/auth/login/Configuration/GetInstance.java --- a/jdk/test/javax/security/auth/login/Configuration/GetInstance.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/security/auth/login/Configuration/GetInstance.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,21 @@ * @test * @bug 6268315 * @bug 6273812 + * @modules jdk.security.auth * @summary Configuration should be provider-based * @build GetInstanceConfigSpi GetInstanceProvider * @run main/othervm -Djava.security.auth.login.config==${test.src}${/}GetInstance.config GetInstance */ -import javax.security.auth.login.*; - -import java.security.*; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.Provider; +import java.security.Security; +import java.security.URIParameter; import java.io.File; import java.net.URI; +import javax.security.auth.login.AppConfigurationEntry; +import javax.security.auth.login.Configuration; public class GetInstance { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/security/auth/login/Configuration/GetInstanceSecurity.java --- a/jdk/test/javax/security/auth/login/Configuration/GetInstanceSecurity.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/security/auth/login/Configuration/GetInstanceSecurity.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 6268315 + * @modules jdk.security.auth * @summary Configuration should be provider-based * @build GetInstanceConfigSpi GetInstanceProvider * @run main/othervm/policy=GetInstanceSecurity.policy GetInstanceSecurity @@ -31,8 +32,10 @@ import java.io.File; import java.net.URI; -import java.security.*; -import javax.security.auth.login.*; +import java.security.Policy; +import java.security.Security; +import java.security.URIParameter; +import javax.security.auth.login.Configuration; public class GetInstanceSecurity { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/security/auth/login/LoginContext/ConfigConstructor.java --- a/jdk/test/javax/security/auth/login/LoginContext/ConfigConstructor.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/security/auth/login/LoginContext/ConfigConstructor.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,9 +21,10 @@ * questions. */ -/** +/* * @test * @bug 4703361 + * @modules jdk.security.auth * @summary can not specify Configuration to LoginContext constructor * * @run main/othervm/policy=ConfigConstructor.policy -Djava.security.auth.login.config=file:${test.src}/ConfigConstructor.config ConfigConstructor @@ -37,10 +38,13 @@ */ import java.util.Map; -import javax.security.auth.*; -import javax.security.auth.login.*; -import javax.security.auth.spi.*; -import javax.security.auth.callback.*; +import javax.security.auth.Subject; +import javax.security.auth.login.AppConfigurationEntry; +import javax.security.auth.login.Configuration; +import javax.security.auth.login.LoginContext; +import javax.security.auth.login.LoginException; +import javax.security.auth.spi.LoginModule; +import javax.security.auth.callback.CallbackHandler; public class ConfigConstructor { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/security/auth/login/LoginContext/ConfigConstructorNoPerm.java --- a/jdk/test/javax/security/auth/login/LoginContext/ConfigConstructorNoPerm.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/security/auth/login/LoginContext/ConfigConstructorNoPerm.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,9 +21,10 @@ * questions. */ -/** +/* * @test * @bug 4703361 + * @modules jdk.security.auth * @summary can not specify Configuration to LoginContext constructor * * @run main/othervm/policy=ConfigConstructorNoPerm.policy -Djava.security.auth.login.config=file:${test.src}/ConfigConstructor.config ConfigConstructorNoPerm @@ -36,10 +37,11 @@ */ import java.util.Map; -import javax.security.auth.*; -import javax.security.auth.login.*; -import javax.security.auth.spi.*; -import javax.security.auth.callback.*; +import javax.security.auth.Subject; +import javax.security.auth.login.AppConfigurationEntry; +import javax.security.auth.login.Configuration; +import javax.security.auth.login.LoginContext; +import javax.security.auth.callback.CallbackHandler; public class ConfigConstructorNoPerm { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/security/auth/login/LoginContext/ModuleSubject.java --- a/jdk/test/javax/security/auth/login/LoginContext/ModuleSubject.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/security/auth/login/LoginContext/ModuleSubject.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,7 @@ /* * @test * @bug 4378100 + * @modules jdk.security.auth * @summary LoginContext doesn't reinit modules with new Subject * if authentication fails * @@ -31,9 +32,9 @@ * @run main/othervm -Djava.security.auth.login.config=file:${test.src}/ModuleSubject.config ModuleSubject */ -import javax.security.auth.*; -import javax.security.auth.login.*; import java.security.Principal; +import javax.security.auth.login.LoginContext; +import javax.security.auth.login.LoginException; public class ModuleSubject { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/security/sasl/Sasl/PassSysProps.java --- a/jdk/test/javax/security/sasl/Sasl/PassSysProps.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/security/sasl/Sasl/PassSysProps.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,10 +21,11 @@ * questions. */ -/** +/* * @test * @author Vincent Ryan * @bug 6228412 + * @modules java.security.sasl * @summary Check that a Properties object can be passed to the Sasl create * client and create server methods. */ @@ -32,8 +33,12 @@ import java.util.Hashtable; import java.util.Map; import java.util.Properties; -import javax.security.sasl.*; -import javax.security.auth.callback.*; +import javax.security.sasl.Sasl; +import javax.security.sasl.SaslClient; +import javax.security.sasl.SaslException; +import javax.security.sasl.SaslServer; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; import org.ietf.jgss.GSSException; public class PassSysProps { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/swing/JFrame/8175301/ScaledFrameBackgroundTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JFrame/8175301/ScaledFrameBackgroundTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Color; +import java.awt.Rectangle; +import java.awt.Robot; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +/** + * @test + * @bug 8175301 + * @summary Java GUI hangs on Windows when Display set to 125% + * @run main/othervm -Dsun.java2d.uiScale=2 ScaledFrameBackgroundTest + * @run main/othervm -Dsun.java2d.uiScale=2 -Dsun.java2d.d3d=true ScaledFrameBackgroundTest + * @run main/othervm -Dsun.java2d.uiScale=2 -Dsun.java2d.opengl=true ScaledFrameBackgroundTest + */ +public class ScaledFrameBackgroundTest { + + private static final Color BACKGROUND = Color.RED; + private static JFrame frame; + + public static void main(String[] args) throws Exception { + + Robot robot = new Robot(); + robot.setAutoDelay(50); + + SwingUtilities.invokeAndWait(() -> { + frame = new JFrame(); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(400, 300); + JPanel panel = new JPanel(); + panel.setBackground(BACKGROUND); + frame.getContentPane().add(panel); + frame.setVisible(true); + }); + + robot.waitForIdle(); + Thread.sleep(200); + + Rectangle[] rects = new Rectangle[1]; + SwingUtilities.invokeAndWait(() -> { + rects[0] = frame.getBounds(); + }); + + Rectangle bounds = rects[0]; + + int x = bounds.x + bounds.width / 4; + int y = bounds.y + bounds.height / 4; + + Color color = robot.getPixelColor(x, y); + + if (!BACKGROUND.equals(color)) { + throw new RuntimeException("Wrong backgound color!"); + } + + x = bounds.x + 3 * bounds.width / 4; + y = bounds.y + 3 * bounds.height / 4; + + color = robot.getPixelColor(x, y); + + if (!BACKGROUND.equals(color)) { + throw new RuntimeException("Wrong backgound color!"); + } + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/swing/SwingContainer/SwingContainerIsForContainerOnly/SwingContainerIsForContainerOnly.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/SwingContainer/SwingContainerIsForContainerOnly/SwingContainerIsForContainerOnly.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.Container; +import java.io.IOException; +import java.net.URI; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; + +import javax.swing.SwingContainer; + +/** + * @test + * @bug 8176177 + */ +public final class SwingContainerIsForContainerOnly { + + public static void main(String[] args) throws IOException { + FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/")); + fs.getFileStores(); + Files.walkFileTree(fs.getPath("/modules/java.desktop"), new SimpleFileVisitor<>() { + @Override + public FileVisitResult visitFile(Path file, + BasicFileAttributes attrs) { + file = file.subpath(2, file.getNameCount()); + String name = file.toString(); + if (name.endsWith(".class")) { + name = name.substring(0, name.indexOf(".")).replace('/', '.'); + + final Class type; + try { + type = Class.forName(name, false, null); + } catch (Throwable e) { + return FileVisitResult.CONTINUE; + } + if (type.isAnnotationPresent(SwingContainer.class)) { + if (!Container.class.isAssignableFrom(type)) { + System.err.println("Wrong annotation for: " + type); + throw new RuntimeException(); + } + } + } + return FileVisitResult.CONTINUE; + }; + }); + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/swing/plaf/basic/BasicComboPopup/7072653/bug7072653.java --- a/jdk/test/javax/swing/plaf/basic/BasicComboPopup/7072653/bug7072653.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/swing/plaf/basic/BasicComboPopup/7072653/bug7072653.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,77 +24,78 @@ /* * @test * @key headful - * @bug 7072653 8144161 + * @bug 7072653 8144161 8176448 * @summary JComboBox popup mispositioned if its height exceeds the screen height * @run main bug7072653 */ + import java.awt.FlowLayout; import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; import java.awt.Insets; +import java.awt.Rectangle; import java.awt.Robot; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; import java.awt.Toolkit; import java.awt.Window; -import java.util.Arrays; + import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; public class bug7072653 { private static JComboBox combobox; private static JFrame frame; private static Robot robot; - private static volatile String errorString = ""; public static void main(String[] args) throws Exception { robot = new Robot(); - robot.delay(100); - UIManager.LookAndFeelInfo[] lookAndFeelArray - = UIManager.getInstalledLookAndFeels(); - for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) { - executeCase(lookAndFeelItem.getClassName()); - robot.delay(1000); - } - if (!"".equals(errorString)) { - - throw new RuntimeException("Error Log:\n" + errorString); + GraphicsEnvironment ge = + GraphicsEnvironment.getLocalGraphicsEnvironment(); + UIManager.LookAndFeelInfo[] lookAndFeelArray = + UIManager.getInstalledLookAndFeels(); + for (GraphicsDevice sd : ge.getScreenDevices()) { + for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) { + executeCase(lookAndFeelItem.getClassName(), sd); + robot.waitForIdle(); + } } } - private static void executeCase(String lookAndFeelString) throws Exception { + private static void executeCase(String lookAndFeelString, GraphicsDevice sd) + throws Exception { if (tryLookAndFeel(lookAndFeelString)) { - SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - try { - setup(lookAndFeelString); - test(); - } catch (Exception ex) { - errorString += "\n"; - errorString += Arrays.toString(ex.getStackTrace()); - } - finally { - frame.dispose(); - } + SwingUtilities.invokeAndWait(() -> { + try { + setup(lookAndFeelString, sd); + test(); + } catch (Exception ex) { + throw new RuntimeException(ex); + } finally { + frame.dispose(); } }); } - } - private static void setup(String lookAndFeelString) + private static void setup(String lookAndFeelString, GraphicsDevice sd) throws Exception { + GraphicsConfiguration gc = sd.getDefaultConfiguration(); + Rectangle gcBounds = gc.getBounds(); + frame = new JFrame("JComboBox Test " + lookAndFeelString, gc); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(400, 200); + frame.getContentPane().setLayout(new FlowLayout()); + frame.setLocation( + gcBounds.x + gcBounds.width / 2 - frame.getWidth() / 2, + gcBounds.y + gcBounds.height / 2 - frame.getHeight() / 2); - frame = new JFrame("JComboBox Test " + lookAndFeelString); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setSize(320, 200); - frame.getContentPane().setLayout(new FlowLayout()); - frame.setLocationRelativeTo(null); combobox = new JComboBox(new DefaultComboBoxModel() { @Override public Object getElementAt(int index) { @@ -108,6 +109,7 @@ }); combobox.setMaximumRowCount(100); + combobox.putClientProperty("JComboBox.isPopDown", true); frame.getContentPane().add(combobox); frame.setVisible(true); combobox.addPopupMenuListener(new PopupMenuListener() { @@ -120,30 +122,24 @@ int height = 0; for (Window window : JFrame.getWindows()) { if (Window.Type.POPUP == window.getType()) { - height = window.getSize().height; - break; + if (window.getOwner().isVisible()) { + height = window.getSize().height; + break; + } } } - GraphicsConfiguration gc - = combobox.getGraphicsConfiguration(); - Insets screenInsets = Toolkit.getDefaultToolkit() - .getScreenInsets(gc); + GraphicsConfiguration gc = combobox.getGraphicsConfiguration(); + Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc); int gcHeight = gc.getBounds().height; - if (lookAndFeelString.contains("aqua")) { - gcHeight = gcHeight - screenInsets.top; - //For Aqua LAF - } else { - gcHeight = gcHeight - screenInsets.top - - screenInsets.bottom; - } + gcHeight = gcHeight - insets.top - insets.bottom; if (height == gcHeight) { return; } String exception = "Popup window height " + "For LookAndFeel" + lookAndFeelString + " is wrong" - + "\nShould be " + height + "Actually " + gcHeight; - errorString += exception; + + "\nShould be " + gcHeight + ", Actually " + height; + throw new RuntimeException(exception); } @Override diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/swing/plaf/basic/BasicComboPopup/JComboBoxPopupLocation/JComboBoxPopupLocation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/plaf/basic/BasicComboPopup/JComboBoxPopupLocation/JComboBoxPopupLocation.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.EventQueue; +import java.awt.FlowLayout; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Insets; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.event.InputEvent; + +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.UIManager; + +/** + * @test + * @bug 8176448 + * @run main/timeout=600 JComboBoxPopupLocation + */ +public final class JComboBoxPopupLocation { + + private static final int SIZE = 300; + public static final String PROPERTY_NAME = "JComboBox.isPopDown"; + private static volatile Robot robot; + private static volatile JComboBox comboBox; + private static volatile JFrame frame; + + public static void main(final String[] args) throws Exception { + robot = new Robot(); + robot.setAutoDelay(100); + robot.setAutoWaitForIdle(true); + GraphicsEnvironment ge = + GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] sds = ge.getScreenDevices(); + UIManager.LookAndFeelInfo[] lookAndFeelArray = + UIManager.getInstalledLookAndFeels(); + for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) { + System.setProperty(PROPERTY_NAME, "true"); + step(sds, lookAndFeelItem); + if (lookAndFeelItem.getClassName().contains("Aqua")) { + System.setProperty(PROPERTY_NAME, "false"); + step(sds, lookAndFeelItem); + } + } + } + + private static void step(GraphicsDevice[] sds, + UIManager.LookAndFeelInfo lookAndFeelItem) + throws Exception { + UIManager.setLookAndFeel(lookAndFeelItem.getClassName()); + Point left = null; + for (final GraphicsDevice sd : sds) { + GraphicsConfiguration gc = sd.getDefaultConfiguration(); + Rectangle bounds = gc.getBounds(); + if (left == null || left.x > bounds.x) { + left = new Point(bounds.x, bounds.y + bounds.height / 2); + } + Point point = new Point(bounds.x, bounds.y); + Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc); + while (point.y < bounds.y + bounds.height - insets.bottom - SIZE ) { + while (point.x < bounds.x + bounds.width - insets.right - SIZE) { + try { + EventQueue.invokeAndWait(() -> { + setup(point); + }); + robot.waitForIdle(); + test(comboBox); + robot.waitForIdle(); + validate(comboBox); + robot.waitForIdle(); + point.translate(bounds.width / 5, 0); + } finally { + dispose(); + } + } + point.setLocation(bounds.x, point.y + bounds.height / 5); + } + } + if (left != null) { + final Point finalLeft = left; + finalLeft.translate(-50, 0); + try { + EventQueue.invokeAndWait(() -> { + setup(finalLeft); + }); + robot.waitForIdle(); + test(comboBox); + robot.waitForIdle(); + validate(comboBox); + } finally { + dispose(); + } + } + } + + private static void dispose() throws Exception { + EventQueue.invokeAndWait(() -> { + if (frame != null) { + frame.dispose(); + } + }); + } + + private static void setup(final Point tmp) { + comboBox = new JComboBox<>(); + for (int i = 1; i < 7; i++) { + comboBox.addItem("Long-long-long-long-long text in the item-" + i); + } + String property = System.getProperty(PROPERTY_NAME); + comboBox.putClientProperty(PROPERTY_NAME, Boolean.valueOf(property)); + frame = new JFrame(); + frame.setAlwaysOnTop(true); + frame.setLayout(new FlowLayout()); + frame.add(comboBox); + frame.pack(); + frame.setSize(frame.getWidth(), SIZE); + frame.setVisible(true); + frame.setLocation(tmp.x, tmp.y); + } + + private static void test(final JComboBox comboBox) throws Exception { + Point pt = comboBox.getLocationOnScreen(); + robot.mouseMove(pt.x + comboBox.getWidth() / 2, + pt.y + comboBox.getHeight() / 2); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + int x = pt.x + comboBox.getWidth() / 2; + int y = pt.y + comboBox.getHeight() / 2 + 70; + robot.mouseMove(x, y); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + } + + private static void validate(final JComboBox comboBox) throws Exception { + EventQueue.invokeAndWait(() -> { + if (comboBox.getSelectedIndex() == 0) { + throw new RuntimeException(); + } + }); + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java --- a/jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,7 +23,7 @@ /* * @test - * @bug 8160986 + * @bug 8160986 8174845 8176883 * @summary Bad rendering of Swing UI controls with Metal L&F on HiDPI display * @run main/manual MetalHiDPIIconsTest */ @@ -56,6 +56,8 @@ + " - JCheckBox\n" + " - JComboBox\n" + " - JScrollPane (vertical and horizontal scroll bars)\n" + + " - JRadioButtonMenuItem\n" + + " - JCheckBoxMenuItem\n" + "and others...\n\n" + "If so, press PASS, else press FAIL.\n"; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/jdk/internal/jrtfs/java.policy --- a/jdk/test/jdk/internal/jrtfs/java.policy Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/jdk/internal/jrtfs/java.policy Wed Jul 05 23:09:40 2017 +0200 @@ -1,3 +1,3 @@ grant { - permission java.io.FilePermission "${java.home}/-", "read"; + permission java.lang.RuntimePermission "accessSystemModules"; }; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java --- a/jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/jdk/nio/zipfs/MultiReleaseJarTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8144355 8144062 + * @bug 8144355 8144062 8176709 * @summary Test aliasing additions to ZipFileSystem for multi-release jar files * @library /lib/testlibrary/java/util/jar * @build Compiler JarBuilder CreateMultiReleaseTestJars @@ -42,6 +42,7 @@ import java.nio.file.*; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import org.testng.Assert; import org.testng.annotations.*; @@ -50,6 +51,7 @@ final private int MAJOR_VERSION = Runtime.version().major(); final private String userdir = System.getProperty("user.dir","."); + final private CreateMultiReleaseTestJars creator = new CreateMultiReleaseTestJars(); final private Map stringEnv = new HashMap<>(); final private Map integerEnv = new HashMap<>(); final private Map versionEnv = new HashMap<>(); @@ -63,7 +65,6 @@ @BeforeClass public void initialize() throws Exception { - CreateMultiReleaseTestJars creator = new CreateMultiReleaseTestJars(); creator.compileEntries(); creator.buildUnversionedJar(); creator.buildMultiReleaseJar(); @@ -187,6 +188,45 @@ } } + @Test + public void testIsMultiReleaseJar() throws Exception { + // Re-examine commented out tests as part of JDK-8176843 + testCustomMultiReleaseValue("true", true); + testCustomMultiReleaseValue("true\r\nOther: value", true); + testCustomMultiReleaseValue("true\nOther: value", true); + //testCustomMultiReleaseValue("true\rOther: value", true); + + testCustomMultiReleaseValue("false", false); + testCustomMultiReleaseValue(" true", false); + testCustomMultiReleaseValue("true ", false); + //testCustomMultiReleaseValue("true\n ", false); + //testCustomMultiReleaseValue("true\r ", false); + //testCustomMultiReleaseValue("true\n true", false); + //testCustomMultiReleaseValue("true\r\n true", false); + } + + private static final AtomicInteger JAR_COUNT = new AtomicInteger(0); + + private void testCustomMultiReleaseValue(String value, boolean expected) + throws Exception { + String fileName = "custom-mr" + JAR_COUNT.incrementAndGet() + ".jar"; + creator.buildCustomMultiReleaseJar(fileName, value, Map.of(), + /*addEntries*/true); + + Map env = Map.of("multi-release", "runtime"); + Path filePath = Paths.get(userdir, fileName); + String ssp = filePath.toUri().toString(); + URI customJar = new URI("jar", ssp , null); + try (FileSystem fs = FileSystems.newFileSystem(customJar, env)) { + if (expected) { + Assert.assertTrue(readAndCompare(fs, MAJOR_VERSION)); + } else { + Assert.assertTrue(readAndCompare(fs, 8)); + } + } + Files.delete(filePath); + } + private static class ByteArrayClassLoader extends ClassLoader { final private FileSystem fs; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/lib/testlibrary/ModuleTargetHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/lib/testlibrary/ModuleTargetHelper.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.InputStream; +import java.io.IOException; +import java.lang.module.ModuleReader; +import java.lang.module.ModuleReference; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import jdk.internal.module.ClassFileConstants; +import jdk.internal.module.ClassFileAttributes; +import jdk.internal.module.ClassFileAttributes.ModuleTargetAttribute; +import jdk.internal.org.objectweb.asm.Attribute; +import jdk.internal.org.objectweb.asm.ClassReader; +import jdk.internal.org.objectweb.asm.ClassVisitor; +import jdk.internal.org.objectweb.asm.Opcodes; + +public class ModuleTargetHelper { + private ModuleTargetHelper() {} + + public static final class ModuleTarget { + private String osName, osArch; + + public ModuleTarget(String osName, String osArch) { + this.osName = osName; + this.osArch = osArch; + } + + public String osName() { + return osName; + } + + public String osArch() { + return osArch; + } + } + + public static ModuleTarget getJavaBaseTarget() throws IOException { + Path p = Paths.get(URI.create("jrt:/modules/java.base/module-info.class")); + try (InputStream in = Files.newInputStream(p)) { + return read(in); + } + } + + public static ModuleTarget read(InputStream in) throws IOException { + ModuleTargetAttribute[] modTargets = new ModuleTargetAttribute[1]; + ClassVisitor cv = new ClassVisitor(Opcodes.ASM5) { + @Override + public void visitAttribute(Attribute attr) { + if (attr instanceof ModuleTargetAttribute) { + modTargets[0] = (ModuleTargetAttribute)attr; + } + } + }; + + // prototype of attributes that should be parsed + Attribute[] attrs = new Attribute[] { + new ModuleTargetAttribute() + }; + + // parse module-info.class + ClassReader cr = new ClassReader(in); + cr.accept(cv, attrs, 0); + if (modTargets[0] != null) { + return new ModuleTarget(modTargets[0].osName(), modTargets[0].osArch()); + } + + return null; + } + + public static ModuleTarget read(ModuleReference modRef) throws IOException { + ModuleReader reader = modRef.open(); + try (InputStream in = reader.open("module-info.class").get()) { + return read(in); + } finally { + reader.close(); + } + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/lib/testlibrary/java/util/jar/CreateMultiReleaseTestJars.java --- a/jdk/test/lib/testlibrary/java/util/jar/CreateMultiReleaseTestJars.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/lib/testlibrary/java/util/jar/CreateMultiReleaseTestJars.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -109,9 +109,17 @@ public void buildCustomMultiReleaseJar(String filename, String multiReleaseValue, Map extraAttributes) throws IOException { + buildCustomMultiReleaseJar(filename, multiReleaseValue, extraAttributes, false); + } + + public void buildCustomMultiReleaseJar(String filename, String multiReleaseValue, + Map extraAttributes, boolean addEntries) throws IOException { JarBuilder jb = new JarBuilder(filename); extraAttributes.entrySet() .forEach(entry -> jb.addAttribute(entry.getKey(), entry.getValue())); + if (addEntries) { + addEntries(jb); + } jb.addAttribute("Multi-Release", multiReleaseValue); jb.build(); } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/jvmstat/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/jvmstat/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = jdk.internal.jvmstat/sun.jvmstat.monitor + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/jvmstat/monitor/HostIdentifier/HostIdentifierCreate.java --- a/jdk/test/sun/jvmstat/monitor/HostIdentifier/HostIdentifierCreate.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/jvmstat/monitor/HostIdentifier/HostIdentifierCreate.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,8 +24,10 @@ /* * @test * @bug 4990825 - * @modules jdk.internal.jvmstat/sun.jvmstat.monitor * @summary test that HostIdentifier objects get created as expected + * + * @modules java.xml + * jdk.internal.jvmstat/sun.jvmstat.monitor */ import java.io.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/jvmstat/monitor/MonitoredVm/TestPollingInterval.java --- a/jdk/test/sun/jvmstat/monitor/MonitoredVm/TestPollingInterval.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/jvmstat/monitor/MonitoredVm/TestPollingInterval.java Wed Jul 05 23:09:40 2017 +0200 @@ -40,9 +40,10 @@ * @test * @bug 6672135 * @summary setInterval() for local MonitoredHost and local MonitoredVm - * @modules jdk.internal.jvmstat/sun.jvmstat.monitor + * * @library /lib/testlibrary * @library /test/lib + * * @build jdk.testlibrary.* * @build jdk.test.lib.apps.* * @run main TestPollingInterval diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/jvmstat/monitor/VmIdentifier/VmIdentifierCreateResolve.java --- a/jdk/test/sun/jvmstat/monitor/VmIdentifier/VmIdentifierCreateResolve.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/jvmstat/monitor/VmIdentifier/VmIdentifierCreateResolve.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,8 +24,10 @@ /* * @test * @bug 4990825 - * @modules jdk.internal.jvmstat/sun.jvmstat.monitor * @summary test that VmIdentifier objects get created as expected + * + * @modules java.xml + * jdk.internal.jvmstat/sun.jvmstat.monitor */ import java.io.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/jvmstat/perfdata/PrologSanity/PrologSizeSanityCheck.java --- a/jdk/test/sun/jvmstat/perfdata/PrologSanity/PrologSizeSanityCheck.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/jvmstat/perfdata/PrologSanity/PrologSizeSanityCheck.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,9 +24,9 @@ /* * @test * @bug 4990825 - * @modules jdk.internal.jvmstat/sun.jvmstat.monitor + * @summary prolog size and overflow sanity checks + * * @run main/othervm -XX:+UsePerfData PrologSizeSanityCheck - * @summary prolog size and overflow sanity checks */ import sun.jvmstat.monitor.*; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/HotspotClassLoadingMBean/GetClassInitializationTime.java --- a/jdk/test/sun/management/HotspotClassLoadingMBean/GetClassInitializationTime.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/HotspotClassLoadingMBean/GetClassInitializationTime.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4858522 * @summary Basic unit test of HotspotClassLoadingMBean.getClassInitializationTime() * @author Steve Bohne - * @modules java.management/sun.management + * * @run main/othervm -XX:+UsePerfData GetClassInitializationTime */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/HotspotClassLoadingMBean/GetClassLoadingTime.java --- a/jdk/test/sun/management/HotspotClassLoadingMBean/GetClassLoadingTime.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/HotspotClassLoadingMBean/GetClassLoadingTime.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4858522 * @summary Basic unit test of HotspotClassLoadingMBean.getClassLoadingTime() * @author Steve Bohne - * @modules java.management/sun.management + * * @build ClassToLoad0 * @run main/othervm -XX:+UsePerfData GetClassLoadingTime */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/HotspotClassLoadingMBean/GetInitializedClassCount.java --- a/jdk/test/sun/management/HotspotClassLoadingMBean/GetInitializedClassCount.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/HotspotClassLoadingMBean/GetInitializedClassCount.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4858522 * @summary Basic unit test of HotspotClassLoadingMBean.getInitializedClassCount() * @author Steve Bohne - * @modules java.management/sun.management + * * @run main/othervm -XX:+UsePerfData GetInitializedClassCount */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/HotspotClassLoadingMBean/GetLoadedClassSize.java --- a/jdk/test/sun/management/HotspotClassLoadingMBean/GetLoadedClassSize.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/HotspotClassLoadingMBean/GetLoadedClassSize.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4858522 * @summary Basic unit test of HotspotClassLoadingMBean.getLoadedClassSize() * @author Steve Bohne - * @modules java.management/sun.management + * * @run main/othervm -XX:+UsePerfData GetLoadedClassSize */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/HotspotClassLoadingMBean/GetMethodDataSize.java --- a/jdk/test/sun/management/HotspotClassLoadingMBean/GetMethodDataSize.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/HotspotClassLoadingMBean/GetMethodDataSize.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4858522 * @summary Basic unit test of HotspotClassLoadingMBean.getMethodDataSize() * @author Steve Bohne - * @modules java.management/sun.management + * * @run main/othervm -XX:+UsePerfData GetMethodDataSize */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/HotspotClassLoadingMBean/GetUnloadedClassSize.java --- a/jdk/test/sun/management/HotspotClassLoadingMBean/GetUnloadedClassSize.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/HotspotClassLoadingMBean/GetUnloadedClassSize.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4858522 * @summary Basic unit test of HotspotClassLoadingMBean.getUnloadedClassSize() * @author Steve Bohne - * @modules java.management/sun.management + * * @run main/othervm -XX:+UsePerfData GetUnloadedClassSize */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/HotspotRuntimeMBean/GetSafepointCount.java --- a/jdk/test/sun/management/HotspotRuntimeMBean/GetSafepointCount.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/HotspotRuntimeMBean/GetSafepointCount.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4858522 * @summary Basic unit test of HotspotClassLoadingMBean.getSafepointCount() * @author Steve Bohne - * @modules java.management/sun.management + * * @run main/othervm -XX:+UsePerfData GetSafepointCount */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/HotspotRuntimeMBean/GetSafepointSyncTime.java --- a/jdk/test/sun/management/HotspotRuntimeMBean/GetSafepointSyncTime.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/HotspotRuntimeMBean/GetSafepointSyncTime.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,7 +26,7 @@ * @bug 4858522 * @summary Basic unit test of HotspotRuntimeMBean.getSafepointSyncTime() * @author Steve Bohne - * @modules java.management/sun.management + * * @run main/othervm -XX:+UsePerfData GetSafepointSyncTime */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/HotspotRuntimeMBean/GetTotalSafepointTime.java --- a/jdk/test/sun/management/HotspotRuntimeMBean/GetTotalSafepointTime.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/HotspotRuntimeMBean/GetTotalSafepointTime.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,8 +24,8 @@ /* * @test * @bug 4858522 - * @modules java.management/sun.management * @summary Basic unit test of HotspotRuntimeMBean.getTotalSafepointTime() + * * @run main/othervm -XX:+UsePerfData GetTotalSafepointTime */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/HotspotThreadMBean/GetInternalThreads.java --- a/jdk/test/sun/management/HotspotThreadMBean/GetInternalThreads.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/HotspotThreadMBean/GetInternalThreads.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,7 @@ * @summary Basic Test for HotspotThreadMBean.getInternalThreadCount() * and getInternalThreadCpuTime() * @author Mandy Chung - * @modules java.management/sun.management + * * @run main/othervm -XX:+UsePerfData GetInternalThreads */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/LazyCompositeDataTest.java --- a/jdk/test/sun/management/LazyCompositeDataTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/LazyCompositeDataTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -36,7 +36,6 @@ * @test * @bug 8139870 * @summary sun.management.LazyCompositeData.isTypeMatched() fails for composite types with items of ArrayType - * @modules java.management/sun.management * @author Jaroslav Bachorik */ @@ -160,4 +159,5 @@ } System.out.println("=== PASSED"); } -} \ No newline at end of file +} + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/LoggingTest/LoggingWithJULTest.java --- a/jdk/test/sun/management/LoggingTest/LoggingWithJULTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/LoggingTest/LoggingWithJULTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,11 +26,14 @@ /** * @test * @bug 8172971 - * @modules java.management java.logging * @summary Smoke test to check that logging in java.management works as expected. + * @author danielfuchs + * + * @modules java.management + * java.logging + * * @build LoggingTest LoggingWithJULTest * @run main/othervm LoggingWithJULTest - * @author danielfuchs */ public class LoggingWithJULTest { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/LoggingTest/LoggingWithLoggerFinderTest.java --- a/jdk/test/sun/management/LoggingTest/LoggingWithLoggerFinderTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/LoggingTest/LoggingWithLoggerFinderTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -24,13 +24,13 @@ /** * @test * @bug 8172971 - * @modules java.management * @summary Smoke test to check that logging in java.management is performed * through System.Logger. This test installs a LoggerFinder service * provider and verifies that it gets the traces. + * @author danielfuchs + * * @build test.loggerfinder/test.loggerfinder.TestLoggerFinder LoggingTest LoggingWithLoggerFinderTest * @run main/othervm --add-modules test.loggerfinder LoggingWithLoggerFinderTest - * @author danielfuchs */ public class LoggingWithLoggerFinderTest { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/StackTraceElementCompositeData/CompatibilityTest.java --- a/jdk/test/sun/management/StackTraceElementCompositeData/CompatibilityTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/StackTraceElementCompositeData/CompatibilityTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -15,9 +15,9 @@ * @test * @bug 8139587 * @summary Check backward compatibility of StackTraceElementCompositeData - * @modules java.management/sun.management + * @author Jaroslav Bachorik + * * @run testng CompatibilityTest - * @author Jaroslav Bachorik */ public class CompatibilityTest { @@ -69,4 +69,5 @@ assertNull(ste.getModuleName()); assertNull(ste.getModuleVersion()); } -} \ No newline at end of file +} + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/management/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = java.management/sun.management + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jdp/JdpDefaultsTest.java --- a/jdk/test/sun/management/jdp/JdpDefaultsTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jdp/JdpDefaultsTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -30,8 +30,9 @@ /* * @test JdpDefaultsTest * @summary Assert that we can read JDP packets from a multicast socket connection, on default IP and port. + * * @library /lib/testlibrary - * @modules jdk.management.agent/sun.management.jdp + * * @build jdk.testlibrary.* ClientConnection JdpTestUtil JdpTestCase JdpOnTestCase DynamicLauncher * @run main/othervm JdpDefaultsTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jdp/JdpJmxRemoteDynamicPortTest.java --- a/jdk/test/sun/management/jdp/JdpJmxRemoteDynamicPortTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jdp/JdpJmxRemoteDynamicPortTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,14 +22,15 @@ */ /** - * @test JdpJmxRemoteDynamicPortTest.java - * @bug 8167337 - * @summary Verify a non-zero value is assigned to jmxremote.port - * when VM is started with jmxremote.port=0. - * @library /lib/testlibrary - * @modules jdk.management.agent/sun.management.jdp - * @build jdk.testlibrary.* ClientConnection JdpTestUtil JdpTestCase JdpJmxRemoteDynamicPortTestCase DynamicLauncher - * @run main/othervm JdpJmxRemoteDynamicPortTest + * @test JdpJmxRemoteDynamicPortTest.java + * @bug 8167337 + * @summary Verify a non-zero value is assigned to jmxremote.port + * when VM is started with jmxremote.port=0. + * + * @library /lib/testlibrary + * + * @build jdk.testlibrary.* ClientConnection JdpTestUtil JdpTestCase JdpJmxRemoteDynamicPortTestCase DynamicLauncher + * @run main/othervm JdpJmxRemoteDynamicPortTest */ import java.lang.management.ManagementFactory; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jdp/JdpOffTest.java --- a/jdk/test/sun/management/jdp/JdpOffTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jdp/JdpOffTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -31,8 +31,9 @@ /* * @test JdpOffTest.java * @summary Assert that no JDP packets are sent to the default address and port. + * * @library /lib/testlibrary - * @modules jdk.management.agent/sun.management.jdp + * * @build jdk.testlibrary.* ClientConnection JdpTestUtil JdpTestCase JdpOffTestCase DynamicLauncher * @run main/othervm JdpOffTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jdp/JdpSpecificAddressTest.java --- a/jdk/test/sun/management/jdp/JdpSpecificAddressTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jdp/JdpSpecificAddressTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -30,8 +30,9 @@ /* * @test JdpSpecificAddressTest * @summary Assert that we can read JDP packets from a multicast socket connection, on specific IP and port. + * * @library /lib/testlibrary - * @modules jdk.management.agent/sun.management.jdp + * * @build jdk.testlibrary.* ClientConnection JdpTestUtil JdpTestCase JdpOnTestCase DynamicLauncher * @run main/othervm JdpSpecificAddressTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jdp/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/management/jdp/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,3 @@ +modules = jdk.management.agent/sun.management.jdp \ + java.logging + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/LocalRMIServerSocketFactoryTest.java --- a/jdk/test/sun/management/jmxremote/LocalRMIServerSocketFactoryTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/LocalRMIServerSocketFactoryTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,15 +22,14 @@ */ /** - * @test LocalRMIServerSocketFactoryTest.java - * @bug 6774170 - * @summary Connect to a server socket returned by the LocalRMIServerSocketFactory. + * @test LocalRMIServerSocketFactoryTest.java + * @bug 6774170 + * @summary Connect to a server socket returned by the LocalRMIServerSocketFactory. * - * @author Daniel Fuchs + * @author Daniel Fuchs * - * @modules jdk.management.agent/sun.management.jmxremote - * @run compile -XDignore.symbol.file=true -g LocalRMIServerSocketFactoryTest.java - * @run main LocalRMIServerSocketFactoryTest + * @run compile -XDignore.symbol.file=true -g LocalRMIServerSocketFactoryTest.java + * @run main LocalRMIServerSocketFactoryTest */ import sun.management.jmxremote.LocalRMIServerSocketFactory; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/management/jmxremote/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,3 @@ +modules = jdk.management.agent/jdk.internal.agent \ + jdk.management.agent/sun.management.jmxremote + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java --- a/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -40,12 +40,16 @@ /** * @test * @bug 6434402 8004926 + * @author Jaroslav Bachorik + * * @library /lib/testlibrary - * @modules jdk.management.agent/jdk.internal.agent + * @modules java.management + * jdk.attach + * jdk.management.agent/jdk.internal.agent + * * @build jdk.testlibrary.* * @build TestManager TestApplication CustomLauncherTest * @run main/othervm CustomLauncherTest - * @author Jaroslav Bachorik */ public class CustomLauncherTest { private static final String TEST_CLASSPATH = System.getProperty("test.class.path"); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java --- a/jdk/test/sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/bootstrap/JMXInterfaceBindingTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -48,9 +48,9 @@ * @summary Test JMX agent host address binding. Same ports but different * interfaces to bind to (using plain sockets and SSL sockets). * - * @modules jdk.management.agent/jdk.internal.agent - * jdk.management.agent/sun.management.jmxremote * @library /lib/testlibrary + * @modules java.management.rmi + * * @build jdk.testlibrary.* JMXAgentInterfaceBinding * @run main/timeout=5 JMXInterfaceBindingTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/bootstrap/JvmstatCountersTest.java --- a/jdk/test/sun/management/jmxremote/bootstrap/JvmstatCountersTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/bootstrap/JvmstatCountersTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -27,7 +27,11 @@ * @summary Tests that the jvmstat counters published by the out-of-the-box * management agent for the JMX connection details are correct. * @author Luis-Miguel Alventosa - * @modules jdk.management.agent/jdk.internal.agent + * + * @modules java.management + * jdk.attach + * jdk.management.agent/jdk.internal.agent + * * @run clean JvmstatCountersTest * @run build JvmstatCountersTest * @run main/othervm/timeout=600 -XX:+UsePerfData JvmstatCountersTest 1 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/bootstrap/LocalManagementTest.java --- a/jdk/test/sun/management/jmxremote/bootstrap/LocalManagementTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/bootstrap/LocalManagementTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -32,13 +32,17 @@ /** * @test - * @library /lib/testlibrary * @bug 5016507 6173612 6319776 6342019 6484550 8004926 * @summary Start a managed VM and test that a management tool can connect * without connection or username/password details. * TestManager will attempt a connection to the address obtained from * both agent properties and jvmstat buffer. - * @modules jdk.management.agent/jdk.internal.agent + * + * @library /lib/testlibrary + * @modules java.management + * jdk.attach + * jdk.management.agent/jdk.internal.agent + * * @build jdk.testlibrary.* TestManager TestApplication * @run main/othervm/timeout=300 LocalManagementTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/bootstrap/PasswordFilePermissionTest.java --- a/jdk/test/sun/management/jmxremote/bootstrap/PasswordFilePermissionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/bootstrap/PasswordFilePermissionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,14 +25,14 @@ /** * @test - * @library /lib/testlibrary * @bug 6557093 * @summary Check SSL config file permission for out-of-the-box management - * @modules jdk.management.agent + * @author Taras Ledkov + * + * @library /lib/testlibrary + * * @build jdk.testlibrary.* AbstractFilePermissionTest Dummy * @run main/timeout=300 PasswordFilePermissionTest - * - * @author Taras Ledkov */ public class PasswordFilePermissionTest extends AbstractFilePermissionTest { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh --- a/jdk/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh Wed Jul 05 23:09:40 2017 +0200 @@ -24,12 +24,11 @@ # # @test # @bug 6528083 +# @key intermittent # @summary Test RMI Bootstrap # -# @key intermittent # @library /lib/testlibrary -# @modules jdk.management.agent/jdk.internal.agent -# jdk.management.agent/sun.management.jmxremote +# # @build jdk.testlibrary.* TestLogger Utils RmiBootstrapTest # @run shell/timeout=300 RmiBootstrapTest.sh @@ -44,7 +43,7 @@ rm -rf ${TESTCLASSES}/ssl mkdir -p ${TESTCLASSES}/ssl -cp -rf ${TESTSRC}/ssl/*store ${TESTCLASSES}/ssl +cp -rf ${TESTSRC}/ssl/*store ${TESTCLASSES}/ssl chmod -R 777 ${TESTCLASSES}/ssl DEBUGOPTIONS="" @@ -56,7 +55,7 @@ # Call the common generic test # -# No need to since bug 4267864 is now fixed. +# No need to since bug 4267864 is now fixed. # echo ------------------------------------------------------------- echo Launching test for `basename $0 .sh` diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/bootstrap/RmiRegistrySslTest.java --- a/jdk/test/sun/management/jmxremote/bootstrap/RmiRegistrySslTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/bootstrap/RmiRegistrySslTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -39,13 +39,14 @@ /** * @test - * @library /lib/testlibrary * @bug 6228231 * @summary Test that RMI registry uses SSL. - * @modules jdk.management.agent + * @author Luis-Miguel Alventosa, Taras Ledkov + * + * @library /lib/testlibrary + * * @build jdk.testlibrary.* RmiRegistrySslTestApp * @run main/timeout=300 RmiRegistrySslTest - * @author Luis-Miguel Alventosa, Taras Ledkov */ public class RmiRegistrySslTest { private final String TEST_CLASS_PATH = System.getProperty("test.class.path"); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh --- a/jdk/test/sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh Wed Jul 05 23:09:40 2017 +0200 @@ -27,8 +27,7 @@ # @summary Test RMI Bootstrap with SSL # # @library /lib/testlibrary -# @modules jdk.management.agent/jdk.internal.agent -# jdk.management.agent/sun.management.jmxremote +# # @build jdk.testlibrary.* TestLogger Utils RmiBootstrapTest # @run shell/timeout=300 RmiSslBootstrapTest.sh @@ -43,7 +42,7 @@ rm -rf ${TESTCLASSES}/ssl mkdir -p ${TESTCLASSES}/ssl -cp -rf ${TESTSRC}/ssl/*store ${TESTCLASSES}/ssl +cp -rf ${TESTSRC}/ssl/*store ${TESTCLASSES}/ssl chmod -R 777 ${TESTCLASSES}/ssl DEBUGOPTIONS="" diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/bootstrap/RmiSslNoKeyStoreTest.sh --- a/jdk/test/sun/management/jmxremote/bootstrap/RmiSslNoKeyStoreTest.sh Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/bootstrap/RmiSslNoKeyStoreTest.sh Wed Jul 05 23:09:40 2017 +0200 @@ -24,10 +24,8 @@ # # @test # @summary Test RMI Bootstrap with SSL and no keystore. +# @bug 4932854 # -# @bug 4932854 -# @modules jdk.management.agent/jdk.internal.agent -# jdk.management.agent/sun.management.jmxremote # @build TestLogger RmiSslNoKeyStoreTest # @run shell/timeout=300 RmiSslNoKeyStoreTest.sh @@ -42,7 +40,7 @@ rm -rf ${TESTCLASSES}/ssl mkdir -p ${TESTCLASSES}/ssl -cp -rf ${TESTSRC}/ssl/*store ${TESTCLASSES}/ssl +cp -rf ${TESTSRC}/ssl/*store ${TESTCLASSES}/ssl chmod -R 777 ${TESTCLASSES}/ssl DEBUGOPTIONS="" diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/bootstrap/SSLConfigFilePermissionTest.java --- a/jdk/test/sun/management/jmxremote/bootstrap/SSLConfigFilePermissionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/bootstrap/SSLConfigFilePermissionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,14 +25,14 @@ /** * @test + * @bug 6557093 + * @summary Check SSL config file permission for out-of-the-box management + * @author Taras Ledkov + * * @library /lib/testlibrary - * @bug 6557093 - * @modules jdk.management.agent + * * @build jdk.testlibrary.* Dummy AbstractFilePermissionTest - * @summary Check SSL config file permission for out-of-the-box management * @run main/timeout=300 SSLConfigFilePermissionTest - * - * @author Taras Ledkov */ public class SSLConfigFilePermissionTest extends AbstractFilePermissionTest { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java --- a/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -53,13 +53,17 @@ /** * @test * @bug 7110104 + * @key randomness intermittent + * @summary Makes sure that enabling/disabling the management agent through JCMD + * achieves the desired results + * * @library /lib/testlibrary - * @modules jdk.management.agent/jdk.internal.agent + * @modules java.management + * java.rmi + * jdk.management.agent/jdk.internal.agent + * * @build jdk.testlibrary.* JMXStartStopTest PortAllocator TestApp ManagementAgentJcmd * @run main/othervm/timeout=600 -XX:+UsePerfData JMXStartStopTest - * @summary Makes sure that enabling/disabling the management agent through JCMD - * achieves the desired results - * @key randomness intermittent */ public class JMXStartStopTest { private static final String TEST_APP_NAME = "TestApp"; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/startstop/JMXStatusPerfCountersTest.java --- a/jdk/test/sun/management/jmxremote/startstop/JMXStatusPerfCountersTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/startstop/JMXStatusPerfCountersTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -38,11 +38,12 @@ /** * @test * @bug 8075926 + * @key intermittent * @summary Makes sure that the current management agent status is reflected * in the related performance counters. - * @key intermittent + * * @library /lib/testlibrary - * @modules jdk.management.agent/jdk.internal.agent + * * @build jdk.testlibrary.* PortAllocator TestApp ManagementAgentJcmd * @run testng/othervm -XX:+UsePerfData JMXStatusPerfCountersTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/management/jmxremote/startstop/JMXStatusTest.java --- a/jdk/test/sun/management/jmxremote/startstop/JMXStatusTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/management/jmxremote/startstop/JMXStatusTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -37,8 +37,9 @@ * @summary Performs a sanity test for the ManagementAgent.status diagnostic command. * Management agent may be disabled, started (only local connections) and started. * The test asserts that the expected text is being printed. + * * @library /lib/testlibrary - * @modules jdk.management.agent/jdk.internal.agent + * * @build jdk.testlibrary.* PortAllocator TestApp ManagementAgentJcmd * JMXStatusTest JMXStatus1Test JMXStatus2Test * @run testng/othervm -XX:+UsePerfData JMXStatus1Test diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/net/www/http/HttpClient/B8025710.java --- a/jdk/test/sun/net/www/http/HttpClient/B8025710.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/net/www/http/HttpClient/B8025710.java Wed Jul 05 23:09:40 2017 +0200 @@ -37,6 +37,7 @@ * @test * @bug 8025710 * @summary Proxied https connection reuse by HttpClient can send CONNECT to the server + * @run main/othervm B8025710 */ public class B8025710 { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java --- a/jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java Wed Jul 05 23:09:40 2017 +0200 @@ -26,8 +26,7 @@ * @bug 8132734 8144062 8159785 * @summary Test that URL connections to multi-release jars can be runtime versioned * @library /lib/testlibrary/java/util/jar - * @modules java.compiler - * jdk.compiler + * @modules jdk.compiler * jdk.httpserver * jdk.jartool * @build Compiler JarBuilder CreateMultiReleaseTestJars SimpleHttpServer diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/net/www/protocol/jrt/java.policy --- a/jdk/test/sun/net/www/protocol/jrt/java.policy Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/net/www/protocol/jrt/java.policy Wed Jul 05 23:09:40 2017 +0200 @@ -1,3 +1,3 @@ grant { - permission java.io.FilePermission "${java.home}/-", "read"; + permission java.lang.RuntimePermission "accessSystemModules"; }; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/security/krb5/auto/Basic.java --- a/jdk/test/sun/security/krb5/auto/Basic.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/security/krb5/auto/Basic.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,19 +25,48 @@ * @test * @bug 7152176 8164437 * @summary More krb5 tests + * @library /test/lib * @compile -XDignore.symbol.file Basic.java - * @run main/othervm - * Basic jdk.security.jgss - * @run main/othervm --limit-modules java.security.jgss,jdk.security.auth - * Basic java.security.jgss + * @run main/othervm Basic */ +import jdk.test.lib.process.ProcessTools; import sun.security.jgss.GSSUtil; -// The basic krb5 test skeleton you can copy from +import java.util.List; +import java.util.stream.Stream; + public class Basic { - public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Throwable { + + if (args.length == 0) { // jtreg launched here + + // With all modules + test("jdk.security.jgss"); + + // With limited modules + List cmd = ProcessTools.createJavaProcessBuilder().command(); + Stream.of(jdk.internal.misc.VM.getRuntimeArguments()) + .filter(arg -> arg.startsWith("--add-exports=") || + arg.startsWith("--add-opens=")) + .forEach(cmd::add); + cmd.addAll(List.of( + "-Dtest.src=" + System.getProperty("test.src"), + "--add-modules", + "java.base,java.security.jgss,jdk.security.auth", + "--limit-modules", + "java.security.jgss,jdk.security.auth", + "Basic", + "launched-limited")); + ProcessTools.executeCommand(cmd.toArray(new String[cmd.size()])) + .shouldHaveExitValue(0); + } else { // Launched by ProcessTools above, with limited modules. + test("java.security.jgss"); + } + } + + static void test(String expected) throws Exception { new OneKDC(null).writeJAASConf(); @@ -66,8 +95,8 @@ // Bonus test for 8164437. String moduleName = c.x().getClass().getModule().getName(); - if (!moduleName.equals(args[0])) { - throw new Exception("Expected: " + args[0] + if (!moduleName.equals(expected)) { + throw new Exception("Expected: " + expected + ". Actual: " + moduleName); } } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/security/krb5/auto/HttpNegotiateServer.java --- a/jdk/test/sun/security/krb5/auto/HttpNegotiateServer.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/security/krb5/auto/HttpNegotiateServer.java Wed Jul 05 23:09:40 2017 +0200 @@ -28,6 +28,7 @@ * java.security.jgss/sun.security.krb5.internal:+open * java.security.jgss/sun.security.jgss * java.security.jgss/sun.security.krb5:+open + * java.security.jgss/sun.security.krb5.internal.ccache * java.security.jgss/sun.security.krb5.internal.crypto * java.security.jgss/sun.security.krb5.internal.ktab * jdk.security.auth diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/security/krb5/config/Include.java --- a/jdk/test/sun/security/krb5/config/Include.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/security/krb5/config/Include.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8029994 + * @bug 8029994 8177085 * @summary Support "include" and "includedir" in krb5.conf * @modules java.security.jgss/sun.security.krb5 * @compile -XDignore.symbol.file Include.java @@ -35,6 +35,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Arrays; public class Include { public static void main(String[] args) throws Exception { @@ -43,13 +44,15 @@ Path conf = Paths.get("krb5.conf"); // base krb5.conf - Path ifile = Paths.get("f"); // include f - Path idir = Paths.get("x"); // includedir fx - Path idirdir = Paths.get("x/xx"); // sub dir, will be ignored - Path idirdirfile = Paths.get("x/xx/ff"); // sub dir, will be ignored - Path idirfile1 = Paths.get("x/f1"); // one file - Path idirfile2 = Paths.get("x/f2"); // another file - Path idirfile3 = Paths.get("x/f.3"); // third file bad name + Path f = Paths.get("f"); // include + Path f2 = Paths.get("f2"); // f include f2 + Path d = Paths.get("d"); // includedir + Path dd = Paths.get("d/dd"); // sub dir, ignore + Path ddf = Paths.get("d/dd/ddf"); // file in sub dir, ignore + Path df1 = Paths.get("d/f1"); // one file in dir + Path df2 = Paths.get("d/f2"); // another file + Path df3 = Paths.get("d/f.3"); // third file bad name + Path df4 = Paths.get("d/f4.conf"); // fourth file // OK: The base file can be missing System.setProperty("java.security.krb5.conf", "no-such-file"); @@ -59,8 +62,8 @@ // Write base file Files.write(conf, - ("include " + ifile.toAbsolutePath() + "\n" + - "includedir " + idir.toAbsolutePath() + "\n" + + ("include " + f.toAbsolutePath() + "\n" + + "includedir " + d.toAbsolutePath() + "\n" + krb5Conf + "base").getBytes() ); @@ -68,54 +71,63 @@ tryReload(false); // Error: Only includedir exists - Files.createDirectory(idir); + Files.createDirectory(d); tryReload(false); // Error: Both exists, but include is a cycle - Files.write(ifile, + Files.write(f, ("include " + conf.toAbsolutePath() + "\n" + - krb5Conf + "incfile").getBytes()); + krb5Conf + "f").getBytes()); tryReload(false); - // Error: A good include exists, but no includedir - Files.delete(idir); - Files.write(ifile, (krb5Conf + "incfile").getBytes()); + // Error: A good include exists, but no includedir yet + Files.delete(d); + Files.write(f, (krb5Conf + "f").getBytes()); tryReload(false); // OK: Everything is set - Files.createDirectory(idir); + Files.createDirectory(d); tryReload(true); // Now OK + // make f include f2 + Files.write(f, + ("include " + f2.toAbsolutePath() + "\n" + + krb5Conf + "f").getBytes()); + Files.write(f2, (krb5Conf + "f2").getBytes()); // fx1 and fx2 will be loaded - Files.write(idirfile1, (krb5Conf + "incdir1").getBytes()); - Files.write(idirfile2, (krb5Conf + "incdir2").getBytes()); + Files.write(df1, (krb5Conf + "df1").getBytes()); + Files.write(df2, (krb5Conf + "df2").getBytes()); // fx3 and fxs (and file inside it) will be ignored - Files.write(idirfile3, (krb5Conf + "incdir3").getBytes()); - Files.createDirectory(idirdir); - Files.write(idirdirfile, (krb5Conf + "incdirdir").getBytes()); + Files.write(df3, (krb5Conf + "df3").getBytes()); + Files.createDirectory(dd); + Files.write(ddf, (krb5Conf + "ddf").getBytes()); + // fx4 will be loaded + Files.write(df4, (krb5Conf + "df4").getBytes()); // OK: All good files read tryReload(true); - String v = Config.getInstance().getAll("section", "key"); - // The order of files in includedir could be either - if (!v.equals("incfile incdir1 incdir2 base") && - !v.equals("incfile incdir2 incdir1 base")) { - throw new Exception(v); + String[] v = Config.getInstance().getAll("section", "key") .split(" "); + // v will contain f2, f, df[124], and base. + // Order of df[124] is not determined. Sort them first. + Arrays.sort(v, 2, 5); + String longv = Arrays.toString(v); + if (!longv.equals("[f2, f, df1, df2, df4, base]")) { + throw new Exception(longv); } // Error: include file not absolute Files.write(conf, - ("include " + ifile + "\n" + - "includedir " + idir.toAbsolutePath() + "\n" + + ("include " + f + "\n" + + "includedir " + d.toAbsolutePath() + "\n" + krb5Conf + "base").getBytes() ); tryReload(false); // Error: includedir not absolute Files.write(conf, - ("include " + ifile.toAbsolutePath() + "\n" + - "includedir " + idir + "\n" + + ("include " + f.toAbsolutePath() + "\n" + + "includedir " + d + "\n" + krb5Conf + "base").getBytes() ); tryReload(false); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/security/pkcs/pkcs8/PKCS8Test.java --- a/jdk/test/sun/security/pkcs/pkcs8/PKCS8Test.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/security/pkcs/pkcs8/PKCS8Test.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -195,12 +195,12 @@ public static void main(String[] args) throws IOException, InvalidKeyException { - BigInteger p = BigInteger.valueOf(1); - BigInteger q = BigInteger.valueOf(2); - BigInteger g = BigInteger.valueOf(3); - BigInteger x = BigInteger.valueOf(4); + BigInteger x = BigInteger.valueOf(1); + BigInteger p = BigInteger.valueOf(2); + BigInteger q = BigInteger.valueOf(3); + BigInteger g = BigInteger.valueOf(4); - DSAPrivateKey priv = new DSAPrivateKey(p, q, g, x); + DSAPrivateKey priv = new DSAPrivateKey(x, p, q, g); byte[] encodedKey = priv.getEncoded(); byte[] expectedBytes = new byte[EXPECTED.length]; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/security/pkcs/pkcs8/TestLeadingZeros.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/pkcs/pkcs8/TestLeadingZeros.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8175251 + * @summary ensure that PKCS8-encoded private key with leading 0s + * can be loaded. + * @run main TestLeadingZeros + */ + +import java.io.*; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.interfaces.*; +import java.util.*; + +public class TestLeadingZeros { + + // The following test vectors are various BER encoded PKCS8 bytes + static final String[] PKCS8_ENCODINGS = { + // first is the original one from PKCS8Test + "301e020100301206052b0e03020c30090201020201030201040403020101A000", + // changed original to version w/ 1 leading 0 + "301f02020000301206052b0e03020c30090201020201030201040403020101A000", + // changed original to P w/ 1 leading 0 + "301f020100301306052b0e03020c300a020200020201030201040403020101A000", + // changed original to X w/ 2 leading 0s + "3020020100301206052b0e03020c300902010202010302010404050203000001A000" + }; + + public static void main(String[] argv) throws Exception { + KeyFactory factory = KeyFactory.getInstance("DSA", "SUN"); + + for (String encodings : PKCS8_ENCODINGS) { + byte[] encodingBytes = hexToBytes(encodings); + PKCS8EncodedKeySpec encodedKeySpec = + new PKCS8EncodedKeySpec(encodingBytes); + DSAPrivateKey privKey2 = (DSAPrivateKey) + factory.generatePrivate(encodedKeySpec); + System.out.println("key: " + privKey2); + } + System.out.println("Test Passed"); + } + + private static byte[] hexToBytes(String hex) { + if (hex.length() % 2 != 0) { + throw new RuntimeException("Input should be even length"); + } + int size = hex.length() / 2; + byte[] result = new byte[size]; + for (int i = 0; i < size; i++) { + int hi = Character.digit(hex.charAt(2 * i), 16); + int lo = Character.digit(hex.charAt(2 * i + 1), 16); + if ((hi == -1) || (lo == -1)) { + throw new RuntimeException("Input should be hexadecimal"); + } + result[i] = (byte) (16 * hi + lo); + } + return result; + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/security/tools/keytool/WeakAlg.java --- a/jdk/test/sun/security/tools/keytool/WeakAlg.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/security/tools/keytool/WeakAlg.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,7 +23,7 @@ /* * @test - * @bug 8171319 + * @bug 8171319 8177569 * @summary keytool should print out warnings when reading or generating * cert/cert req using weak algorithms * @library /test/lib @@ -78,7 +78,8 @@ .shouldMatch(".*512-bit RSA key.*risk") .shouldContain("512-bit RSA key (weak)"); - // Multiple warnings for multiple cert in -printcert or -list or -exportcert + // Multiple warnings for multiple cert in -printcert + // or -list or -exportcert // -certreq, -printcertreq, -gencert checkCertReq("a", "", null); @@ -184,7 +185,7 @@ .shouldMatch("The input.*MD5withRSA.*risk") .shouldNotContain("[no]"); - // cert is self-signed cacerts + // JDK-8177569: no warning for sigalg of trusted cert String weakSigAlgCA = null; KeyStore ks = KeyStoreUtil.getCacertsKeyStore(); if (ks != null) { @@ -208,12 +209,40 @@ } } if (weakSigAlgCA != null) { + // The following 2 commands still have a warning on why not using + // the -cacerts option directly. + kt("-list -keystore " + KeyStoreUtil.getCacerts()) + .shouldNotContain("risk"); + kt("-list -v -keystore " + KeyStoreUtil.getCacerts()) + .shouldNotContain("risk"); + + // -printcert will always show warnings + kt("-printcert -file ca.cert") + .shouldContain("name: " + weakSigAlgCA + " (weak)") + .shouldContain("Warning") + .shouldMatch("The certificate.*" + weakSigAlgCA + ".*risk"); + kt("-printcert -file ca.cert -trustcacerts") // -trustcacerts useless + .shouldContain("name: " + weakSigAlgCA + " (weak)") + .shouldContain("Warning") + .shouldMatch("The certificate.*" + weakSigAlgCA + ".*risk"); + + // Importing with -trustcacerts ignore CA cert's sig alg kt("-delete -alias d"); kt("-importcert -alias d -trustcacerts -file ca.cert", "no") .shouldContain("Certificate already exists in system-wide CA") + .shouldNotContain("risk") + .shouldContain("Do you still want to add it to your own keystore?"); + kt("-importcert -alias d -trustcacerts -file ca.cert -noprompt") + .shouldNotContain("risk") + .shouldNotContain("[no]"); + + // but not without -trustcacerts + kt("-delete -alias d"); + kt("-importcert -alias d -file ca.cert", "no") + .shouldContain("name: " + weakSigAlgCA + " (weak)") .shouldContain("Warning") .shouldMatch("The input.*" + weakSigAlgCA + ".*risk") - .shouldContain("Do you still want to add it to your own keystore?"); + .shouldContain("Trust this certificate?"); kt("-importcert -alias d -file ca.cert -noprompt") .shouldContain("Warning") .shouldMatch("The input.*" + weakSigAlgCA + ".*risk") @@ -266,6 +295,26 @@ // install reply reStore(); + certreq("c", ""); + gencert("a-c", ""); + kt("-importcert -alias c -file a-c.cert") + .shouldContain("Warning") + .shouldMatch("Issuer .*MD5withRSA.*risk"); + + // JDK-8177569: no warning for sigalg of trusted cert + reStore(); + // Change a into a TrustedCertEntry + kt("-exportcert -alias a -file a.cert"); + kt("-delete -alias a"); + kt("-importcert -alias a -file a.cert -noprompt"); + kt("-list -alias a -v") + .shouldNotContain("weak") + .shouldNotContain("Warning"); + // This time a is trusted and no warning on its weak sig alg + kt("-importcert -alias c -file a-c.cert") + .shouldNotContain("Warning"); + + reStore(); gencert("a-b", ""); gencert("b-c", ""); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jcmd/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/tools/jcmd/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = jdk.jcmd + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jcmd/TestJcmdDefaults.java --- a/jdk/test/sun/tools/jcmd/TestJcmdDefaults.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/tools/jcmd/TestJcmdDefaults.java Wed Jul 05 23:09:40 2017 +0200 @@ -34,15 +34,14 @@ import jdk.testlibrary.OutputAnalyzer; import jdk.testlibrary.Utils; -/** - * Unit test for jcmd utility. Tests jcmd options which do not send - * requests to a specific JVM process. - */ /* * @test * @bug 7104647 + * @summary Unit test for jcmd utility. Tests jcmd options which do not send + * requests to a specific JVM process. + * * @library /lib/testlibrary - * @modules java.management + * * @build jdk.testlibrary.* * @run main TestJcmdDefaults */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jcmd/TestJcmdSanity.java --- a/jdk/test/sun/tools/jcmd/TestJcmdSanity.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/tools/jcmd/TestJcmdSanity.java Wed Jul 05 23:09:40 2017 +0200 @@ -35,15 +35,14 @@ import jdk.testlibrary.ProcessTools; import jdk.testlibrary.Utils; -/** - * Unit test for jcmd utility. The test will send different diagnostic command - * requests to the current java process. - */ /* * @test * @bug 7104647 7154822 + * @summary Unit test for jcmd utility. The test will send different diagnostic + * command requests to the current java process. + * * @library /lib/testlibrary - * @modules java.management + * * @build jdk.testlibrary.* * @run main/othervm -XX:+UsePerfData TestJcmdSanity */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jconsole/ResourceCheckTest.java --- a/jdk/test/sun/tools/jconsole/ResourceCheckTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/tools/jconsole/ResourceCheckTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -22,13 +22,14 @@ */ /** + * @test + * @bug 5008856 5023573 5024917 5062569 7172176 + * @summary 'missing resource key' error for key = "Operating system" * - * @test - * @bug 5008856 5023573 5024917 5062569 7172176 - * @summary 'missing resource key' error for key = "Operating system" - * @modules jdk.jconsole/sun.tools.jconsole - * jdk.jconsole/sun.tools.jconsole.resources:open - * @run main ResourceCheckTest + * @modules jdk.jconsole/sun.tools.jconsole + * jdk.jconsole/sun.tools.jconsole.resources:open + * + * @run main ResourceCheckTest */ import java.lang.reflect.Field; diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jhsdb/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/tools/jhsdb/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,3 @@ +modules = jdk.hotspot.agent \ + java.management + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java --- a/jdk/test/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/tools/jhsdb/heapconfig/JMapHeapConfigTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -36,11 +36,12 @@ * @test * @bug 8042397 * @summary Unit test for jmap utility test heap configuration reader - * @modules jdk.hotspot.agent/sun.jvm.hotspot + * * @library /test/lib * @library /lib/testlibrary - * @build jdk.testlibrary.* - * @build jdk.test.lib.apps.* + * @modules java.management + * jdk.hotspot.agent/sun.jvm.hotspot + * * @build JMapHeapConfigTest TmtoolTestScenario * @run main JMapHeapConfigTest */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jinfo/JInfoTest.java --- a/jdk/test/sun/tools/jinfo/JInfoTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/tools/jinfo/JInfoTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,11 +36,12 @@ /* * @test * @summary Unit test for jinfo utility - * @modules java.base/jdk.internal.misc + * * @library /test/lib - * @build jdk.test.lib.* - * @build jdk.test.lib.apps.* - * @build jdk.test.lib.process.* + * @modules java.base/jdk.internal.misc + * java.management + * jdk.jcmd + * * @run main JInfoTest */ public class JInfoTest { @@ -88,8 +89,8 @@ LingeredApp.startApp(params, app2); OutputAnalyzer output = jinfo("JInfoTestLingeredApp"); output.shouldHaveExitValue(0); - // "HotSpot(TM)" written once per proc - documentMatch(output.getStdout(), ".*HotSpot\\(TM\\).*HotSpot\\(TM\\).*"); + // "Runtime Environment" written once per proc + documentMatch(output.getStdout(), ".*Runtime Environment.*Runtime Environment.*"); } finally { JInfoTestLingeredApp.stopApp(app1); JInfoTestLingeredApp.stopApp(app2); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jinfo/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/tools/jinfo/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = jdk.jcmd + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jmap/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/tools/jmap/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = jdk.jcmd + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jstack/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/tools/jstack/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = jdk.jcmd + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jstat/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/tools/jstat/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,2 @@ +modules = jdk.jcmd + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jstatd/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/tools/jstatd/TEST.properties Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,5 @@ +modules = java.management \ + java.rmi + jdk.jcmd \ + jdk.jstatd + diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jstatd/TestJstatdDefaults.java --- a/jdk/test/sun/tools/jstatd/TestJstatdDefaults.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/tools/jstatd/TestJstatdDefaults.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,8 +25,9 @@ * @test * @bug 4990825 * @key intermittent + * * @library /lib/testlibrary - * @modules java.management + * * @build jdk.testlibrary.* JstatdTest JstatGCUtilParser * @run main/timeout=60 TestJstatdDefaults */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jstatd/TestJstatdExternalRegistry.java --- a/jdk/test/sun/tools/jstatd/TestJstatdExternalRegistry.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/tools/jstatd/TestJstatdExternalRegistry.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,8 +25,9 @@ * @test * @bug 4990825 7092186 * @key intermittent + * * @library /lib/testlibrary - * @modules java.management + * * @build jdk.testlibrary.* JstatdTest JstatGCUtilParser * @run main/timeout=60 TestJstatdExternalRegistry */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jstatd/TestJstatdPort.java --- a/jdk/test/sun/tools/jstatd/TestJstatdPort.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/tools/jstatd/TestJstatdPort.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,8 +25,9 @@ * @test * @bug 4990825 * @key intermittent + * * @library /lib/testlibrary - * @modules java.management + * * @build jdk.testlibrary.* JstatdTest JstatGCUtilParser * @run main/timeout=60 TestJstatdPort */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jstatd/TestJstatdPortAndServer.java --- a/jdk/test/sun/tools/jstatd/TestJstatdPortAndServer.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/tools/jstatd/TestJstatdPortAndServer.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,8 +25,9 @@ * @test * @bug 4990825 * @key intermittent + * * @library /lib/testlibrary - * @modules java.management + * * @build jdk.testlibrary.* JstatdTest JstatGCUtilParser * @run main/timeout=60 TestJstatdPortAndServer */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/sun/tools/jstatd/TestJstatdServer.java --- a/jdk/test/sun/tools/jstatd/TestJstatdServer.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/sun/tools/jstatd/TestJstatdServer.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,8 +25,9 @@ * @test * @bug 4990825 * @key intermittent + * * @library /lib/testlibrary - * @modules java.management + * * @build jdk.testlibrary.* JstatdTest JstatGCUtilParser * @run main/timeout=60 TestJstatdServer */ diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jar/modularJar/Basic.java --- a/jdk/test/tools/jar/modularJar/Basic.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/jar/modularJar/Basic.java Wed Jul 05 23:09:40 2017 +0200 @@ -39,6 +39,7 @@ import jdk.testlibrary.FileUtils; import jdk.testlibrary.JDKToolFinder; import org.testng.annotations.BeforeTest; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import static java.lang.String.format; @@ -46,7 +47,7 @@ /* * @test - * @bug 8167328 8171830 8165640 8174248 + * @bug 8167328 8171830 8165640 8174248 8176772 * @library /lib/testlibrary * @modules jdk.compiler * jdk.jartool @@ -754,7 +755,7 @@ .assertSuccess(); - for (String option : new String[] {"--print-module-descriptor", "-d" }) { + for (String option : new String[] {"--describe-module", "-d" }) { jar(option, "--file=" + modularJar.toString()) @@ -801,8 +802,8 @@ } @Test - public void printModuleDescriptorFoo() throws IOException { - Path mp = Paths.get("printModuleDescriptorFoo"); + public void describeModuleFoo() throws IOException { + Path mp = Paths.get("describeModuleFoo"); createTestDir(mp); Path modClasses = MODULE_CLASSES.resolve(FOO.moduleName); Path modularJar = mp.resolve(FOO.moduleName + ".jar"); @@ -815,7 +816,7 @@ "-C", modClasses.toString(), ".") .assertSuccess(); - for (String option : new String[] {"--print-module-descriptor", "-d" }) { + for (String option : new String[] {"--describe-module", "-d" }) { jar(option, "--file=" + modularJar.toString()) .assertSuccess() @@ -836,8 +837,8 @@ } @Test - public void printModuleDescriptorFooFromStdin() throws IOException { - Path mp = Paths.get("printModuleDescriptorFooFromStdin"); + public void describeModuleFooFromStdin() throws IOException { + Path mp = Paths.get("describeModuleFooFromStdin"); createTestDir(mp); Path modClasses = MODULE_CLASSES.resolve(FOO.moduleName); Path modularJar = mp.resolve(FOO.moduleName + ".jar"); @@ -850,7 +851,7 @@ "-C", modClasses.toString(), ".") .assertSuccess(); - for (String option : new String[] {"--print-module-descriptor", "-d" }) { + for (String option : new String[] {"--describe-module", "-d" }) { jarWithStdin(modularJar.toFile(), option) .assertSuccess() @@ -862,6 +863,50 @@ } } + + @DataProvider(name = "autoNames") + public Object[][] autoNames() { + return new Object[][] { + // JAR file name module-name[@version] + { "foo.jar", "foo" }, + { "foo4j.jar", "foo4j", }, + { "foo1.2.3.jar", "foo" }, + { "foo-1.2.3.4.jar", "foo@1.2.3.4" }, + { "foo-bar.jar", "foo.bar" }, + { "foo-1.2-SNAPSHOT.jar", "foo@1.2-SNAPSHOT" }, + }; + } + + @Test(dataProvider = "autoNames") + public void describeAutomaticModule(String jarName, String mid) + throws IOException + { + Path mp = Paths.get("describeAutomaticModule"); + createTestDir(mp); + Path regularJar = mp.resolve(jarName); + Path t = Paths.get("t"); + if (Files.notExists(t)) + Files.createFile(t); + + jar("--create", + "--file=" + regularJar.toString(), + t.toString()) + .assertSuccess(); + + for (String option : new String[] {"--describe-module", "-d" }) { + jar(option, + "--file=" + regularJar.toString()) + .assertSuccess() + .resultChecker(r -> { + assertTrue(r.output.contains("No module descriptor found")); + assertTrue(r.output.contains("Derived automatic module")); + assertTrue(r.output.contains("module " + mid), + "Expected [", "module " + mid,"] in [", r.output, "]"); + } + ); + } + } + // -- Infrastructure static Result jarWithStdin(File stdinSource, String... args) { diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/IntegrationTest.java --- a/jdk/test/tools/jlink/IntegrationTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/jlink/IntegrationTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ import java.io.FileReader; import java.io.IOException; import java.io.UncheckedIOException; +import java.nio.ByteOrder; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -135,11 +136,6 @@ } System.out.println(jl); - JlinkConfiguration config - = new JlinkConfiguration(null, null, null, null); - - System.out.println(config); - Plugin p = Jlink.newPlugin("toto", Collections.emptyMap(), null); if (p != null) { throw new Exception("Plugin should be null"); @@ -163,7 +159,7 @@ Set limits = new HashSet<>(); limits.add("java.management"); JlinkConfiguration config = new Jlink.JlinkConfiguration(output, - modulePaths, mods, limits, null); + modulePaths, mods, limits, ByteOrder.nativeOrder()); List lst = new ArrayList<>(); @@ -214,7 +210,8 @@ checkReleaseProperty(props, "JAVA_FULL_VERSION"); checkReleaseProperty(props, "OS_NAME"); checkReleaseProperty(props, "OS_ARCH"); - checkReleaseProperty(props, "OS_VERSION"); + // OS_VERSION is added from makefile. We're testing API-way to create image here! + // checkReleaseProperty(props, "OS_VERSION"); if (!Files.exists(output.resolve("toto.txt"))) { throw new AssertionError("Post processing not called"); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/JLinkNegativeTest.java --- a/jdk/test/tools/jlink/JLinkNegativeTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/jlink/JLinkNegativeTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -193,7 +193,7 @@ .output(imageFile) .addMods("not_zip") .modulePath(helper.defaultModulePath()) - .call().assertFailure("Error: java.io.IOException: Invalid jmod file"); + .call().assertFailure("Error: java.io.IOException: Invalid JMOD file"); } finally { deleteDirectory(jmod); } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/JLinkTest.java --- a/jdk/test/tools/jlink/JLinkTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/jlink/JLinkTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -274,7 +274,7 @@ String[] userOptions = {"--compress", "2", "foo" }; String moduleName = "orphanarg1"; helper.generateDefaultJModule(moduleName, "composite2"); - helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: orphan argument: foo"); + helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: invalid argument: foo"); } // orphan argument - JDK-8166810 @@ -282,7 +282,7 @@ String[] userOptions = {"--output", "foo", "bar" }; String moduleName = "orphanarg2"; helper.generateDefaultJModule(moduleName, "composite2"); - helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: orphan argument: bar"); + helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: invalid argument: bar"); } // basic check for --help - JDK-8173717 diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/bindservices/BindServices.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/jlink/bindservices/BindServices.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.spi.ToolProvider; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static jdk.testlibrary.Asserts.assertTrue; +import static jdk.testlibrary.ProcessTools.*; + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; +import static org.testng.Assert.*; + +/** + * @test + * @bug 8174826 + * @library /lib/testlibrary + * @modules jdk.compiler jdk.jlink + * @build BindServices CompilerUtils jdk.testlibrary.ProcessTools + * @run testng BindServices + */ + +public class BindServices { + private static final String JAVA_HOME = System.getProperty("java.home"); + private static final String TEST_SRC = System.getProperty("test.src"); + + private static final Path SRC_DIR = Paths.get(TEST_SRC, "src"); + private static final Path MODS_DIR = Paths.get("mods"); + + private static final String MODULE_PATH = + Paths.get(JAVA_HOME, "jmods").toString() + + File.pathSeparator + MODS_DIR.toString(); + + // the names of the modules in this test + private static String[] modules = new String[] {"m1", "m2", "m3"}; + + + private static boolean hasJmods() { + if (!Files.exists(Paths.get(JAVA_HOME, "jmods"))) { + System.err.println("Test skipped. NO jmods directory"); + return false; + } + return true; + } + + /* + * Compiles all modules used by the test + */ + @BeforeTest + public void compileAll() throws Throwable { + if (!hasJmods()) return; + + for (String mn : modules) { + Path msrc = SRC_DIR.resolve(mn); + assertTrue(CompilerUtils.compile(msrc, MODS_DIR, + "--module-source-path", SRC_DIR.toString())); + } + } + + @Test + public void noServiceBinding() throws Throwable { + if (!hasJmods()) return; + + Path dir = Paths.get("noServiceBinding"); + + // no service binding and does not link m2,m3 providers. + JLink.run("--output", dir.toString(), + "--module-path", MODULE_PATH, + "--add-modules", "m1").output(); + + testImage(dir, "m1"); + } + + @Test + public void fullServiceBinding() throws Throwable { + if (!hasJmods()) return; + + Path dir = Paths.get("fullServiceBinding"); + + // full service binding + // m2 is a provider used by m1. During service binding, when m2 is + // resolved, m2 uses p2.T that causes m3 to be linked as it is a + // provider to p2.T + JLink.run("--output", dir.toString(), + "--module-path", MODULE_PATH, + "--add-modules", "m1", + "--bind-services", + "--limit-modules", "m1,m2,m3,java.base"); + + testImage(dir, "m1", "m2", "m3"); + } + + @Test + public void testVerbose() throws Throwable { + if (!hasJmods()) return; + + Path dir = Paths.get("verbose"); + + List output = + JLink.run("--output", dir.toString(), + "--module-path", MODULE_PATH, + "--add-modules", "m1", + "--bind-services", + "--verbose", + "--limit-modules", "m1,m2,m3,java.base").output(); + + List expected = List.of( + "module m1 (" + MODS_DIR.resolve("m1").toUri().toString() + ")", + "module m2 (" + MODS_DIR.resolve("m2").toUri().toString() + ")", + "module m3 (" + MODS_DIR.resolve("m3").toUri().toString() + ")", + "module m1 provides p1.S, used by m1", + "module m2 provides p1.S, used by m1", + "module m2 provides p2.T, used by m2", + "module m3 provides p2.T, used by m2" + ); + + assertTrue(output.containsAll(expected)); + + testImage(dir, "m1", "m2", "m3"); + } + + /* + * Tests the given ${java.home} to only contain the specified modules + */ + private void testImage(Path javaHome, String... modules) throws Throwable { + Path java = javaHome.resolve("bin").resolve("java"); + String[] cmd = Stream.concat( + Stream.of(java.toString(), "-m", "m1/p1.Main"), + Stream.of(modules)).toArray(String[]::new); + + assertTrue(executeProcess(cmd).outputTo(System.out) + .errorTo(System.out) + .getExitValue() == 0); + } + + static class JLink { + static final ToolProvider JLINK_TOOL = ToolProvider.findFirst("jlink") + .orElseThrow(() -> + new RuntimeException("jlink tool not found") + ); + + static JLink run(String... options) { + JLink jlink = new JLink(); + assertTrue(jlink.execute(options) == 0); + return jlink; + } + + final List output = new ArrayList<>(); + private int execute(String... options) { + System.out.println("jlink " + + Stream.of(options).collect(Collectors.joining(" "))); + + StringWriter writer = new StringWriter(); + PrintWriter pw = new PrintWriter(writer); + int rc = JLINK_TOOL.run(pw, pw, options); + System.out.println(writer.toString()); + Stream.of(writer.toString().split("\\v")) + .map(String::trim) + .forEach(output::add); + return rc; + } + + boolean contains(String s) { + return output.contains(s); + } + + List output() { + return output; + } + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/bindservices/SuggestProviders.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/jlink/bindservices/SuggestProviders.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.spi.ToolProvider; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static jdk.testlibrary.Asserts.assertTrue; + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; +import static org.testng.Assert.*; + +/** + * @test + * @bug 8174826 + * @library /lib/testlibrary + * @modules jdk.charsets jdk.compiler jdk.jlink + * @build SuggestProviders CompilerUtils + * @run testng SuggestProviders + */ + +public class SuggestProviders { + private static final String JAVA_HOME = System.getProperty("java.home"); + private static final String TEST_SRC = System.getProperty("test.src"); + + private static final Path SRC_DIR = Paths.get(TEST_SRC, "src"); + private static final Path MODS_DIR = Paths.get("mods"); + + private static final String MODULE_PATH = + Paths.get(JAVA_HOME, "jmods").toString() + + File.pathSeparator + MODS_DIR.toString(); + + // the names of the modules in this test + private static String[] modules = new String[] {"m1", "m2", "m3"}; + + + private static boolean hasJmods() { + if (!Files.exists(Paths.get(JAVA_HOME, "jmods"))) { + System.err.println("Test skipped. NO jmods directory"); + return false; + } + return true; + } + + /* + * Compiles all modules used by the test + */ + @BeforeTest + public void compileAll() throws Throwable { + if (!hasJmods()) return; + + for (String mn : modules) { + Path msrc = SRC_DIR.resolve(mn); + assertTrue(CompilerUtils.compile(msrc, MODS_DIR, + "--module-source-path", SRC_DIR.toString())); + } + } + + @Test + public void suggestProviders() throws Throwable { + if (!hasJmods()) return; + + List output = JLink.run("--module-path", MODULE_PATH, + "--add-modules", "m1", + "--suggest-providers").output(); + // check a subset of services used by java.base + List expected = List.of( + "uses java.lang.System$LoggerFinder", + "uses java.net.ContentHandlerFactory", + "uses java.net.spi.URLStreamHandlerProvider", + "uses java.nio.channels.spi.AsynchronousChannelProvider", + "uses java.nio.channels.spi.SelectorProvider", + "uses java.nio.charset.spi.CharsetProvider", + "uses java.nio.file.spi.FileSystemProvider", + "uses java.nio.file.spi.FileTypeDetector", + "uses java.security.Provider", + "uses java.util.spi.ToolProvider", + "uses p1.S", + "module jdk.charsets provides java.nio.charset.spi.CharsetProvider, used by java.base", + "module jdk.compiler provides java.util.spi.ToolProvider, used by java.base", + "module jdk.jlink provides java.util.spi.ToolProvider, used by java.base", + "module m1 provides p1.S, used by m1", + "module m2 provides p1.S, used by m1" + ); + + assertTrue(output.containsAll(expected)); + } + + @Test + public void providersForServices() throws Throwable { + if (!hasJmods()) return; + + List output = + JLink.run("--module-path", MODULE_PATH, + "--add-modules", "m1", + "--suggest-providers", + "java.nio.charset.spi.CharsetProvider,p1.S,p2.T").output(); + + System.out.println(output); + List expected = List.of( + "module jdk.charsets provides java.nio.charset.spi.CharsetProvider, used by java.base", + "module m1 provides p1.S, used by m1", + "module m2 provides p1.S, used by m1", + "module m2 provides p2.T, used by m2", + "module m3 provides p2.T, used by m2" + ); + + assertTrue(output.containsAll(expected)); + } + + @Test + public void unusedService() throws Throwable { + if (!hasJmods()) return; + + List output = + JLink.run("--module-path", MODULE_PATH, + "--add-modules", "m1", + "--suggest-providers", + "nonExistentType").output(); + + System.out.println(output); + List expected = List.of( + "Services specified in --suggest-providers not used: nonExistentType" + ); + + assertTrue(output.containsAll(expected)); + } + + @Test + public void noSuggestProviders() throws Throwable { + if (!hasJmods()) return; + + List output = + JLink.run("--module-path", MODULE_PATH, + "--add-modules", "m1", + "--bind-services", + "--limit-modules", "m1,m2,m3,java.base", + "--suggest-providers").output(); + + String expected = "--bind-services option is specified. No additional providers suggested."; + assertTrue(output.contains(expected)); + + } + + static class JLink { + static final ToolProvider JLINK_TOOL = ToolProvider.findFirst("jlink") + .orElseThrow(() -> + new RuntimeException("jlink tool not found") + ); + + static JLink run(String... options) { + JLink jlink = new JLink(); + assertTrue(jlink.execute(options) == 0); + return jlink; + } + + final List output = new ArrayList<>(); + private int execute(String... options) { + System.out.println("jlink " + + Stream.of(options).collect(Collectors.joining(" "))); + + StringWriter writer = new StringWriter(); + PrintWriter pw = new PrintWriter(writer); + int rc = JLINK_TOOL.run(pw, pw, options); + System.out.println(writer.toString()); + Stream.of(writer.toString().split("\\v")) + .map(String::trim) + .forEach(output::add); + return rc; + } + + boolean contains(String s) { + return output.contains(s); + } + + List output() { + return output; + } + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/bindservices/src/m1/module-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/jlink/bindservices/src/m1/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module m1 { + exports p1; + uses p1.S; + provides p1.S with p1.Impl; +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/bindservices/src/m1/p1/Impl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/jlink/bindservices/src/m1/p1/Impl.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package p1; + +public class Impl implements S { + public String name() { + return this.getClass().getName(); + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/bindservices/src/m1/p1/Main.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/jlink/bindservices/src/m1/p1/Main.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package p1; + +import java.lang.module.ModuleFinder; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * This tests if JAVA_HOME is linked only with the specified modules. + */ +public class Main { + public static void main(String... args) { + Set modules = ModuleFinder.ofSystem().findAll().stream() + .map(mref -> mref.descriptor().name()) + .filter(mn -> !mn.equals("java.base")) + .collect(Collectors.toSet()); + + Set notLinked = Stream.of(args).filter(mn -> !modules.contains(mn)) + .collect(Collectors.toSet()); + if (!notLinked.isEmpty()) { + throw new RuntimeException("Expected modules not linked in the image: " + + notLinked); + } + Stream.of(args).forEach(modules::remove); + + if (!modules.isEmpty()) { + throw new RuntimeException("Unexpected modules linked in the image: " + + modules); + } + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/bindservices/src/m1/p1/S.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/jlink/bindservices/src/m1/p1/S.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package p1; + +public interface S { + String name(); +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/bindservices/src/m2/module-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/jlink/bindservices/src/m2/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module m2 { + requires m1; + exports p2; + uses p2.T; + provides p1.S with p2.Impl; + provides p2.T with p2.Impl; +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/bindservices/src/m2/p2/Impl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/jlink/bindservices/src/m2/p2/Impl.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package p2; + +public class Impl implements p1.S, T { + public String name() { + return this.getClass().getName(); + } + + public void run() { + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/bindservices/src/m2/p2/T.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/jlink/bindservices/src/m2/p2/T.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package p2; + +public interface T { + void run(); +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/bindservices/src/m3/module-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/jlink/bindservices/src/m3/module-info.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module m3 { + requires m2; + provides p2.T with p3.Impl; +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/bindservices/src/m3/p3/Impl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/jlink/bindservices/src/m3/p3/Impl.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package p3; + +public class Impl implements p2.T { + public void run() { + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/plugins/SystemModuleDescriptors/CompiledVersionTest.java --- a/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/CompiledVersionTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/CompiledVersionTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -81,9 +81,13 @@ Path msrc = SRC_DIR.resolve(mn); if (version.equals("0")) { assertTrue(CompilerUtils.compile(msrc, MODS_DIR, + "--add-exports", "java.base/jdk.internal.module=m1", + "--add-exports", "java.base/jdk.internal.org.objectweb.asm=m1", "--module-source-path", SRC_DIR.toString())); } else { assertTrue(CompilerUtils.compile(msrc, MODS_DIR, + "--add-exports", "java.base/jdk.internal.module=m1", + "--add-exports", "java.base/jdk.internal.org.objectweb.asm=m1", "--module-source-path", SRC_DIR.toString(), "--module-version", version)); } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/plugins/SystemModuleDescriptors/SystemModulesTest.java --- a/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/SystemModulesTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/SystemModulesTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -25,6 +25,8 @@ import java.lang.module.ModuleDescriptor.*; import java.lang.module.ModuleFinder; import java.lang.module.ModuleReference; +import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -40,7 +42,11 @@ /** * @test * @bug 8142968 8173381 + * @library /lib/testlibrary * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.module + * @modules java.base/jdk.internal.org.objectweb.asm + * @build ModuleTargetHelper * @run testng SystemModulesTest * @summary Verify the properties of ModuleDescriptor created * by SystemModules @@ -62,7 +68,6 @@ return; ModuleFinder.ofSystem().findAll().stream() - .map(ModuleReference::descriptor) .forEach(this::checkAttributes); } @@ -72,9 +77,7 @@ if (name.equals(OS_NAME)) return true; - if (OS_NAME.equals("Mac OS X")) { - return name.equals("Darwin"); - } else if (OS_NAME.startsWith("Windows")) { + if (OS_NAME.startsWith("Windows")) { return name.startsWith("Windows"); } else { System.err.println("ERROR: " + name + " but expected: " + OS_NAME); @@ -89,28 +92,28 @@ switch (OS_ARCH) { case "i386": case "x86": - return name.equals("i586"); + return name.equals("x86"); + case "amd64": + return name.equals("x86_64"); default: System.err.println("ERROR: " + name + " but expected: " + OS_ARCH); return false; } } - private void checkAttributes(ModuleDescriptor md) { - System.out.format("%s %s %s %s%n", md.name(), - md.osName(), md.osArch(), md.osVersion()); - - if (md.name().equals("java.base")) { - assertTrue(checkOSName(md.osName().get())); - assertTrue(checkOSArch(md.osArch().get())); - assertTrue(md.osVersion().isPresent()); - } else { - // target platform attribute is dropped by jlink plugin - assertFalse(md.osName().isPresent()); - assertFalse(md.osArch().isPresent()); - assertFalse(md.osVersion().isPresent()); - assertTrue(md.packages().size() > 0 - || EMPTY_MODULES.contains(md.name()), md.name()); + private void checkAttributes(ModuleReference modRef) { + try { + if (modRef.descriptor().name().equals("java.base")) { + ModuleTargetHelper.ModuleTarget mt = ModuleTargetHelper.read(modRef); + assertTrue(checkOSName(mt.osName())); + assertTrue(checkOSArch(mt.osArch())); + } else { + // target platform attribute is dropped by jlink plugin for other modules + ModuleTargetHelper.ModuleTarget mt = ModuleTargetHelper.read(modRef); + assertTrue(mt == null || (mt.osName() == null && mt.osArch() == null)); + } + } catch (IOException exp) { + throw new UncheckedIOException(exp); } } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/plugins/SystemModuleDescriptors/UserModuleTest.java --- a/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/UserModuleTest.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/UserModuleTest.java Wed Jul 05 23:09:40 2017 +0200 @@ -38,7 +38,6 @@ import static jdk.testlibrary.ProcessTools.*; - import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import static org.testng.Assert.*; @@ -48,7 +47,9 @@ * @bug 8142968 8173381 8174740 * @library /lib/testlibrary * @modules jdk.compiler jdk.jlink - * @build UserModuleTest CompilerUtils jdk.testlibrary.FileUtils jdk.testlibrary.ProcessTools + * @modules java.base/jdk.internal.module + * @modules java.base/jdk.internal.org.objectweb.asm + * @build ModuleTargetHelper UserModuleTest CompilerUtils jdk.testlibrary.FileUtils jdk.testlibrary.ProcessTools * @run testng UserModuleTest */ @@ -85,7 +86,9 @@ for (String mn : modules) { Path msrc = SRC_DIR.resolve(mn); assertTrue(CompilerUtils.compile(msrc, MODS_DIR, - "--module-source-path", SRC_DIR.toString())); + "--module-source-path", SRC_DIR.toString(), + "--add-exports", "java.base/jdk.internal.module=" + mn, + "--add-exports", "java.base/jdk.internal.org.objectweb.asm=" + mn)); } if (Files.exists(IMAGE)) { @@ -106,7 +109,10 @@ if (!hasJmods()) return; Path java = IMAGE.resolve("bin").resolve("java"); - assertTrue(executeProcess(java.toString(), "-m", MAIN_MID) + assertTrue(executeProcess(java.toString(), + "--add-exports", "java.base/jdk.internal.module=m1,m4", + "--add-exports", "java.base/jdk.internal.org.objectweb.asm=m1,m4", + "-m", MAIN_MID) .outputTo(System.out) .errorTo(System.out) .getExitValue() == 0); @@ -136,6 +142,8 @@ Path java = IMAGE.resolve("bin").resolve("java"); assertTrue(executeProcess(java.toString(), + "--add-exports", "java.base/jdk.internal.module=m1,m4", + "--add-exports", "java.base/jdk.internal.org.objectweb.asm=m1,m4", "-Djdk.system.module.finder.disabledFastPath", "-m", MAIN_MID) .outputTo(System.out) @@ -154,7 +162,10 @@ Path dir = Paths.get("dedupSetTest"); createImage(dir, "m1", "m2", "m3", "m4"); Path java = dir.resolve("bin").resolve("java"); - assertTrue(executeProcess(java.toString(), "-m", MAIN_MID) + assertTrue(executeProcess(java.toString(), + "--add-exports", "java.base/jdk.internal.module=m1,m4", + "--add-exports", "java.base/jdk.internal.org.objectweb.asm=m1,m4", + "-m", MAIN_MID) .outputTo(System.out) .errorTo(System.out) .getExitValue() == 0); @@ -205,11 +216,13 @@ } private void createJmods(String... modules) throws IOException { - // use the same target platform as in java.base - ModuleDescriptor md = Layer.boot().findModule("java.base").get() - .getDescriptor(); - String osName = md.osName().get(); - String osArch = md.osArch().get(); + ModuleTargetHelper.ModuleTarget mt = ModuleTargetHelper.getJavaBaseTarget(); + if (mt == null) { + throw new RuntimeException("ModuleTarget is missing for java.base"); + } + + String osName = mt.osName(); + String osArch = mt.osArch(); // create JMOD files Files.createDirectories(JMODS_DIR); @@ -246,6 +259,8 @@ // verify ModuleDescriptor Path java = dir.resolve("bin").resolve("java"); assertTrue(executeProcess(java.toString(), + "--add-exports", "java.base/jdk.internal.module=m1,m4", + "--add-exports", "java.base/jdk.internal.org.objectweb.asm=m1,m4", "--add-modules=m1", "-m", "m4") .outputTo(System.out) .errorTo(System.out) @@ -275,6 +290,8 @@ // verify ModuleDescriptor Path java = dir.resolve("bin").resolve("java"); assertTrue(executeProcess(java.toString(), + "--add-exports", "java.base/jdk.internal.module=m1,m4", + "--add-exports", "java.base/jdk.internal.org.objectweb.asm=m1,m4", "--add-modules=m1", "-m", "m4", "retainModuleTarget") .outputTo(System.out) .errorTo(System.out) diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/plugins/SystemModuleDescriptors/src/m1/p1/Main.java --- a/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/src/m1/p1/Main.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/src/m1/p1/Main.java Wed Jul 05 23:09:40 2017 +0200 @@ -23,6 +23,7 @@ package p1; +import java.io.InputStream; import java.io.IOException; import java.lang.module.ModuleDescriptor; import java.lang.reflect.Layer; @@ -35,7 +36,38 @@ import java.util.Collections; import java.util.Set; +import jdk.internal.module.ClassFileAttributes; +import jdk.internal.module.ClassFileAttributes.ModuleTargetAttribute; +import jdk.internal.module.ClassFileConstants; +import jdk.internal.org.objectweb.asm.Attribute; +import jdk.internal.org.objectweb.asm.ClassReader; +import jdk.internal.org.objectweb.asm.ClassVisitor; +import jdk.internal.org.objectweb.asm.Opcodes; + public class Main { + private static boolean hasModuleTarget(InputStream in) throws IOException { + ModuleTargetAttribute[] modTargets = new ModuleTargetAttribute[1]; + ClassVisitor cv = new ClassVisitor(Opcodes.ASM5) { + @Override + public void visitAttribute(Attribute attr) { + if (attr instanceof ModuleTargetAttribute) { + modTargets[0] = (ModuleTargetAttribute)attr; + } + } + }; + + // prototype of attributes that should be parsed + Attribute[] attrs = new Attribute[] { + new ModuleTargetAttribute() + }; + + // parse module-info.class + ClassReader cr = new ClassReader(in); + cr.accept(cv, attrs, 0); + return modTargets[0] != null && + (modTargets[0].osName() != null || modTargets[0].osArch() != null); + } + public static void main(String... args) throws Exception { // load another package p2.T.test(); @@ -44,12 +76,13 @@ validate(Main.class.getModule()); // validate the Moduletarget attribute for java.base - ModuleDescriptor md = Layer.boot().findModule("java.base").get() - .getDescriptor(); - if (!md.osName().isPresent() || !md.osArch().isPresent() || - !md.osVersion().isPresent()) { - throw new RuntimeException("java.base: " + md.osName() + " " + - md.osArch() + " " + md.osVersion()); + FileSystem fs = FileSystems.newFileSystem(URI.create("jrt:/"), + Collections.emptyMap()); + Path path = fs.getPath("/", "modules", "java.base", "module-info.class"); + try (InputStream in = Files.newInputStream(path)) { + if (! hasModuleTarget(in)) { + throw new RuntimeException("Missing ModuleTarget for java.base"); + } } } @@ -67,9 +100,9 @@ checkPackages(md.packages(), "p1", "p2"); checkPackages(md1.packages(), "p1", "p2"); - // check ModuleTarget attribute - checkModuleTargetAttribute(md); - checkModuleTargetAttribute(md1); + try (InputStream in = Files.newInputStream(path)) { + checkModuleTargetAttribute(in, "p1"); + } } static void checkPackages(Set pkgs, String... expected) { @@ -78,10 +111,9 @@ } } - static void checkModuleTargetAttribute(ModuleDescriptor md) { - if (md.osName().isPresent() || md.osArch().isPresent() || - md.osVersion().isPresent()) { - throw new RuntimeException(md.osName() + " " + md.osArch() + " " + md.osVersion()); + static void checkModuleTargetAttribute(InputStream in, String modName) throws IOException { + if (hasModuleTarget(in)) { + throw new RuntimeException("ModuleTarget present for " + modName); } } } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/jlink/plugins/SystemModuleDescriptors/src/m4/p4/Main.java --- a/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/src/m4/p4/Main.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/src/m4/p4/Main.java Wed Jul 05 23:09:40 2017 +0200 @@ -36,7 +36,47 @@ import java.util.Collections; import java.util.Set; +import jdk.internal.module.ClassFileAttributes; +import jdk.internal.module.ClassFileAttributes.ModuleTargetAttribute; +import jdk.internal.module.ClassFileConstants; +import jdk.internal.org.objectweb.asm.Attribute; +import jdk.internal.org.objectweb.asm.ClassReader; +import jdk.internal.org.objectweb.asm.ClassVisitor; +import jdk.internal.org.objectweb.asm.Opcodes; + public class Main { + private static boolean hasModuleTarget(InputStream in) throws IOException { + ModuleTargetAttribute[] modTargets = new ModuleTargetAttribute[1]; + ClassVisitor cv = new ClassVisitor(Opcodes.ASM5) { + @Override + public void visitAttribute(Attribute attr) { + if (attr instanceof ModuleTargetAttribute) { + modTargets[0] = (ModuleTargetAttribute)attr; + } + } + }; + + // prototype of attributes that should be parsed + Attribute[] attrs = new Attribute[] { + new ModuleTargetAttribute() + }; + + // parse module-info.class + ClassReader cr = new ClassReader(in); + cr.accept(cv, attrs, 0); + return modTargets[0] != null && + (modTargets[0].osName() != null || modTargets[0].osArch() != null); + } + + private static boolean hasModuleTarget(String modName) throws IOException { + FileSystem fs = FileSystems.newFileSystem(URI.create("jrt:/"), + Collections.emptyMap()); + Path path = fs.getPath("/", "modules", modName, "module-info.class"); + try (InputStream in = Files.newInputStream(path)) { + return hasModuleTarget(in); + } + } + // the system module plugin by default drops ModuleTarget attribute private static boolean expectModuleTarget = false; public static void main(String... args) throws IOException { @@ -49,13 +89,8 @@ } // java.base is packaged with osName/osArch/osVersion - ModuleDescriptor md = Layer.boot().findModule("java.base").get() - .getDescriptor(); - if (!md.osName().isPresent() || - !md.osArch().isPresent() || - !md.osVersion().isPresent()) { - throw new RuntimeException("osName/osArch/osVersion is missing: " + - md.osName() + " " + md.osArch() + " " + md.osVersion()); + if (! hasModuleTarget("java.base")) { + throw new RuntimeException("ModuleTarget absent for java.base"); } // verify module-info.class for m1 and m4 @@ -82,7 +117,7 @@ checkModuleDescriptor(ModuleDescriptor.read(Files.newInputStream(path)), packages); } - static void checkModuleDescriptor(ModuleDescriptor md, String... packages) { + static void checkModuleDescriptor(ModuleDescriptor md, String... packages) throws IOException { String mainClass = md.name().replace('m', 'p') + ".Main"; if (!md.mainClass().get().equals(mainClass)) { throw new RuntimeException(md.mainClass().toString()); @@ -90,22 +125,16 @@ if (expectModuleTarget) { // ModuleTarget attribute is retained - if (!md.osName().isPresent() || !md.osArch().isPresent()) { - throw new RuntimeException("osName or osArch is missing: " + - md.osName() + " " + md.osArch()); + if (! hasModuleTarget(md.name())) { + throw new RuntimeException("ModuleTarget missing for " + md.name()); } } else { // by default ModuleTarget attribute is dropped - if (md.osName().isPresent() || md.osArch().isPresent()) { - throw new RuntimeException("osName and osArch should not be set: " + - md.osName() + " " + md.osArch()); + if (hasModuleTarget(md.name())) { + throw new RuntimeException("ModuleTarget present for " + md.name()); } } - if (md.osVersion().isPresent()) { - throw new RuntimeException("Expected no osVersion set: " + md.osVersion()); - } - Set pkgs = md.packages(); if (!pkgs.equals(Set.of(packages))) { throw new RuntimeException(pkgs + " expected: " + Set.of(packages)); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java --- a/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/launcher/modules/addexports/AddExportsTestWarningError.java Wed Jul 05 23:09:40 2017 +0200 @@ -134,16 +134,16 @@ return new Object[][]{ // source not found - {"DoesNotExist/p=m1", "WARNING: Unknown module: DoesNotExist specified in --add-exports"}, + {"DoesNotExist/p=m1", "WARNING: Unknown module: DoesNotExist specified to --add-exports"}, {"m1/DoesNotExist=m2", "WARNING: package DoesNotExist not in m1"}, // target not found - {"m1/p1=DoesNotExist", "WARNING: Unknown module: DoesNotExist specified in --add-exports"}, + {"m1/p1=DoesNotExist", "WARNING: Unknown module: DoesNotExist specified to --add-exports"}, // bad names - {"m*/p1=m2", "WARNING: Unknown module: m* specified in --add-exports"}, + {"m*/p1=m2", "WARNING: Unknown module: m* specified to --add-exports"}, {"m1/p!=m2", "WARNING: package p! not in m1"}, - {"m1/p1=m!", "WARNING: Unknown module: m! specified in --add-exports"}, + {"m1/p1=m!", "WARNING: Unknown module: m! specified to --add-exports"}, }; } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java --- a/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/launcher/modules/addreads/AddReadsTestWarningError.java Wed Jul 05 23:09:40 2017 +0200 @@ -168,14 +168,14 @@ return new Object[][]{ // source not found - {"DoesNotExist=m2", "WARNING: Unknown module: DoesNotExist specified in --add-reads"}, + {"DoesNotExist=m2", "WARNING: Unknown module: DoesNotExist specified to --add-reads"}, // target not found - {"m2=DoesNotExist", "WARNING: Unknown module: DoesNotExist specified in --add-reads"}, + {"m2=DoesNotExist", "WARNING: Unknown module: DoesNotExist specified to --add-reads"}, // bad names - {"m*=m2", "WARNING: Unknown module: m* specified in --add-reads"}, - {"m2=m!", "WARNING: Unknown module: m! specified in --add-reads"}, + {"m*=m2", "WARNING: Unknown module: m* specified to --add-reads"}, + {"m2=m!", "WARNING: Unknown module: m! specified to --add-reads"}, }; } diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/launcher/modules/basic/InitErrors.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/launcher/modules/basic/InitErrors.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @library /lib/testlibrary + * @build InitErrors jdk.testlibrary.* + * @run testng InitErrors + * @summary Basic test to ensure that module system initialization errors + * go the right stream and with the right level of verbosity + */ + + +import java.util.Arrays; +import jdk.testlibrary.ProcessTools; +import jdk.testlibrary.OutputAnalyzer; +import org.testng.annotations.Test; +import static org.testng.Assert.*; + +public class InitErrors { + + // the option to cause module initialization to fail + private static final String ADD_UNKNOWN_MODULE = "--add-modules=XXX"; + + // the expected error message + private static final String UNKNOWN_MODULE_NOT_FOUND= "Module XXX not found"; + + // output expected in the stack trace when using -Xlog:init=debug + private static final String STACK_FRAME = "java.base/java.lang.System.initPhase2"; + + + /** + * Default behavior, send error message to stdout + */ + @Test + public void testDefaultOutput() throws Exception { + expectFail(showVersion(ADD_UNKNOWN_MODULE) + .stdoutShouldContain(UNKNOWN_MODULE_NOT_FOUND) + .stdoutShouldNotContain(STACK_FRAME) + .stderrShouldNotContain(UNKNOWN_MODULE_NOT_FOUND) + .stderrShouldNotContain(STACK_FRAME)); + } + + /** + * -XX:+DisplayVMOutputToStderr should send error message to stderr + */ + @Test + public void testOutputToStderr() throws Exception { + expectFail(showVersion(ADD_UNKNOWN_MODULE, "-XX:+DisplayVMOutputToStderr") + .stdoutShouldNotContain(UNKNOWN_MODULE_NOT_FOUND) + .stdoutShouldNotContain(STACK_FRAME) + .stderrShouldContain(UNKNOWN_MODULE_NOT_FOUND) + .stderrShouldNotContain(STACK_FRAME)); + } + + /** + * -Xlog:init=debug should print stack trace to stdout + */ + @Test + public void testStackTrace() throws Exception { + expectFail(showVersion(ADD_UNKNOWN_MODULE, "-Xlog:init=debug") + .stdoutShouldContain(UNKNOWN_MODULE_NOT_FOUND) + .stdoutShouldContain(STACK_FRAME) + .stderrShouldNotContain(UNKNOWN_MODULE_NOT_FOUND) + .stderrShouldNotContain(STACK_FRAME)); + } + + /** + * -Xlog:init=debug -XX:+DisplayVMOutputToStderr should print stack trace + * to stderr + */ + @Test + public void testStackTraceToStderr() throws Exception { + expectFail(showVersion(ADD_UNKNOWN_MODULE, + "-Xlog:init=debug", + "-XX:+DisplayVMOutputToStderr") + .stdoutShouldNotContain(UNKNOWN_MODULE_NOT_FOUND) + .stdoutShouldNotContain(STACK_FRAME) + .stderrShouldContain(UNKNOWN_MODULE_NOT_FOUND) + .stderrShouldContain(STACK_FRAME)); + } + + private OutputAnalyzer showVersion(String... args) throws Exception { + int len = args.length; + args = Arrays.copyOf(args, len+1); + args[len] = "-version"; + return ProcessTools.executeTestJava(args) + .outputTo(System.out) + .errorTo(System.out); + } + + private void expectFail(OutputAnalyzer output) { + assertFalse(output.getExitValue() == 0); + } + +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/launcher/modules/patch/basic/PatchTestWarningError.java --- a/jdk/test/tools/launcher/modules/patch/basic/PatchTestWarningError.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/launcher/modules/patch/basic/PatchTestWarningError.java Wed Jul 05 23:09:40 2017 +0200 @@ -179,7 +179,7 @@ "-m", "test/jdk.test.Main", arg) .outputTo(System.out) .errorTo(System.out) - .shouldContain("WARNING: Unknown module: DoesNotExist specified in --patch-module") + .shouldContain("WARNING: Unknown module: DoesNotExist specified to --patch-module") .getExitValue(); assertTrue(exitValue == 0); diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/launcher/modules/permit/AttemptAccess.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/launcher/modules/permit/AttemptAccess.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +/** + * Launched by PermitIllegalAccess to attempt illegal access. + */ + +public class AttemptAccess { + + public static void main(String[] args) throws Exception { + String action = args[0]; + int count = Integer.parseInt(args[1]); + + for (int i=0; i clazz = Class.forName("sun.security.x509.X500Name"); + Constructor ctor = clazz.getConstructor(String.class); + Object name = ctor.newInstance("CN=user"); + } + + static void trySetAccessible() throws Exception { + Method find = ClassLoader.class.getDeclaredMethod("findClass", String.class); + find.setAccessible(true); + } + + static void tryTrySetAccessible() throws Exception { + Method find = ClassLoader.class.getDeclaredMethod("findClass", String.class); + find.trySetAccessible(); + } + +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/launcher/modules/permit/PermitIllegalAccess.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/tools/launcher/modules/permit/PermitIllegalAccess.java Wed Jul 05 23:09:40 2017 +0200 @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @library /lib/testlibrary + * @build PermitIllegalAccess AttemptAccess jdk.testlibrary.* + * @run testng PermitIllegalAccess + * @summary Basic test for java --permit-illegal-access + */ + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +import jdk.testlibrary.ProcessTools; +import jdk.testlibrary.OutputAnalyzer; + +import org.testng.annotations.Test; +import static org.testng.Assert.*; + +/** + * Basic test of --permit-illegal-access to ensure that it permits access + * via core reflection and setAccessible/trySetAccessible. + */ + +@Test +public class PermitIllegalAccess { + + static final String TEST_CLASSES = System.getProperty("test.classes"); + static final String TEST_MAIN = "AttemptAccess"; + + static final String WARNING = "WARNING"; + static final String STARTUP_WARNING = + "WARNING: --permit-illegal-access will be removed in the next major release"; + static final String ILLEGAL_ACCESS_WARNING = + "WARNING: Illegal access by " + TEST_MAIN; + + /** + * Launches AttemptAccess to execute an action, returning the OutputAnalyzer + * to analyze the output/exitCode. + */ + private OutputAnalyzer tryAction(String action, int count, String... args) + throws Exception + { + Stream s1 = Stream.of(args); + Stream s2 = Stream.of("-cp", TEST_CLASSES, TEST_MAIN, action, "" + count); + String[] opts = Stream.concat(s1, s2).toArray(String[]::new); + return ProcessTools.executeTestJava(opts) + .outputTo(System.out) + .errorTo(System.out); + } + + /** + * Launches AttemptAccess with --permit-illegal-access to execute an action, + * returning the OutputAnalyzer to analyze the output/exitCode. + */ + private OutputAnalyzer tryActionPermittingIllegalAccess(String action, int count) + throws Exception + { + return tryAction(action, count, "--permit-illegal-access"); + } + + /** + * Sanity check to ensure that IllegalAccessException is thrown. + */ + public void testAccessFail() throws Exception { + int exitValue = tryAction("access", 1) + .stdoutShouldNotContain(WARNING) + .stdoutShouldNotContain("IllegalAccessException") + .stderrShouldNotContain(WARNING) + .stderrShouldContain("IllegalAccessException") + .getExitValue(); + assertTrue(exitValue != 0); + } + + /** + * Sanity check to ensure that InaccessibleObjectException is thrown. + */ + public void testSetAccessibleFail() throws Exception { + int exitValue = tryAction("setAccessible", 1) + .stdoutShouldNotContain(WARNING) + .stdoutShouldNotContain("InaccessibleObjectException") + .stderrShouldNotContain(WARNING) + .stderrShouldContain("InaccessibleObjectException") + .getExitValue(); + assertTrue(exitValue != 0); + } + + /** + * Permit illegal access to succeed + */ + public void testAccessPermitted() throws Exception { + tryActionPermittingIllegalAccess("access", 1) + .stdoutShouldNotContain(WARNING) + .stdoutShouldNotContain("IllegalAccessException") + .stderrShouldContain(STARTUP_WARNING) + .stderrShouldNotContain("IllegalAccessException") + .stderrShouldContain(ILLEGAL_ACCESS_WARNING) + .shouldHaveExitValue(0); + } + + /** + * Permit repeated illegal access to succeed + */ + public void testRepeatedAccessPermitted() throws Exception { + OutputAnalyzer outputAnalyzer = tryActionPermittingIllegalAccess("access", 10) + .stdoutShouldNotContain(WARNING) + .stdoutShouldNotContain("IllegalAccessException") + .stderrShouldContain(STARTUP_WARNING) + .stderrShouldNotContain("IllegalAccessException") + .stderrShouldContain(ILLEGAL_ACCESS_WARNING) + .shouldHaveExitValue(0);; + + // should only have one illegal access warning + assertTrue(containsCount(outputAnalyzer.asLines(), ILLEGAL_ACCESS_WARNING) == 1); + } + + /** + * Permit setAccessible to succeed + */ + public void testSetAccessiblePermitted() throws Exception { + tryActionPermittingIllegalAccess("setAccessible", 1) + .stdoutShouldNotContain(WARNING) + .stdoutShouldNotContain("InaccessibleObjectException") + .stderrShouldContain(STARTUP_WARNING) + .stderrShouldNotContain("InaccessibleObjectException") + .stderrShouldContain(ILLEGAL_ACCESS_WARNING) + .shouldHaveExitValue(0); + } + + /** + * Permit repeated calls to setAccessible to succeed + */ + public void testRepeatedSetAccessiblePermitted() throws Exception { + OutputAnalyzer outputAnalyzer = tryActionPermittingIllegalAccess("setAccessible", 10) + .stdoutShouldNotContain(WARNING) + .stdoutShouldNotContain("InaccessibleObjectException") + .stderrShouldContain(STARTUP_WARNING) + .stderrShouldNotContain("InaccessibleObjectException") + .stderrShouldContain(ILLEGAL_ACCESS_WARNING) + .shouldHaveExitValue(0); + + // should only have one illegal access warning + assertTrue(containsCount(outputAnalyzer.asLines(), ILLEGAL_ACCESS_WARNING) == 1); + } + + /** + * Permit trySetAccessible to succeed + */ + public void testTrySetAccessiblePermitted() throws Exception { + tryActionPermittingIllegalAccess("trySetAccessible", 1) + .stdoutShouldNotContain(WARNING) + .stderrShouldContain(STARTUP_WARNING) + .stderrShouldContain(ILLEGAL_ACCESS_WARNING) + .shouldHaveExitValue(0); + } + + /** + * Permit repeated calls to trySetAccessible to succeed + */ + public void testRepeatedTrySetAccessiblePermitted() throws Exception { + OutputAnalyzer outputAnalyzer = tryActionPermittingIllegalAccess("trySetAccessible", 10) + .stdoutShouldNotContain(WARNING) + .stdoutShouldNotContain("InaccessibleObjectException") + .stderrShouldContain(STARTUP_WARNING) + .stderrShouldNotContain("InaccessibleObjectException") + .stderrShouldContain(ILLEGAL_ACCESS_WARNING) + .shouldHaveExitValue(0); + + // should only have one illegal access warning + assertTrue(containsCount(outputAnalyzer.asLines(), ILLEGAL_ACCESS_WARNING) == 1); + + } + + /** + * Permit access to succeed with --add-exports. No warning should be printed. + */ + public void testAccessWithAddExports() throws Exception { + tryAction("access", 1, "--add-exports", "java.base/sun.security.x509=ALL-UNNAMED") + .stdoutShouldNotContain(WARNING) + .stdoutShouldNotContain("IllegalAccessException") + .stderrShouldNotContain(WARNING) + .stderrShouldNotContain("IllegalAccessException") + .shouldHaveExitValue(0); + } + + /** + * Permit access to succeed with --add-exports and --permit-illegal-access. + * The only warning emitted should be the startup warning. + */ + public void testAccessWithePermittedAddExports() throws Exception { + tryAction("access", 1, "--permit-illegal-access", + "--add-exports", "java.base/sun.security.x509=ALL-UNNAMED") + .stdoutShouldNotContain(WARNING) + .stdoutShouldNotContain("IllegalAccessException") + .stderrShouldContain(STARTUP_WARNING) + .stderrShouldNotContain("IllegalAccessException") + .stderrShouldNotContain(ILLEGAL_ACCESS_WARNING) + .shouldHaveExitValue(0); + } + + /** + * Permit setAccessible to succeed with --add-opens. No warning should be printed. + */ + public void testSetAccessibleWithAddOpens() throws Exception { + tryAction("setAccessible", 1, "--add-opens", "java.base/java.lang=ALL-UNNAMED") + .stdoutShouldNotContain(WARNING) + .stdoutShouldNotContain("InaccessibleObjectException") + .stderrShouldNotContain(WARNING) + .stderrShouldNotContain("InaccessibleObjectException") + .shouldHaveExitValue(0); + } + + /** + * Permit setAccessible to succeed with both --add-opens and --permit-illegal-access. + * The only warning emitted should be the startup warning. + */ + public void testSetAccessiblePermittedWithAddOpens() throws Exception { + tryAction("setAccessible", 1, "--permit-illegal-access", + "--add-opens", "java.base/java.lang=ALL-UNNAMED") + .stdoutShouldNotContain(WARNING) + .stdoutShouldNotContain("InaccessibleObjectException") + .stderrShouldContain(STARTUP_WARNING) + .stderrShouldNotContain("InaccessibleObjectException") + .stderrShouldNotContain(ILLEGAL_ACCESS_WARNING) + .shouldHaveExitValue(0); + } + + + /** + * Returns the number of lines in the given input that contain the + * given char sequence. + */ + private int containsCount(List lines, CharSequence cs) { + int count = 0; + for (String line : lines) { + if (line.contains(cs)) count++; + } + return count; + } +} diff -r 18569c523d38 -r c61cc8a34456 jdk/test/tools/pack200/pack200-verifier/src/xmlkit/ClassReader.java --- a/jdk/test/tools/pack200/pack200-verifier/src/xmlkit/ClassReader.java Sat Apr 08 03:25:14 2017 +0000 +++ b/jdk/test/tools/pack200/pack200-verifier/src/xmlkit/ClassReader.java Wed Jul 05 23:09:40 2017 +0200 @@ -1544,7 +1544,6 @@ Element e = new Element(x.getCpString(attr.attribute_name_index)); e.add(x.getCpString(attr.os_name_index)); e.add(x.getCpString(attr.os_arch_index)); - e.add(x.getCpString(attr.os_version_index)); e.trimToSize(); p.add(e); return null; diff -r 18569c523d38 -r c61cc8a34456 make/CreateJmods.gmk --- a/make/CreateJmods.gmk Sat Apr 08 03:25:14 2017 +0000 +++ b/make/CreateJmods.gmk Wed Jul 05 23:09:40 2017 +0200 @@ -135,9 +135,8 @@ $(RM) $@ $(JMODS_TEMPDIR)/$(notdir $@) $(JMOD) create \ --module-version $(VERSION_SHORT) \ - --os-name $(REQUIRED_OS_NAME) \ - --os-arch $(OPENJDK_TARGET_CPU_LEGACY) \ - --os-version $(REQUIRED_OS_VERSION) \ + --os-name '$(REQUIRED_OS_NAME)' \ + --os-arch '$(REQUIRED_OS_ARCH)' \ --module-path $(JMODS_DIR) \ --exclude '**{_the.*,_*.marker,*.diz,*.debuginfo,*.dSYM/**,*.dSYM,*.pdb,*.map}' \ $(JMOD_FLAGS) $(JMODS_TEMPDIR)/$(notdir $@) diff -r 18569c523d38 -r c61cc8a34456 make/Images.gmk --- a/make/Images.gmk Sat Apr 08 03:25:14 2017 +0000 +++ b/make/Images.gmk Wed Jul 05 23:09:40 2017 +0200 @@ -119,6 +119,7 @@ --module-path $(IMAGES_OUTPUTDIR)/jmods \ --endian $(OPENJDK_BUILD_CPU_ENDIAN) \ --release-info $(BASE_RELEASE_FILE) \ + --release-info add:OS_VERSION=\"$(REQUIRED_OS_VERSION)\" \ --order-resources=$(call CommaList, $(JLINK_ORDER_RESOURCES)) \ --dedup-legal-notices=error-if-not-same-content \ $(JLINK_JLI_CLASSES) \ diff -r 18569c523d38 -r c61cc8a34456 make/Init.gmk --- a/make/Init.gmk Sat Apr 08 03:25:14 2017 +0000 +++ b/make/Init.gmk Wed Jul 05 23:09:40 2017 +0200 @@ -117,7 +117,7 @@ # Check that CONF_CHECK is valid. $(eval $(call ParseConfCheckOption)) - # Check that the LOG given is valid, and set LOG_LEVEL, LOG_NOFILE and MAKE_LOG_FLAGS. + # Check that the LOG given is valid, and set LOG_LEVEL, LOG_NOFILE, MAKE_LOG_VARS and MAKE_LOG_FLAGS. $(eval $(call ParseLogLevel)) # After this SPECS contain 1..N spec files (otherwise ParseConfAndSpec fails). @@ -171,7 +171,7 @@ MAKE_INIT_WITH_SPEC_ARGUMENTS := ACTUAL_TOPDIR=$(topdir) \ USER_MAKE_VARS="$(USER_MAKE_VARS)" MAKE_LOG_FLAGS=$(MAKE_LOG_FLAGS) \ - LOG_LEVEL=$(LOG_LEVEL) LOG_NOFILE=$(LOG_NOFILE) LOG_CMDLINES=$(LOG_CMDLINES) \ + $(MAKE_LOG_VARS) \ INIT_TARGETS="$(INIT_TARGETS)" \ SEQUENTIAL_TARGETS="$(SEQUENTIAL_TARGETS)" \ PARALLEL_TARGETS="$(PARALLEL_TARGETS)" @@ -319,6 +319,7 @@ exit 1 ; \ fi $(PRINTF) "Finished building $(TARGET_DESCRIPTION)\n" $(BUILD_LOG_PIPE) + $(call ReportProfileTimes) endif on-failure: @@ -327,6 +328,7 @@ $(call ReportBuildTimes) $(call PrintFailureReports) $(call PrintBuildLogFailures) + $(call ReportProfileTimes) $(PRINTF) "Hint: If caused by a warning, try configure --disable-warnings-as-errors.\n\n" ifneq ($(COMPARE_BUILD), ) $(call CleanupCompareBuild) diff -r 18569c523d38 -r c61cc8a34456 make/InitSupport.gmk --- a/make/InitSupport.gmk Sat Apr 08 03:25:14 2017 +0000 +++ b/make/InitSupport.gmk Wed Jul 05 23:09:40 2017 +0200 @@ -158,6 +158,18 @@ # If the "cmdline" argument is given, act on it and strip it away $$(eval $$(call ParseLogOption, cmdlines, LOG_CMDLINES)) + # If the "profile-to-log" argument is given, write shell times in build log + $$(eval $$(call ParseLogOption, profile-to-log, LOG_PROFILE_TIMES_LOG)) + + # If the "profile" argument is given, write shell times in separate log file + # IMPORTANT: $(ParseLogOption profile-to-log) should go first. Otherwise + # parsing of 'LOG=debug,profile-to-log,nofile' ends up in the following error: + # Error: LOG contains unknown option or log level: debug-to-log. + $$(eval $$(call ParseLogOption, profile, LOG_PROFILE_TIMES_FILE)) + + # Treat LOG=profile-to-log as if it were LOG=profile,profile-to-log + LOG_PROFILE_TIMES_FILE := $$(firstword $$(LOG_PROFILE_TIMES_FILE) $$(LOG_PROFILE_TIMES_LOG)) + LOG_LEVEL := $$(LOG) ifeq ($$(LOG_LEVEL),) @@ -175,7 +187,7 @@ MAKE_LOG_FLAGS := else $$(info Error: LOG contains unknown option or log level: $$(LOG).) - $$(info LOG can be [,[...]] where is nofile | cmdlines) + $$(info LOG can be [,[...]] where is nofile | cmdlines | profile | profile-to-log) $$(info and is warn | info | debug | trace) $$(error Cannot continue) endif @@ -309,7 +321,7 @@ @( cd $$(topdir) && \ $$(MAKE) $$(MAKE_LOG_FLAGS) -r -R -f $$(topdir)/make/Main.gmk \ -I $$(topdir)/make/common SPEC=$(strip $2) NO_RECIPES=true \ - LOG_LEVEL=$$(LOG_LEVEL) \ + $$(MAKE_LOG_VARS) \ create-main-targets-include ) # Now include main-targets.gmk. This will define ALL_MAIN_TARGETS. @@ -334,7 +346,7 @@ # Define basic logging setup BUILD_LOG := $(OUTPUT_ROOT)/build.log - BUILD_TRACE_LOG := $(OUTPUT_ROOT)/build-trace-time.log + BUILD_PROFILE_LOG := $(OUTPUT_ROOT)/build-profile.log BUILD_LOG_PIPE := > >($(TEE) -a $(BUILD_LOG)) 2> >($(TEE) -a $(BUILD_LOG) >&2) && wait @@ -494,9 +506,9 @@ define RotateLogFiles $(RM) $(BUILD_LOG).old 2> /dev/null && \ $(MV) $(BUILD_LOG) $(BUILD_LOG).old 2> /dev/null || true - $(if $(findstring trace, $(LOG_LEVEL)), \ - $(RM) $(BUILD_TRACE_LOG).old 2> /dev/null && \ - $(MV) $(BUILD_TRACE_LOG) $(BUILD_TRACE_LOG).old 2> /dev/null || true \ + $(if $(findstring true, $(LOG_PROFILE_TIMES_FILE)), \ + $(RM) $(BUILD_PROFILE_LOG).old 2> /dev/null && \ + $(MV) $(BUILD_PROFILE_LOG) $(BUILD_PROFILE_LOG).old 2> /dev/null || true \ ) endef @@ -558,6 +570,22 @@ $(BUILD_LOG_PIPE) endef + define ReportProfileTimes + $(if $(findstring true, $(LOG_PROFILE_TIMES_LOG)), \ + [ ! -f $(BUILD_PROFILE_LOG) ] || \ + { $(ECHO) Begin $(notdir $(BUILD_PROFILE_LOG)) && \ + $(CAT) $(BUILD_PROFILE_LOG) && \ + $(ECHO) End $(notdir $(BUILD_PROFILE_LOG)); \ + } \ + $(BUILD_LOG_PIPE) + ) + endef + endif # HAS_SPEC +MAKE_LOG_VARS = $(foreach v, \ + LOG_LEVEL LOG_NOFILE LOG_CMDLINES LOG_PROFILE_TIMES_LOG LOG_PROFILE_TIMES_FILE, \ + $v=$($v) \ +) + endif # _INITSUPPORT_GMK diff -r 18569c523d38 -r c61cc8a34456 make/Javadoc.gmk --- a/make/Javadoc.gmk Sat Apr 08 03:25:14 2017 +0000 +++ b/make/Javadoc.gmk Wed Jul 05 23:09:40 2017 +0200 @@ -27,6 +27,7 @@ include $(SPEC) include MakeBase.gmk include $(JDK_TOPDIR)/make/Tools.gmk +include $(JDK_TOPDIR)/make/ModuleTools.gmk ################################################################################ @@ -174,6 +175,7 @@ -tag param \ -tag return \ -tag throws \ + -taglet build.tools.taglet.ModuleGraph \ -tag since \ -tag version \ -tag serialData \ @@ -188,6 +190,13 @@ DEFAULT_JAVADOC_OPTIONS := -XDignore.symbol.file=true -use -keywords -notimestamp \ -serialwarn -encoding ISO-8859-1 -breakiterator --system none +# +# TODO: this should be set by the configure option. +# +ifndef ENABLE_MODULE_GRAPH + ENABLE_MODULE_GRAPH=false +endif + ################################################################################ # Setup make rules for running javadoc. # @@ -321,7 +330,8 @@ $$(eval $$(call ListPathsSafely, $1_PACKAGES, $$($1_PACKAGES_FILE))) endif $$(call ExecuteWithLog, $$(SUPPORT_OUTPUTDIR)/docs/$1.javadoc, \ - $$($1_JAVA) -Djava.awt.headless=true $(NEW_JAVADOC) -d $$(@D) \ + $$($1_JAVA) -Djava.awt.headless=true -DenableModuleGraph=$(ENABLE_MODULE_GRAPH) \ + $(NEW_JAVADOC) -d $$(@D) \ $$(DEFAULT_JAVADOC_TAGS) $$(DEFAULT_JAVADOC_OPTIONS) \ --module-source-path $$(call PathList, $$(JAVADOC_SOURCE_DIRS)) \ $$($1_OPTIONS) $$($1_PACKAGES_ARG)) @@ -735,18 +745,34 @@ ZIP_TARGETS += $(JAVADOC_ARCHIVE) ################################################################################ +# generate .dot files for module graphs + +JAVADOC_MODULE_GRAPHS_DIR := $(SUPPORT_OUTPUTDIR)/docs/module-graphs +JAVADOC_MODULE_GRAPHS := $(JAVADOC_MODULE_GRAPHS_DIR)/java.se.dot +JAVADOC_MODULE_GRAPHS_PROPS := $(JDK_TOPDIR)/make/src/classes/build/tools/jigsaw/javadoc-graphs.properties + +$(JAVADOC_MODULE_GRAPHS): $(BUILD_JIGSAW_TOOLS) $(JAVADOC_MODULE_GRAPHS_PROPS) + $(MKDIR) -p $(@D) + $(TOOL_GENGRAPHS) --spec --output $(JAVADOC_MODULE_GRAPHS_DIR) \ + --dot-attributes $(JAVADOC_MODULE_GRAPHS_PROPS) + +MODULE_GRAPH_TARGETS += $(JAVADOC_MODULE_GRAPHS) + +################################################################################ # Hook to include the corresponding custom file, if present. $(eval $(call IncludeCustomExtension, , Javadoc.gmk)) ################################################################################ +docs-module-graphs: $(MODULE_GRAPH_TARGETS) + docs-javadoc: $(TARGETS) docs-copy: $(COPY_TARGETS) docs-zip: $(ZIP_TARGETS) -all: docs-javadoc docs-copy docs-zip +all: docs-module-graphs docs-javadoc docs-copy docs-zip -.PHONY: default all docs-javadoc docs-copy docs-zip +.PHONY: default all docs-module-graphs docs-javadoc docs-copy docs-zip diff -r 18569c523d38 -r c61cc8a34456 make/Main.gmk --- a/make/Main.gmk Sat Apr 08 03:25:14 2017 +0000 +++ b/make/Main.gmk Wed Jul 05 23:09:40 2017 +0200 @@ -363,6 +363,9 @@ ################################################################################ # Docs targets +docs-module-graphs: + +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-module-graphs) + docs-javadoc: +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-javadoc) @@ -375,7 +378,7 @@ update-build-docs: +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f UpdateBuildDocs.gmk) -ALL_TARGETS += docs-javadoc docs-copy docs-zip update-build-docs +ALL_TARGETS += docs-module-graphs docs-javadoc docs-copy docs-zip update-build-docs ################################################################################ # Cross compilation support @@ -772,6 +775,8 @@ bootcycle-images: jdk-image + docs-module-graphs: exploded-image buildtools-modules + docs-javadoc: $(GENSRC_TARGETS) rmic # The gensrc step for jdk.jdi creates an html file that is used by docs-copy. @@ -929,7 +934,7 @@ endif # This target builds the documentation image -docs-image: docs-javadoc docs-copy +docs-image: docs-module-graphs docs-javadoc docs-copy # This target builds the test image test-image: prepare-test-image test-image-hotspot-jtreg-native \ diff -r 18569c523d38 -r c61cc8a34456 make/common/MakeBase.gmk --- a/make/common/MakeBase.gmk Sat Apr 08 03:25:14 2017 +0000 +++ b/make/common/MakeBase.gmk Wed Jul 05 23:09:40 2017 +0200 @@ -355,17 +355,28 @@ ################################################################################ define SetupLogging + ifeq ($$(LOG_PROFILE_TIMES_FILE), true) + ifeq ($$(IS_GNU_TIME), yes) + SHELL := $$(BASH) $$(SRC_ROOT)/common/bin/shell-profiler.sh \ + gnutime $$(TIME) \ + $$(OUTPUT_ROOT)/build-profile.log $$(SHELL) + else ifneq ($$(FLOCK), ) + SHELL := $$(BASH) $$(SRC_ROOT)/common/bin/shell-profiler.sh \ + flock $$(FLOCK) \ + $$(OUTPUT_ROOT)/build-profile.log $$(SHELL) + endif + endif + ifeq ($$(LOG_LEVEL), trace) + SHELL_NO_RECURSE := $$(SHELL) # Shell redefinition trick inspired by http://www.cmcrossroads.com/ask-mr-make/6535-tracing-rule-execution-in-gnu-make # For each target executed, will print # Building (from ) ( newer) # but with a limit of 20 on , to avoid cluttering logs too much # (and causing a crash on Cygwin). - # Default shell seems to always be /bin/sh. Must override with bash to get this to work on Solaris. - # Only use time if it's GNU time which supports format and output file. - WRAPPER_SHELL := $$(BASH) $$(SRC_ROOT)/common/bin/shell-tracer.sh $$(if $$(findstring yes,$$(IS_GNU_TIME)),$$(TIME),-) $$(OUTPUT_ROOT)/build-trace-time.log $$(SHELL) - SHELL = $$(warning $$(if $$@,Building $$@,Running shell command) $$(if $$<, (from $$<))$$(if $$?, ($$(wordlist 1, 20, $$?) $$(if $$(wordlist 21, 22, $$?), ... [in total $$(words $$?) files]) newer)))$$(WRAPPER_SHELL) + SHELL = $$(warning $$(if $$@,Building $$@,Running shell command) $$(if $$<, (from $$<))$$(if $$?, ($$(wordlist 1, 20, $$?) $$(if $$(wordlist 21, 22, $$?), ... [in total $$(words $$?) files]) newer)))$$(SHELL_NO_RECURSE) -x endif + # The warn level can never be turned off LogWarn = $$(info $$(strip $$1)) LOG_WARN := diff -r 18569c523d38 -r c61cc8a34456 nashorn/.hgtags --- a/nashorn/.hgtags Sat Apr 08 03:25:14 2017 +0000 +++ b/nashorn/.hgtags Wed Jul 05 23:09:40 2017 +0200 @@ -396,3 +396,6 @@ d75af059cff651c1b5cccfeb4c9ea8d054b28cfd jdk-9+159 9d4dbb8cbe7ce321c6e9e34dc9e0974760710907 jdk-9+160 d6ef419af865dccf1e5be8047b0aba09286ffa93 jdk-9+161 +2cd29b339692524de64d049b329873facaff9727 jdk-9+162 +5e5e436543daea0c174d878d5e3ff8dd791e538a jdk-9+163 +b473fab09baab51a06ffba02eb06c7f5ee8578f7 jdk-9+164